// src/components/keywords/keyword-modal-utils.test.ts
import { describe, expect, test } from "bun:test";
import { kdLevel, trendDeltaPct } from "./keyword-modal-utils";

const pts = (...volumes: number[]) => volumes.map((volume) => ({ volume }));

describe("kdLevel", () => {
  test("unknown KD (null / 0 / negative) → muted « — », not « Facile »", () => {
    for (const kd of [null, undefined, 0, -5]) {
      const lvl = kdLevel(kd);
      expect(lvl.unknown).toBe(true);
      expect(lvl.label).toBe("—");
      // never the green « Facile » chip on missing data
      expect(lvl.chipClass).not.toContain("emerald");
    }
  });

  test("real KD maps to a difficulty level (not unknown)", () => {
    expect(kdLevel(10)).toMatchObject({ label: "Facile", unknown: false });
    expect(kdLevel(30)).toMatchObject({ label: "Moyen", unknown: false });
    expect(kdLevel(40)).toMatchObject({ label: "Moyen", unknown: false });
    expect(kdLevel(80)).toMatchObject({ label: "Difficile", unknown: false });
  });
});

describe("trendDeltaPct", () => {
  test("rising series → positive % (last vs first)", () => {
    expect(trendDeltaPct(pts(100, 120, 150))).toBe(50);
  });

  test("falling series → negative %", () => {
    expect(trendDeltaPct(pts(200, 180, 100))).toBe(-50);
  });

  test("flat series → 0", () => {
    expect(trendDeltaPct(pts(80, 90, 80))).toBe(0);
  });

  test("fewer than 2 points → null", () => {
    expect(trendDeltaPct(pts())).toBeNull();
    expect(trendDeltaPct(pts(42))).toBeNull();
  });

  test("zero base → null (ratio undefined)", () => {
    expect(trendDeltaPct(pts(0, 50, 100))).toBeNull();
  });

  test("relative 0..1 series (Semrush) → same ratio math", () => {
    expect(trendDeltaPct(pts(0.5, 0.6, 0.25))).toBe(-50);
    expect(trendDeltaPct(pts(0.2, 0.3))).toBe(50);
  });

  test("result is rounded to the nearest integer", () => {
    expect(trendDeltaPct(pts(3, 4))).toBe(33);
  });
});
