/**
 * v0.2.11 Cut D — FTS5 검색 + 회고 view 의 순수 함수 헬퍼.
 */

import { KST_OFFSET_MS } from '../../shared/util/kstDate.js';

const FTS5_SPECIAL_CHARS_RE = /["*():]/g;
const WS_COLLAPSE_RE = /\s+/g;

/**
 * FTS5 MATCH 쿼리에 안전한 형태로 변환. " * ( ) : 제거 + 공백 정리.
 * 다중 토큰은 그대로 두어 FTS5 implicit AND 활용.
 */
export function sanitizeFtsQuery(input: string): string {
  return input.replace(FTS5_SPECIAL_CHARS_RE, ' ').replace(WS_COLLAPSE_RE, ' ').trim();
}

export type ReviewPeriod = 'daily' | 'weekly' | 'monthly';

/**
 * 회고 cutoff = period 시작점의 KST 자정 (UTC ISO).
 * daily = 오늘 0시, weekly = 7일 전 0시, monthly = 30일 전 0시.
 */
export function computeCutoff(period: ReviewPeriod, now: Date): string {
  const kstNow = new Date(now.getTime() + KST_OFFSET_MS);
  const y = kstNow.getUTCFullYear();
  const m = kstNow.getUTCMonth();
  const d = kstNow.getUTCDate();
  const todayMidKstUtc = Date.UTC(y, m, d) - KST_OFFSET_MS;
  const days = period === 'daily' ? 0 : period === 'weekly' ? 7 : 30;
  return new Date(todayMidKstUtc - days * 24 * 60 * 60 * 1000).toISOString();
}
