import { expect, test } from "bun:test";
import { descStatus, hnStatus, pageScore, titleStatus } from "./score";

test("page saine (aucune issue) → 100 / ok", () => {
  expect(pageScore([])).toEqual({ score: 100, level: "ok" });
});
test("issue critique (noindex) plombe le score → warn", () => {
  const r = pageScore(["noindex"]);
  expect(r.score).toBe(60); // 100 - 40
  expect(r.level).toBe("warn"); // 60 → warn (bornes ok≥80, warn≥50, bad<50)
});
test("plusieurs issues graves → bad", () => {
  // error 40 + title-missing 20 + h1-missing 15 + description-missing 12 = 87
  const r = pageScore([
    "error",
    "title-missing",
    "h1-missing",
    "description-missing",
  ]);
  expect(r.score).toBe(13); // 100 - 87 (clamp à 0 seulement si pénalité > 100)
  expect(r.level).toBe("bad"); // 13 < 50 → bad
});
test("pénalité > 100 → score borné à 0", () => {
  const r = pageScore(["error", "noindex", "title-missing", "h1-missing"]);
  // 40 + 40 + 20 + 15 = 115 → clamp
  expect(r.score).toBe(0);
  expect(r.level).toBe("bad");
});
test("issue mineure → ok mais < 100", () => {
  expect(pageScore(["title-long"])).toEqual({ score: 94, level: "ok" });
});
test("titleStatus : missing=bad, long/short=warn, ok sinon avec longueur", () => {
  expect(titleStatus(["title-missing"], 0).level).toBe("bad");
  expect(titleStatus(["title-long"], 72).level).toBe("warn");
  expect(titleStatus([], 48)).toEqual({ level: "ok", label: "48" });
});
test("descStatus : missing=bad, long/short=warn, ok sinon avec longueur", () => {
  expect(descStatus(["description-missing"], 0).level).toBe("bad");
  expect(descStatus(["description-long"], 180).level).toBe("warn");
  expect(descStatus([], 150)).toEqual({ level: "ok", label: "150" });
});
test("hnStatus : missing=bad, multiple=warn, sinon ok", () => {
  expect(hnStatus(["h1-missing"]).level).toBe("bad");
  expect(hnStatus(["h1-multiple"]).level).toBe("warn");
  expect(hnStatus([]).level).toBe("ok");
});
