import { calculateComposite } from '../src/services/composite-score';
import { getPiffPropsForGame, loadTodaysPiffProps } from '../src/services/piff';
import { getDigimonForGame, loadTodaysDigimonPicks } from '../src/services/digimon';
import { getDvpForMatchup } from '../src/services/dvp';
import { getKenPomMatchup } from '../src/services/kenpom';
import pool from '../src/db';

async function main() {
  const { rows } = await pool.query(`
    SELECT id, event_id, league, home_team, away_team,
           forecast_data->>'confidence' as grok_conf,
           forecast_data->>'value_rating' as value_rating
    FROM rm_forecast_cache WHERE created_at::date = CURRENT_DATE
  `);

  const piffMap = loadTodaysPiffProps();
  const digiMap = loadTodaysDigimonPicks();
  let updated = 0;

  for (const row of rows) {
    // Look up short names from rm_events
    const { rows: evRows } = await pool.query(
      'SELECT home_short, away_short FROM rm_events WHERE event_id = $1', [row.event_id]
    );
    const hs = evRows[0]?.home_short || '';
    const as2 = evRows[0]?.away_short || '';

    const skipPiff = row.league === 'ncaab';
    const piffProps = hs && as2 && !skipPiff
      ? getPiffPropsForGame(hs, as2, piffMap, row.league)
      : [];
    const digimonPicks = hs && as2 && row.league === 'nba'
      ? getDigimonForGame(hs, as2, digiMap)
      : [];
    const dvpData = await getDvpForMatchup(hs, as2, row.league);

    let kenpomMatchup = null;
    if (row.league === 'ncaab') {
      try { kenpomMatchup = await getKenPomMatchup(row.home_team, row.away_team, 'ncaab'); } catch {}
    }

    const composite = calculateComposite({
      grokConfidence: parseFloat(row.grok_conf) || 0.5,
      grokValueRating: parseInt(row.value_rating) || 5,
      piffProps,
      digimonPicks,
      dvp: dvpData,
      league: row.league,
      kenpomMatchup,
    });

    await pool.query(
      'UPDATE rm_forecast_cache SET composite_confidence = $1, model_signals = $2, composite_version = $3 WHERE id = $4',
      [composite.compositeConfidence, JSON.stringify(composite), composite.compositeVersion, row.id]
    );
    updated++;
  }

  console.log(`Updated ${updated} forecasts with v2 composite scoring`);

  // Show the new distribution
  const { rows: dist } = await pool.query(`
    SELECT event_id, league, composite_confidence, composite_version,
           model_signals->'edgeBreakdown'->>'piffScore' as piff_score,
           model_signals->'edgeBreakdown'->>'grokScore' as grok_score
    FROM rm_forecast_cache WHERE created_at::date = CURRENT_DATE
    ORDER BY composite_confidence DESC LIMIT 20
  `);
  console.log('\nTop 20 by composite (v2):');
  for (const r of dist) {
    const conf = (parseFloat(r.composite_confidence) * 100).toFixed(1);
    console.log(`${r.event_id.padEnd(35)} ${r.league.padEnd(8)} conf=${conf}% grok=${r.grok_score} piff=${r.piff_score} v=${r.composite_version}`);
  }

  await pool.end();
}

main().catch(err => { console.error(err); process.exit(1); });
