import { expect, test } from "bun:test";
import { buildContentAnalysis } from "./analysis";
import { groupByStatus, isOverdue } from "./board";
import type { ContentItem } from "./types";

let n = 0;
function item(over: Partial<ContentItem> = {}): ContentItem {
  n += 1;
  return {
    id: `c${n}`,
    siteId: "s",
    title: `art ${n}`,
    status: "idea",
    primaryKeywordId: null,
    keywordTerm: null,
    keywordCountry: null,
    hasBrief: false,
    lang: "fr",
    country: "FR",
    assignee: null,
    dueDate: null,
    url: null,
    kind: "new",
    warnedPageUrl: null,
    createdAt: "2026-01-01T00:00:00Z",
    analysis: buildContentAnalysis(null, null, null),
    ...over,
  };
}

test("groupByStatus returns the 5 columns in order, items sorted by due then created", () => {
  const cols = groupByStatus([
    item({ status: "writing", dueDate: "2026-02-10" }),
    item({ status: "writing", dueDate: "2026-02-01" }),
    item({ status: "idea" }),
  ]);
  expect(cols.map((c) => c.status)).toEqual([
    "idea",
    "brief",
    "writing",
    "review",
    "published",
  ]);
  const writing = cols.find((c) => c.status === "writing");
  expect(writing?.items.map((i) => i.dueDate)).toEqual([
    "2026-02-01",
    "2026-02-10",
  ]);
  expect(cols.find((c) => c.status === "brief")?.items.length).toBe(0);
});

test("isOverdue: null false; before today true; today/after false", () => {
  expect(isOverdue(null, "2026-06-06T00:00:00Z")).toBe(false);
  expect(isOverdue("2026-06-05", "2026-06-06T10:00:00Z")).toBe(true);
  expect(isOverdue("2026-06-06", "2026-06-06T10:00:00Z")).toBe(false);
  expect(isOverdue("2026-06-07", "2026-06-06T10:00:00Z")).toBe(false);
});
