import 'dotenv/config';
import crypto from 'crypto';
import pool from '../db';
import { getAllRainMen } from '../models/user';
import {
  getMlbAlertAssets,
  getMlbZeroCandidateIssues,
  summarizeMlbAlertAssets,
  summarizeMlbZeroCandidateIssues,
} from '../services/mlb-alerts';
import { sendMlbAlertDigestEmail } from '../services/email';

function getDateET(): string {
  return new Date().toLocaleDateString('en-CA', { timeZone: 'America/New_York' });
}

async function ensureNotificationTable(): Promise<void> {
  await pool.query(`
    CREATE TABLE IF NOT EXISTS rm_operational_alert_notifications (
      id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
      date_et DATE NOT NULL,
      alert_type VARCHAR(50) NOT NULL,
      recipient_email VARCHAR(255) NOT NULL,
      payload_hash VARCHAR(64) NOT NULL,
      delivery_status VARCHAR(20) NOT NULL DEFAULT 'SENT',
      metadata JSONB,
      sent_at TIMESTAMPTZ DEFAULT NOW(),
      UNIQUE (date_et, alert_type, recipient_email, payload_hash)
    )
  `);
}

async function main() {
  const dateET = process.argv[2] || getDateET();
  await ensureNotificationTable();

  const assets = await getMlbAlertAssets(dateET);
  const issues = await getMlbZeroCandidateIssues(dateET);
  const summary = summarizeMlbAlertAssets(assets);
  const issueSummary = summarizeMlbZeroCandidateIssues(issues);

  if (summary.total_assets === 0 && issueSummary.total_games === 0) {
    console.log(JSON.stringify({ date_et: dateET, notified: 0, reason: 'no_alerts' }, null, 2));
    await pool.end();
    process.exit(0);
  }

  const rainMen = await getAllRainMen();
  if (rainMen.length === 0) {
    console.log(JSON.stringify({ date_et: dateET, notified: 0, reason: 'no_admin_recipients' }, null, 2));
    await pool.end();
    process.exit(summary.critical_assets > 0 ? 2 : 1);
  }

  const payloadHash = crypto
    .createHash('sha256')
    .update(JSON.stringify({ dateET, summary, issueSummary, issues, assets }))
    .digest('hex');

  let notified = 0;
  for (const user of rainMen) {
    if (!user.email) continue;

    const existing = await pool.query(
      `SELECT id FROM rm_operational_alert_notifications
       WHERE date_et = $1::date
         AND alert_type = 'mlb_operational_alert'
         AND recipient_email = $2
         AND payload_hash = $3
       LIMIT 1`,
      [dateET, user.email, payloadHash],
    );
    if (existing.rows.length > 0) continue;

    await sendMlbAlertDigestEmail(user.email, { dateET, summary, issueSummary, issues, assets });
    await pool.query(
      `INSERT INTO rm_operational_alert_notifications
         (date_et, alert_type, recipient_email, payload_hash, delivery_status, metadata)
       VALUES ($1::date, 'mlb_operational_alert', $2, $3, 'SENT', $4)`,
      [dateET, user.email, payloadHash, JSON.stringify({ summary, issueSummary })],
    );
    notified += 1;
  }

  console.log(JSON.stringify({ date_et: dateET, notified, summary, issue_summary: issueSummary }, null, 2));
  await pool.end();
  process.exit(summary.critical_assets > 0 || (issueSummary.by_issue_type.missing_feed || 0) > 0 || (issueSummary.by_issue_type.upstream_team_mismatch || 0) > 0 ? 2 : 1);
}

if (require.main === module) {
  main().catch(async (err) => {
    console.error('[mlb-alert-notifier] Fatal:', err);
    await pool.end().catch(() => {});
    process.exit(1);
  });
}
