/*
 * 공개 사이트 표시 포맷 헬퍼 — 날짜·D-day·상태 파생(프론트 재계산 규칙).
 * status 는 event.status DB 원문 대신 날짜 기준으로 재판정한다(EventCatalogMapper 규약과 동일).
 */
export type PublicStatus = 'ongoing' | 'upcoming' | 'ended';

function parse(d: string | null | undefined): Date | null {
  if (!d) return null;
  const dt = new Date(`${d}T00:00:00`);
  return Number.isNaN(dt.getTime()) ? null : dt;
}

function today0(): Date {
  const t = new Date();
  return new Date(t.getFullYear(), t.getMonth(), t.getDate());
}

/** 날짜 기준 상태 재계산 — ended=종료<오늘, ongoing=시작≤오늘≤종료, upcoming=시작>오늘. */
export function deriveStatus(startDate: string | null, endDate: string | null): PublicStatus {
  const s = parse(startDate);
  const e = parse(endDate) ?? s;
  const now = today0();
  if (e && e < now) return 'ended';
  if (s && s <= now && (e ?? s) >= now) return 'ongoing';
  return 'upcoming';
}

/** 시작일까지 남은 일수(D-day). 과거면 0 이하. */
export function dday(startDate: string | null): number {
  const s = parse(startDate);
  if (!s) return 0;
  const ms = s.getTime() - today0().getTime();
  return Math.round(ms / 86_400_000);
}

/** "2026.08.18 – 08.21"(같은 해면 뒤는 월·일만). */
export function formatRange(startDate: string | null, endDate: string | null): string {
  const s = parse(startDate);
  const e = parse(endDate);
  const pad = (n: number) => String(n).padStart(2, '0');
  if (!s) return '일정 미정';
  const sStr = `${s.getFullYear()}.${pad(s.getMonth() + 1)}.${pad(s.getDate())}`;
  if (!e) return sStr;
  const sameYear = e.getFullYear() === s.getFullYear();
  const eStr = sameYear
    ? `${pad(e.getMonth() + 1)}.${pad(e.getDate())}`
    : `${e.getFullYear()}.${pad(e.getMonth() + 1)}.${pad(e.getDate())}`;
  return `${sStr} – ${eStr}`;
}

/** 사용자 노출용 오류 메시지(민감정보 없음). */
export function errorMessage(e: unknown): string {
  if (e && typeof e === 'object' && 'message' in e && typeof (e as { message: unknown }).message === 'string') {
    return (e as { message: string }).message;
  }
  return '요청을 처리하지 못했습니다. 잠시 후 다시 시도해 주세요.';
}
