import type { TbankCandle, TbankTimestamp, } from '../../../../integrations/tbank/tbank.api'; import { ISO_DATE_LENGTH, ISO_DATE_START, MILLISECONDS_PER_SECOND } from '../../../../common/time'; const MIN_TIMESTAMP_SECONDS_EXCLUSIVE = 0; const MOSCOW_OFFSET_MS = 10_800_000; export function timestamp(value?: TbankTimestamp): null | string { const seconds = Number(value?.seconds); return Number.isFinite(seconds) && seconds > MIN_TIMESTAMP_SECONDS_EXCLUSIVE ? new Date(seconds * MILLISECONDS_PER_SECOND).toISOString() : null; } export function moscowDay(iso: string): string { return new Date(Date.parse(iso) + MOSCOW_OFFSET_MS) .toISOString() .slice(ISO_DATE_START, ISO_DATE_LENGTH); } export function previousClose( candles: TbankCandle[], priceAt: string, ): null | TbankCandle { return ( candles .filter((candle) => { const time = timestamp(candle.time); return ( candle.isComplete && candle.close && time && time.slice(ISO_DATE_START, ISO_DATE_LENGTH) < moscowDay(priceAt) ); }) .sort((a, b) => Number(b.time?.seconds) - Number(a.time?.seconds))[0] ?? null ); }