import { matchCurrentEvent, type TheOddsCurrentEvent } from './the-odds';

const MAX_START_TIME_DELTA_MS = 90 * 60 * 1000;

export function normalizeEventStartTime(startsAt: string | Date): string {
  const parsed = startsAt instanceof Date ? new Date(startsAt.getTime()) : new Date(startsAt);
  if (!Number.isFinite(parsed.getTime())) {
    return startsAt instanceof Date ? startsAt.toISOString() : startsAt;
  }
  parsed.setUTCSeconds(0, 0);
  return parsed.toISOString();
}

export function reconcileStartTimeFromCurrentOdds(params: {
  homeTeam: string;
  awayTeam: string;
  startsAt: string;
  currentEvents: TheOddsCurrentEvent[];
  maxDeltaMs?: number;
}): { startsAt: string; reconciled: boolean; deltaMs: number | null } {
  const normalizedStartsAt = normalizeEventStartTime(params.startsAt);
  const matched = matchCurrentEvent(params.currentEvents, {
    homeTeam: params.homeTeam,
    awayTeam: params.awayTeam,
    startsAt: normalizedStartsAt,
  });

  if (!matched) {
    return {
      startsAt: normalizedStartsAt,
      reconciled: false,
      deltaMs: null,
    };
  }

  const matchedStartsAt = normalizeEventStartTime(matched.commence_time);
  const deltaMs = Math.abs(new Date(matchedStartsAt).getTime() - new Date(normalizedStartsAt).getTime());
  const maxDeltaMs = params.maxDeltaMs ?? MAX_START_TIME_DELTA_MS;

  if (!Number.isFinite(deltaMs) || deltaMs > maxDeltaMs) {
    return {
      startsAt: normalizedStartsAt,
      reconciled: false,
      deltaMs: Number.isFinite(deltaMs) ? deltaMs : null,
    };
  }

  return {
    startsAt: matchedStartsAt,
    reconciled: matchedStartsAt !== normalizedStartsAt,
    deltaMs,
  };
}
