// src/lib/pages/attach.test.ts — résolution de page pour un keyword (pur).

import { describe, expect, it } from "bun:test";
import {
  defaultDecision,
  type KwForResolve,
  resolvePageForKeyword,
} from "./attach";
import type { PageRef } from "./mapping";

const pages: PageRef[] = [
  {
    id: "page-run",
    url: "https://ex.com/chaussures-running",
    title: "Chaussures running",
    h1: "Chaussures running",
  },
  { id: "page-home", url: "https://ex.com/", title: "Accueil", h1: "Accueil" },
];

describe("resolvePageForKeyword", () => {
  it("mapped : targetPage + targetPageId l'emportent (pas de textualMatch)", () => {
    const kw: KwForResolve = {
      id: "kw-1",
      // term qui matcherait aussi textuellement — on vérifie que mapped gagne.
      term: "chaussures running",
      targetPageId: "page-manual",
      targetPage: {
        url: "https://ex.com/landing-manuelle",
        source: "gsc",
        score: 92,
      },
    };
    expect(resolvePageForKeyword(kw, pages)).toEqual({
      pageId: "page-manual",
      url: "https://ex.com/landing-manuelle",
      source: "gsc",
      confidence: "mapped",
      score: 92,
    });
  });

  it("mapped : score null préservé", () => {
    const kw: KwForResolve = {
      id: "kw-2",
      term: "peu importe",
      targetPageId: "page-x",
      targetPage: { url: "https://ex.com/x", source: "manual", score: null },
    };
    expect(resolvePageForKeyword(kw, pages)).toEqual({
      pageId: "page-x",
      url: "https://ex.com/x",
      source: "manual",
      confidence: "mapped",
      score: null,
    });
  });

  it("suggested : sans targetPage mais textualMatch trouve → source text", () => {
    const kw: KwForResolve = { id: "kw-3", term: "chaussures running" };
    expect(resolvePageForKeyword(kw, pages)).toEqual({
      pageId: "page-run",
      url: "https://ex.com/chaussures-running",
      source: "text",
      confidence: "suggested",
      score: 100,
    });
  });

  it("suggested : targetPageId sans targetPage → retombe sur textualMatch", () => {
    const kw: KwForResolve = {
      id: "kw-4",
      term: "chaussures running",
      targetPageId: "page-orphan",
      targetPage: null,
    };
    const r = resolvePageForKeyword(kw, pages);
    expect(r?.confidence).toBe("suggested");
    expect(r?.source).toBe("text");
    expect(r?.pageId).toBe("page-run");
  });

  it("null : aucun mapping ni match textuel", () => {
    const kw: KwForResolve = { id: "kw-5", term: "sujet totalement absent" };
    expect(resolvePageForKeyword(kw, pages)).toBeNull();
  });
});

describe("defaultDecision", () => {
  it("page résolue → optimize", () => {
    const resolved = resolvePageForKeyword(
      { id: "kw", term: "chaussures running" },
      pages,
    );
    expect(defaultDecision(resolved)).toBe("optimize");
  });

  it("null → create", () => {
    expect(defaultDecision(null)).toBe("create");
  });
});
