// src/lib/pages/score.ts — score SEO d'une page à partir de ses issues on-page
// (cf. computeIssues, issues.ts). Pur, sans I/O. Score /100, pénalité par issue
// pondérée par gravité ; borné [0,100]. Sert la table Contenu/Overview.

export type ScoreLevel = "ok" | "warn" | "bad";
export type DimStatus = { level: ScoreLevel; label: string };

/** Pénalité (points retranchés) par code d'issue. Les issues qui rendent la page
 *  invisible/cassée pèsent le plus. */
const PENALTY: Record<string, number> = {
  error: 40,
  noindex: 40,
  "title-missing": 20,
  "h1-missing": 15,
  "description-missing": 12,
  "canonical-mismatch": 10,
  "h1-multiple": 8,
  "title-long": 6,
  "title-short": 6,
  "description-long": 6,
  "description-short": 6,
};

function levelForScore(score: number): ScoreLevel {
  if (score >= 80) return "ok";
  if (score >= 50) return "warn";
  return "bad";
}

export function pageScore(issues: string[]): {
  score: number;
  level: ScoreLevel;
} {
  const penalty = issues.reduce((sum, i) => sum + (PENALTY[i] ?? 0), 0);
  const score = Math.max(0, 100 - penalty);
  return { score, level: levelForScore(score) };
}

export function titleStatus(issues: string[], len: number): DimStatus {
  if (issues.includes("title-missing"))
    return { level: "bad", label: "Absent" };
  if (issues.includes("title-long") || issues.includes("title-short"))
    return { level: "warn", label: String(len) };
  return { level: "ok", label: String(len) };
}

export function descStatus(issues: string[], len: number): DimStatus {
  if (issues.includes("description-missing"))
    return { level: "bad", label: "Absente" };
  if (
    issues.includes("description-long") ||
    issues.includes("description-short")
  )
    return { level: "warn", label: String(len) };
  return { level: "ok", label: String(len) };
}

export function hnStatus(issues: string[]): DimStatus {
  if (issues.includes("h1-missing"))
    return { level: "bad", label: "H1 absent" };
  if (issues.includes("h1-multiple")) return { level: "warn", label: "H1 ×2+" };
  return { level: "ok", label: "OK" };
}
