/** Day-key helpers ("YYYY-MM-DD") — pure, deterministic, safe in Convex functions. */
export const DAY_MS = 86_400_000;

export function parseKey(k: string): Date {
  const [y, m, d] = k.split("-").map(Number);
  return new Date(Date.UTC(y, m - 1, d));
}
export function toKey(d: Date): string {
  return d.toISOString().slice(0, 10);
}
export function addDaysKey(k: string, n: number): string {
  return toKey(new Date(parseKey(k).getTime() + n * DAY_MS));
}
export function nightsBetweenKeys(a: string, b: string): number {
  return Math.round((parseKey(b).getTime() - parseKey(a).getTime()) / DAY_MS);
}
/** Today's day key in a timezone. */
export function todayKey(tz = "Africa/Casablanca", now = new Date()): string {
  const parts = new Intl.DateTimeFormat("en-CA", { timeZone: tz, year: "numeric", month: "2-digit", day: "2-digit" }).formatToParts(now);
  const get = (t: string) => parts.find((p) => p.type === t)?.value ?? "01";
  return `${get("year")}-${get("month")}-${get("day")}`;
}
export function maxKey(a: string, b: string) {
  return a > b ? a : b;
}
export function minKey(a: string, b: string) {
  return a < b ? a : b;
}
/** Occupied nights of [checkIn, checkOut) inside [from, to). */
export function nightsIn(checkIn: string, checkOut: string, from: string, to: string): number {
  const a = maxKey(checkIn, from);
  const b = minKey(checkOut, to);
  return b > a ? nightsBetweenKeys(a, b) : 0;
}
export function eachNightKey(checkIn: string, checkOut: string): string[] {
  const out: string[] = [];
  for (let k = checkIn; k < checkOut; k = addDaysKey(k, 1)) out.push(k);
  return out;
}
export function weekdayOf(k: string): number {
  return parseKey(k).getUTCDay();
}
export function startOfMonthKey(k: string): string {
  return `${k.slice(0, 7)}-01`;
}
export function addMonthsKey(k: string, n: number): string {
  const d = parseKey(k);
  return toKey(new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + n, d.getUTCDate())));
}
export function startOfYearKey(k: string): string {
  return `${k.slice(0, 4)}-01-01`;
}
export function startOfWeekKey(k: string): string {
  const d = parseKey(k);
  const day = (d.getUTCDay() + 6) % 7; // Monday = 0
  return addDaysKey(k, -day);
}
