import 'dotenv/config';
import pool from '../db';

export async function repairLegacyAccuracyV1(options: { closePool?: boolean } = {}) {
  const { closePool = false } = options;
  console.log(`[${new Date().toISOString()}] Repairing legacy rm_forecast_accuracy from v2...`);

  const { rows } = await pool.query(
    `WITH repaired AS (
       UPDATE rm_forecast_accuracy v1
       SET predicted_winner = COALESCE(v1.predicted_winner, v2.predicted_winner),
           actual_winner = COALESCE(v1.actual_winner, v2.actual_winner),
           predicted_spread = COALESCE(v1.predicted_spread, v2.predicted_spread),
           actual_spread = COALESCE(v1.actual_spread, v2.actual_spread),
           predicted_total = COALESCE(v1.predicted_total, v2.predicted_total),
           actual_total = COALESCE(v1.actual_total, v2.actual_total),
           accuracy_bucket = COALESCE(v1.accuracy_bucket, v2.accuracy_bucket),
           accuracy_pct = COALESCE(v1.accuracy_pct, v2.accuracy_pct),
           resolved_at = COALESCE(v1.resolved_at, v2.resolved_at),
           event_date = COALESCE(v1.event_date, v2.event_date),
           home_score = COALESCE(v1.home_score, v2.home_score),
           away_score = COALESCE(v1.away_score, v2.away_score),
           original_forecast = COALESCE(v1.original_forecast, v2.original_forecast),
           benchmark_forecast = COALESCE(v1.benchmark_forecast, v2.benchmark_forecast),
           closing_market = COALESCE(v1.closing_market, v2.closing_market),
           benchmark_source = COALESCE(v1.benchmark_source, v2.benchmark_source),
           final_grade = COALESCE(v1.final_grade, v2.final_grade),
           grading_policy = COALESCE(v1.grading_policy, v2.grading_policy),
           forecast_type = COALESCE(v1.forecast_type, v2.forecast_type)
       FROM rm_forecast_accuracy_v2 v2
       WHERE (
           (v1.forecast_id IS NOT NULL AND v1.forecast_id = v2.forecast_id)
           OR v1.event_id = v2.event_id
         )
         AND (
           v1.forecast_type IS NULL
           OR (v1.actual_winner IS NOT NULL AND v1.final_grade IS NULL)
           OR (v1.home_score IS NULL AND v2.home_score IS NOT NULL)
           OR (v1.away_score IS NULL AND v2.away_score IS NOT NULL)
         )
       RETURNING v1.id
     )
     SELECT COUNT(*)::int AS repaired_count FROM repaired`,
  );

  const repairedCount = Number(rows[0]?.repaired_count || 0);
  console.log(`[legacy-v1-repair] Updated ${repairedCount} legacy rows`);

  if (closePool) {
    await pool.end().catch(() => undefined);
  }

  return repairedCount;
}

async function main() {
  await repairLegacyAccuracyV1({ closePool: true });
}

if (require.main === module) {
  main().catch((err) => {
    console.error('[legacy-v1-repair] Fatal error:', err);
    process.exit(1);
  });
}
