/**
 * News Scout Pipeline — Phase 2: X/Twitter Viral Search
 *
 * Uses existing searchRecentTweets() with OAuth 1.0a.
 * 3 targeted queries with lower engagement thresholds.
 * Graceful 402 CreditsDepleted handling — stops all remaining queries on first 402.
 * 2s delay between queries, max 3 queries/run.
 */

import { searchRecentTweets } from '../../twitter/services/twitter-api.service';
import { ScoutCandidate, TwitterSearchQuery } from './types';

const QUERIES: TwitterSearchQuery[] = [
  {
    query: '(trade OR injury OR signing OR waived OR released OR suspended) (NFL OR NBA OR MLB OR NHL OR UFC) -is:retweet lang:en',
    label: 'Breaking transactions',
    sport: 'general',
    minEngagement: 50,
  },
  {
    query: '(from:AdamSchefter OR from:ShamsCharania OR from:wojespn OR from:RapSheet OR from:JeffPassan OR from:FieldYates) -is:retweet',
    label: 'Beat reporter insiders',
    sport: 'general',
    minEngagement: 20,
  },
  {
    query: '(historic OR record OR unbelievable OR incredible) (game OR play OR moment) sports -is:retweet lang:en',
    label: 'Viral moments',
    sport: 'general',
    minEngagement: 100,
  },
];

// Sport classification keywords for "general" twitter queries
const SPORT_KEYWORDS: Record<string, string[]> = {
  nfl: ['nfl', 'football', 'quarterback', 'touchdown', 'super bowl'],
  nba: ['nba', 'basketball', 'lakers', 'celtics', 'warriors', 'dunk'],
  mlb: ['mlb', 'baseball', 'home run', 'pitcher', 'world series'],
  nhl: ['nhl', 'hockey', 'stanley cup', 'goalie'],
  soccer: ['soccer', 'premier league', 'epl', 'champions league', 'la liga', 'mls'],
  mma: ['ufc', 'mma', 'knockout', 'submission'],
};

function classifyTweetSport(text: string, defaultSport: string): string {
  if (defaultSport !== 'general') return defaultSport;

  const lower = text.toLowerCase();
  let bestSport = 'nfl'; // default fallback
  let bestScore = 0;

  for (const [sport, keywords] of Object.entries(SPORT_KEYWORDS)) {
    let score = 0;
    for (const kw of keywords) {
      if (lower.includes(kw)) score++;
    }
    if (score > bestScore) {
      bestScore = score;
      bestSport = sport;
    }
  }

  return bestSport;
}

function sleep(ms: number) {
  return new Promise(r => setTimeout(r, ms));
}

export async function runTwitterScout(): Promise<ScoutCandidate[]> {
  const candidates: ScoutCandidate[] = [];
  const seenIds = new Set<string>();

  for (let i = 0; i < QUERIES.length; i++) {
    const q = QUERIES[i];
    try {
      console.log(`  [twitter-scout] Query ${i + 1}/${QUERIES.length}: ${q.label}`);
      const tweets = await searchRecentTweets(q.query, 10);

      for (const tweet of tweets) {
        if (seenIds.has(tweet.id)) continue;

        const metrics = tweet.public_metrics;
        const engScore = metrics.like_count + metrics.retweet_count * 3 + metrics.reply_count * 2;

        // Skip tweets below this query's engagement threshold
        if (engScore < q.minEngagement) continue;

        seenIds.add(tweet.id);

        const sport = classifyTweetSport(tweet.text, q.sport);
        const tweetUrl = `https://x.com/i/status/${tweet.id}`;

        candidates.push({
          guid: `twitter:${tweet.id}`,
          title: tweet.text.slice(0, 280).replace(/https?:\/\/\S+/g, '').trim(),
          url: tweetUrl,
          source: 'twitter',
          sourceDisplay: 'X/Twitter',
          sport,
          description: tweet.text.slice(0, 500),
          publishedAt: new Date(tweet.created_at),
          sourceType: 'twitter',
          engagementScore: engScore,
          isCurated: false,
          isBreaking: false,
          isFeatured: false,
        });
      }

      console.log(`    Found ${tweets.length} tweets, ${candidates.length} total candidates`);
    } catch (err: any) {
      // Graceful 402 CreditsDepleted — stop all remaining queries
      if (err.message?.includes('402') || err.message?.includes('CreditsDepleted') || err.status === 402) {
        console.warn(`  [twitter-scout] Credits depleted (402) — skipping remaining ${QUERIES.length - i - 1} queries`);
        break;
      }
      console.error(`  [twitter-scout] Query "${q.label}" failed: ${err.message}`);
    }

    // 2s delay between queries
    if (i < QUERIES.length - 1) {
      await sleep(2000);
    }
  }

  console.log(`[twitter-scout] Total: ${candidates.length} viral tweets`);
  return candidates;
}
