// src/lib/pages/attach.ts — résolution de page pour un keyword (pur, sans DB ni réseau).
//
// Priorité : mapped (targetPage déjà en base) > suggested (textualMatch live) > gap (null).

import { type PageRef, textualMatch } from "./mapping";

/** Origine d'une résolution de page. */
export type PageSource = "gsc" | "content" | "text" | "manual";

/** Page résolue pour un keyword, avec son niveau de confiance. */
export type ResolvedPage = {
  pageId: string;
  url: string;
  source: PageSource;
  confidence: "mapped" | "suggested";
  score: number | null;
};

/** Keyword minimal pour la résolution : term + lien en base éventuel. */
export type KwForResolve = {
  id: string;
  term: string;
  targetPage?: { url: string; source: PageSource; score: number | null } | null;
  targetPageId?: string | null;
};

/**
 * Résout la page cible d'un keyword :
 * 1. `targetPageId` ET `targetPage` présents → `mapped` (lien déjà en base) ;
 * 2. sinon `textualMatch(term, pages)` → `suggested` (source `text`) ;
 * 3. sinon `null` (gap → à créer).
 */
export function resolvePageForKeyword(
  kw: KwForResolve,
  pages: PageRef[],
): ResolvedPage | null {
  if (kw.targetPageId && kw.targetPage) {
    return {
      pageId: kw.targetPageId,
      url: kw.targetPage.url,
      source: kw.targetPage.source,
      confidence: "mapped",
      score: kw.targetPage.score,
    };
  }

  const m = textualMatch(kw.term, pages);
  if (m) {
    const page = pages.find((p) => p.id === m.pageId);
    if (page) {
      return {
        pageId: m.pageId,
        url: page.url,
        source: "text",
        confidence: "suggested",
        score: m.score,
      };
    }
  }

  return null;
}

/** Défaut du dialog de promotion : « optimize » si une page est résolue, sinon « create ». */
export function defaultDecision(
  resolved: ResolvedPage | null,
): "optimize" | "create" {
  return resolved ? "optimize" : "create";
}
