import { describe, expect, it } from "vitest";
import { keywordsHref, resolveTarget } from "./keywords-scope";
import type { Site } from "./sites";

function target(id: string, isDefault = false) {
  return {
    id,
    country: "FR",
    language: "fr",
    is_default: isDefault,
    created_at: "2026-08-31T00:00:00Z",
  };
}

function site(id: string, targets: ReturnType<typeof target>[]): Site {
  return {
    id,
    domain: `${id}.fr`,
    name: id,
    created_at: "2026-08-31T00:00:00Z",
    updated_at: "2026-08-31T00:00:00Z",
    targets,
  };
}

const A = site("a", [target("a1"), target("a2", true)]);

describe("resolveTarget", () => {
  it("retombe sur la cible par défaut sans paramètre", () => {
    expect(resolveTarget(A)?.id).toBe("a2");
  });

  it("honore la cible demandée", () => {
    expect(resolveTarget(A, "a1")?.id).toBe("a1");
  });

  it("ignore une cible qui n'appartient pas au site", () => {
    expect(resolveTarget(A, "b1")?.id).toBe("a2");
  });

  it("prend la première cible quand aucune n'est marquée par défaut", () => {
    expect(resolveTarget(site("c", [target("c1"), target("c2")]))?.id).toBe("c1");
  });

  it("supporte un site sans cible", () => {
    expect(resolveTarget(site("d", []))).toBeNull();
  });
});

describe("keywordsHref", () => {
  it("construit la route du réservoir du site", () => {
    expect(keywordsHref("a")).toBe("/sites/a/keywords");
  });

  it("ajoute le sous-chemin et la cible", () => {
    expect(keywordsHref("a", "imports", { target: "a1" })).toBe(
      "/sites/a/keywords/imports?target=a1",
    );
  });

  it("omet les paramètres vides plutôt que de rendre `?target=`", () => {
    expect(keywordsHref("a", "imports/new", { target: null, cursor: undefined })).toBe(
      "/sites/a/keywords/imports/new",
    );
  });

  it("cumule les paramètres dans l'ordre donné", () => {
    expect(keywordsHref("a", "", { target: "a1", cursor: "abc" })).toBe(
      "/sites/a/keywords?target=a1&cursor=abc",
    );
  });
});
