import { format } from 'date-fns';

// The backend stores and computes every train schedule in Ethiopian time (EAT -
// UTC+3) — see apps/edr-passenger-api's timezone.utils.ts and main.ts, which pin the
// server process to this zone. The frontend previously formatted dates using
// whatever timezone the viewing/generating device happened to be set to, which made
// the on-screen booking pages and the downloaded voucher PDF disagree (by exactly
// the device's offset from EAT) whenever that device wasn't itself in EAT. Pinning
// every display here to the same explicit zone makes them agree by construction.
const APP_TIMEZONE = 'Africa/Addis_Ababa';

// date-fns' `format()` always reads the Date object's LOCAL (device) getters — it has
// no built-in timezone conversion. This shifts the Date so those local getters report
// the wall-clock time in `timeZone` instead of the device's own zone, so `format()`
// calls (here and at other call sites formatting journey times) produce EAT-correct
// output regardless of the device. Exported for pages that call date-fns' `format()`
// directly instead of going through the helpers below.
export function toZonedDate(date: Date, timeZone: string = APP_TIMEZONE): Date {
  return new Date(date.toLocaleString('en-US', { timeZone }));
}

export const formatCurrency = (amount: number, currency: string = 'ETB'): string => {
  return new Intl.NumberFormat('en-US', {
    style: 'currency',
    currency,
    minimumFractionDigits: 2,
  }).format(amount / 100);
};

export const formatDate = (date: string | Date, formatStr: string = 'MMM dd, yyyy'): string => {
  return format(toZonedDate(new Date(date), APP_TIMEZONE), formatStr);
};

export const formatDateTime = (date: string | Date): string => {
  return format(toZonedDate(new Date(date), APP_TIMEZONE), 'MMM dd, yyyy h:mm a');
};

export const formatTime = (date: string | Date): string => {
  return format(toZonedDate(new Date(date), APP_TIMEZONE), 'h:mm a');
};

export const getTimePeriod = (date: string | Date): string => {
  const hour = toZonedDate(new Date(date), APP_TIMEZONE).getHours();
  if (hour >= 5 && hour < 12) return 'Morning';
  if (hour >= 12 && hour < 17) return 'Afternoon';
  if (hour >= 17 && hour < 21) return 'Evening';
  return 'Night';
};
