import { isEuLeague } from './scheduler-config';

function readPositiveInt(name: string, fallback: number): number {
  const raw = Number(process.env[name]);
  if (!Number.isFinite(raw) || raw < 0) return fallback;
  return Math.floor(raw);
}

export const EU_EVENT_LOOKAHEAD_DAYS = readPositiveInt('EU_EVENT_LOOKAHEAD_DAYS', 14);

function parseEtDateKey(key: string): number {
  const [year, month, day] = key.split('-').map((part) => Number(part));
  return Date.UTC(year, month - 1, day);
}

export function getEtDateKey(value: string | Date): string | null {
  const date = value instanceof Date ? value : new Date(value);
  if (!Number.isFinite(date.getTime())) return null;
  return new Intl.DateTimeFormat('en-CA', { timeZone: 'America/New_York' }).format(date);
}

export function getCurrentEtDateKey(now: Date = new Date()): string {
  return getEtDateKey(now) || new Intl.DateTimeFormat('en-CA', { timeZone: 'America/New_York' }).format(now);
}

export function getLeagueLookaheadDays(league: string, euDays: number, defaultDays = 0): number {
  return isEuLeague(league) ? euDays : defaultDays;
}

export function isLeagueEventInWindow(
  league: string,
  startsAt: string | Date,
  euDays: number,
  now: Date = new Date(),
  defaultDays = 0,
): boolean {
  const eventDateKey = getEtDateKey(startsAt);
  const todayDateKey = getEtDateKey(now);
  if (!eventDateKey || !todayDateKey) return false;

  const diffDays = Math.round((parseEtDateKey(eventDateKey) - parseEtDateKey(todayDateKey)) / 86_400_000);
  const lookaheadDays = getLeagueLookaheadDays(league, euDays, defaultDays);
  return diffDays >= 0 && diffDays <= lookaheadDays;
}

export function isLeagueDateKeyInWindow(
  league: string,
  eventDateKey: string,
  euDays: number,
  now: Date = new Date(),
  defaultDays = 0,
): boolean {
  const todayDateKey = getEtDateKey(now);
  if (!eventDateKey || !todayDateKey) return false;

  const diffDays = Math.round((parseEtDateKey(eventDateKey) - parseEtDateKey(todayDateKey)) / 86_400_000);
  const lookaheadDays = getLeagueLookaheadDays(league, euDays, defaultDays);
  return diffDays >= 0 && diffDays <= lookaheadDays;
}
