import pool from '../src/db/index';
import { buildSportsResultsRecapPrompt, type SportsResultsRecapRow } from '../src/services/sports-results-recap-prompt';

type Args = {
  league: string;
  limit: number;
  clipSeconds: number;
  clipCount: number;
  aspectRatio: string;
  date: string;
  json: boolean;
};

function parseArgs(argv: string[]): Args {
  const args: Args = {
    league: 'all',
    limit: 8,
    clipSeconds: 8,
    clipCount: 4,
    aspectRatio: '9:16',
    date: getYesterdayEtDate(),
    json: false,
  };

  for (let index = 0; index < argv.length; index += 1) {
    const token = argv[index];
    const next = argv[index + 1];
    if (token === '--league' && next) {
      args.league = next;
      index += 1;
    } else if (token === '--limit' && next) {
      args.limit = Math.max(1, Math.min(20, Number(next) || 8));
      index += 1;
    } else if (token === '--clip-seconds' && next) {
      args.clipSeconds = Number(next) || 8;
      index += 1;
    } else if (token === '--clip-count' && next) {
      args.clipCount = Number(next) || 4;
      index += 1;
    } else if (token === '--aspect-ratio' && next) {
      args.aspectRatio = next;
      index += 1;
    } else if (token === '--date' && next) {
      args.date = next;
      index += 1;
    } else if (token === '--json') {
      args.json = true;
    }
  }

  return args;
}

function getYesterdayEtDate(): string {
  const now = new Date();
  const etString = new Intl.DateTimeFormat('en-CA', {
    timeZone: 'America/New_York',
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
  }).format(now);
  const [year, month, day] = etString.split('-').map(Number);
  const etMidnightUtc = new Date(Date.UTC(year, (month || 1) - 1, day || 1));
  etMidnightUtc.setUTCDate(etMidnightUtc.getUTCDate() - 1);
  return etMidnightUtc.toISOString().slice(0, 10);
}

async function fetchSettledForecasts(args: Args): Promise<SportsResultsRecapRow[]> {
  const normalizedLeague = String(args.league || 'all').trim().toLowerCase();
  const leagueFilter = normalizedLeague === 'all' ? null : normalizedLeague;
  const result = await pool.query(
    `SELECT
       league,
       home_team AS "homeTeam",
       away_team AS "awayTeam",
       winner_pick AS "winnerPick",
       outcome,
       actual_winner AS "actualWinner",
       actual_score AS "actualScore",
       settled_at AS "settledAt"
     FROM rm_archived_forecasts
     WHERE outcome IN ('win', 'loss')
       AND ($1::text IS NULL OR league = $1)
       AND (settled_at AT TIME ZONE 'America/New_York')::date = $2::date
     ORDER BY settled_at DESC
     LIMIT $3`,
    [leagueFilter, args.date, args.limit],
  );

  return result.rows as SportsResultsRecapRow[];
}

async function main(): Promise<void> {
  const args = parseArgs(process.argv.slice(2));
  try {
    const rows = await fetchSettledForecasts(args);
    if (rows.length === 0) {
      throw new Error(`No settled recap rows found for ${args.league} on ${args.date}`);
    }

    const result = buildSportsResultsRecapPrompt(rows, {
      clipSeconds: args.clipSeconds,
      clipCount: args.clipCount,
      aspectRatio: args.aspectRatio,
      recapDate: args.date,
    });

    if (args.json) {
      console.log(JSON.stringify(result, null, 2));
      return;
    }

    console.log(result.prompt);
  } finally {
    await pool.end();
  }
}

main().catch((error) => {
  console.error(error instanceof Error ? error.message : String(error));
  process.exit(1);
});
