// src/lib/keywords/prompt/compute-readiness.ts
// Pure, deterministic mapping from a KeywordPromptBundle to the readiness rows
// used by the completeness card and the source dots. No I/O, no React.
import type {
  KeywordPromptBundle,
  Readiness,
  ReadinessItem,
  ReadyState,
} from "./types";

function detailFor(
  state: ReadyState,
  ready: string,
  progress: string,
  missing: string,
): string {
  switch (state) {
    case "ready":
      return ready;
    case "progress":
      return progress;
    case "missing":
      return missing;
  }
}

export function computeReadiness(bundle: KeywordPromptBundle): Readiness {
  const metrics: ReadinessItem = {
    key: "metrics",
    label: "Métriques",
    state: bundle.vol != null ? "ready" : "missing",
    detail:
      bundle.vol != null
        ? `Vol ${bundle.vol} · KD ${bundle.kd}`
        : "Aucune métrique",
  };

  // Trois états distincts : positions présentes / org connectée mais rien de
  // remonté pour CE mot-clé (pas une anomalie rouge) / org non connectée. La
  // connexion elle-même se gérera sur la future page GSC dédiée — pas d'action
  // ici.
  const gsc: ReadinessItem = {
    key: "gsc",
    label: "Search Console",
    state: bundle.hasGsc
      ? "ready"
      : bundle.gscConnected
        ? "progress"
        : "missing",
    detail: bundle.hasGsc
      ? "Positions GSC suivies"
      : bundle.gscConnected
        ? "Aucune position remontée pour ce mot-clé"
        : "Absent",
  };

  const serp: ReadinessItem = {
    key: "serp",
    label: "SERP / Concurrents",
    state: bundle.readiness.serp,
    detail: detailFor(
      bundle.readiness.serp,
      "Top concurrents récupérés",
      "Récupération partielle",
      "Non récupéré",
    ),
  };

  const onpage: ReadinessItem = {
    key: "onpage",
    label: "Crawl on-page",
    state: bundle.readiness.onpage,
    detail: detailFor(
      bundle.readiness.onpage,
      "Meta, Hn, Alt, JSON-LD OK",
      "Crawl partiel",
      "Non crawlé",
    ),
  };

  const brief: ReadinessItem = {
    key: "brief",
    label: "Brief YTG",
    state: bundle.readiness.brief,
    detail: detailFor(
      bundle.readiness.brief,
      "Grammages & termes prêts",
      "Brief sur une autre langue",
      "Aucun brief",
    ),
  };

  const profile = bundle.semanticProfile;
  const semantic: ReadinessItem = {
    key: "semantic",
    label: "Profil sémantique",
    state: profile ? "ready" : "missing",
    detail: profile
      ? `${profile.terms.length} termes · ${profile.intent.curve} · ${new Date(
          profile.analyzedAt,
        ).toLocaleDateString("fr-FR")}`
      : "Aucune analyse",
  };

  const items: ReadinessItem[] = [metrics, gsc, serp, onpage, brief, semantic];
  const readyCount = items.filter((i) => i.state === "ready").length;
  const pct = Math.round((readyCount / items.length) * 100);

  return { pct, items };
}
