/**
 * One-shot test of the Blog Breakdown pipeline.
 * Usage: npx tsx src/twitter/test-breakdown.ts [--post]
 *
 * Without --post: generates blog + pick, builds tweet text, but does NOT post to X.
 * With --post:    also posts the tweet to X for real.
 */
import dotenv from 'dotenv';
dotenv.config({ path: '/var/www/html/sportsclaw-guru/backend/.env' });

import { enrichGameData } from '../seo/data-enrichment';
import { getUpcomingGames, getActiveLeagues } from '../seo/data-queries';
import { orchestrateBreakdown } from './blog-breakdown';
import { postTweet } from './services/twitter-api.service';
import { insertTweet, updateTweetPosted } from './twitter-data-queries';
import { updatePickXPost, updateBlogXPostLink } from './breakdown-data-queries';
import type { PickDetails } from './types';

function getETDate(): Date {
  const etDateStr = new Date().toLocaleDateString('en-CA', { timeZone: 'America/New_York' });
  return new Date(etDateStr + 'T12:00:00');
}

function normalizeTeamName(name: string): string {
  return name.toLowerCase().trim().replace(/[^a-z0-9\s]/g, '').replace(/\s+/g, '-');
}

function buildGameKey(league: string, away: string, home: string): string {
  return `${league.toLowerCase()}:${normalizeTeamName(away)}@${normalizeTeamName(home)}`;
}

async function main() {
  const shouldPost = process.argv.includes('--post');
  console.log(`\n=== Blog Breakdown Test ===`);
  console.log(`Mode: ${shouldPost ? 'LIVE (will post to X)' : 'DRY RUN (no X post)'}\n`);

  // 1. Find a real upcoming game with odds
  const today = getETDate();
  const leagues = await getActiveLeagues();
  console.log(`Active leagues: ${leagues.join(', ')}`);

  let game: any = null;
  let league = '';
  for (const l of leagues) {
    const games = await getUpcomingGames(l, today);
    const withOdds = games.filter(g => g.moneylineHome != null && g.homeTeam && g.awayTeam);
    if (withOdds.length > 0) {
      game = withOdds[0];
      league = l;
      break;
    }
  }

  if (!game) {
    console.log('No upcoming games with odds found for today. Cannot test.');
    process.exit(0);
  }

  console.log(`Selected game: ${game.awayTeam} @ ${game.homeTeam} (${league})`);
  console.log(`Spread: ${game.spreadHome} | Total: ${game.total} | ML: ${game.moneylineHome}/${game.moneylineAway}\n`);

  // 2. Enrich
  console.log('Enriching game data...');
  const enriched = await enrichGameData(game);
  console.log(`  Home form: ${enriched.homeForm.record}, avg ${enriched.homeForm.avgPts}ppg`);
  console.log(`  Away form: ${enriched.awayForm.record}, avg ${enriched.awayForm.avgPts}ppg`);
  console.log(`  Injuries: ${enriched.injuries.length}`);
  console.log(`  Model pick: ${enriched.modelPick?.pick || 'none'}\n`);

  // 3. Build pick details
  const gameKey = buildGameKey(league, game.awayTeam, game.homeTeam);
  const pickDir = enriched.modelPick?.pick?.toLowerCase().includes(game.homeTeam?.toLowerCase())
    ? 'home'
    : 'away';
  const selection = pickDir === 'home'
    ? `${enriched.homeTeamFull} ${enriched.consensus.spread ?? ''}`
    : `${enriched.awayTeamFull} ${enriched.consensus.spread ? (enriched.consensus.spread * -1) : ''}`;

  const pickDetails: PickDetails = {
    gameKey,
    league,
    pickType: 'spread',
    selection: selection.trim(),
    pickDirection: pickDir,
    lineValue: enriched.consensus.spread ?? undefined,
    oddsAmerican: pickDir === 'home' ? (enriched.consensus.homeML ?? undefined) : (enriched.consensus.awayML ?? undefined),
    confidence: enriched.modelPick?.confidence || 'Medium',
    edgePct: enriched.modelPick?.edge,
    shortReason: enriched.modelPick?.reasoning || `${enriched.homeTeamFull} ${enriched.homeForm.record} home form edges ${enriched.awayTeamFull} ${enriched.awayForm.record}`,
    gameDate: enriched.gameDate,
  };

  console.log(`Pick: ${pickDetails.selection} (${pickDetails.pickDirection})`);
  console.log(`Confidence: ${pickDetails.confidence} | Edge: ${pickDetails.edgePct ?? 'N/A'}%\n`);

  // 4. Run the breakdown pipeline
  console.log('Running orchestrateBreakdown...');
  const startTime = Date.now();
  const result = await orchestrateBreakdown(enriched, pickDetails);
  const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);

  if (!result) {
    console.log(`\nBreakdown FAILED after ${elapsed}s. Check logs for details.`);
    process.exit(1);
  }

  console.log(`\nBreakdown SUCCESS in ${elapsed}s:`);
  console.log(`  Blog post ID: ${result.blogPostId}`);
  console.log(`  Blog URL: ${result.blogUrl}`);
  console.log(`  Pick ID: ${result.pickId}`);
  console.log(`  Tweet (${result.tweetText.length} chars):`);
  console.log(`  ---`);
  console.log(result.tweetText);
  console.log(`  ---\n`);

  // 5. Optionally post to X
  if (shouldPost) {
    console.log('Posting to X...');
    try {
      const rowId = await insertTweet({
        text: result.tweetText,
        contentType: 'game_preview',
        league,
        gameKey,
        pickDirection: pickDir,
        blogPostId: result.blogPostId,
      });

      const posted = await postTweet(result.tweetText);
      await updateTweetPosted(rowId, posted.tweetId);

      const xUrl = `https://x.com/SportsClawai/status/${posted.tweetId}`;
      await updatePickXPost(result.pickId, posted.tweetId, xUrl);
      await updateBlogXPostLink(result.blogPostId, xUrl);

      console.log(`Posted! Tweet ID: ${posted.tweetId}`);
      console.log(`X URL: ${xUrl}`);
      console.log(`Blog URL: ${result.blogUrl}`);
    } catch (err) {
      console.error('X post failed:', (err as Error).message);
    }
  } else {
    console.log('DRY RUN — skipping X post. Run with --post to post for real.');
  }

  console.log('\nDone!');
  process.exit(0);
}

main().catch(err => {
  console.error('Test failed:', err);
  process.exit(1);
});
