const DATE_ONLY_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/;

export function parseDateValue(value?: string | null): Date | undefined {
  if (typeof value !== 'string') return undefined;
  const clean = value.trim();
  if (!clean) return undefined;

  const dateOnlyMatch = DATE_ONLY_PATTERN.exec(clean);
  if (dateOnlyMatch) {
    const year = Number(dateOnlyMatch[1]);
    const monthIndex = Number(dateOnlyMatch[2]) - 1;
    const day = Number(dateOnlyMatch[3]);
    const date = new Date(year, monthIndex, day);
    if (date.getFullYear() === year && date.getMonth() === monthIndex && date.getDate() === day) return date;
    return undefined;
  }

  const date = new Date(clean);
  return Number.isNaN(date.getTime()) ? undefined : date;
}

export function firstValidDateString(...values: Array<string | null | undefined>): string | undefined {
  return values.find(value => Boolean(parseDateValue(value)))?.trim();
}

export function timestampFromDateCandidates(...values: Array<string | null | undefined>): number {
  for (const value of values) {
    const date = parseDateValue(value);
    if (date) return date.getTime();
  }
  return 0;
}

export function localCalendarOrdinal(date: Date): number {
  return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) / 86_400_000;
}
