/**
 * Sanitizes forecast content for public blog posts by removing
 * proprietary model details, exact probabilities, and pick language.
 *
 * Enhanced with Narrative Engine editorial guardrails.
 */

const PATTERNS_TO_STRIP: RegExp[] = [
  // Percentages and confidence numbers
  /\b\d{1,3}(\.\d{1,2})?%\s*(confidence|probability|edge|prob|chance)?\b/gi,
  /confidence[:\s]*\d{1,3}(\.\d+)?%?/gi,
  /probability[:\s]*\d{1,3}(\.\d+)?%?/gi,
  /edge[:\s]*[+\-]?\d{1,3}(\.\d+)?%?/gi,

  // Pick/bet language
  /\bpick:\s*\w[\w\s]*/gi,
  /\btake the (over|under|home|away|spread)\b/gi,
  /\bbest bet[:\s]*/gi,
  /\block of the (day|week|night)\b/gi,
  /\bslam\b/gi,
  /\bmax bet\b/gi,

  // Hard-claim language (Narrative Engine banned list — phrase-level)
  /\bmortal lock\b/gi,
  /\bguaranteed?\s+(winner|win|pick|play)\b/gi,
  /\bsure thing\b/gi,
  /\bcan'?t[- ]miss\b/gi,
  /\bfree money\b/gi,
  /\bautomatic winner\b/gi,
  /\bno[- ]?brainer\b/gi,
  /\bimpossible to lose\b/gi,

  // Model names and proprietary terms
  /\bPIFF\s*\d*\.?\d*\b/gi,
  /\bDIGIMON\s*v?\d*\.?\d*\b/gi,
  /\bGrok\s*(AI|model|engine)?\b/g,
  /\bDVP\s*(model|rating|score|adj)?\b/gi,
  /\bcomposite\s*(score|confidence|rating)\b/gi,
  /\bstorm\s*(tier|category|rating)\s*\d*/gi,
  /\brainmaker\s*(model|engine|system)\b/gi,
  /\bmodel\s*(signal|edge|confidence)\b/gi,
  /\bour\s+model\b/gi,
  /\bthe\s+algorithm\b/gi,
  /\bforecast\s+engine\b/gi,
];

export function sanitizeForecastText(text: string): string {
  if (!text) return '';
  let cleaned = text;
  for (const pattern of PATTERNS_TO_STRIP) {
    cleaned = cleaned.replace(pattern, '');
  }
  // Collapse multiple spaces and trim
  return cleaned.replace(/\s{2,}/g, ' ').trim();
}

export function sanitizeForecastData(forecastData: any): {
  summary: string;
  keyFactors: string[];
  spreadAnalysis: string;
  totalAnalysis: string;
  historicalTrend: string;
  injuryNotes: string;
} {
  return {
    summary: sanitizeForecastText(forecastData.summary || ''),
    keyFactors: (forecastData.key_factors || []).map((f: string) => sanitizeForecastText(f)).filter(Boolean),
    spreadAnalysis: sanitizeForecastText(forecastData.spread_analysis || ''),
    totalAnalysis: sanitizeForecastText(forecastData.total_analysis || ''),
    historicalTrend: sanitizeForecastText(forecastData.historical_trend || ''),
    injuryNotes: sanitizeForecastText(forecastData.injury_notes || ''),
  };
}
