import { expect, test } from "bun:test";
import { buildContentAnalysis } from "./analysis";
import { buildContentOverview } from "./overview";
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: "kw",
    keywordTerm: "kw",
    keywordCountry: "FR",
    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,
  };
}

const NOW = "2026-06-06T10:00:00Z";

test("aggregates statuses, published/inProgress/overdue, brief, unlinked", () => {
  const ov = buildContentOverview(
    [
      item({ status: "published", dueDate: "2026-05-01" }),
      item({ status: "writing", dueDate: "2026-05-01", assignee: "marie" }), // overdue
      item({ status: "review", hasBrief: true }),
      item({ status: "idea", primaryKeywordId: null, assignee: "marie" }),
    ],
    NOW,
  );
  expect(ov.total).toBe(4);
  expect(ov.byStatus.map((b) => b.key)).toEqual([
    "idea",
    "brief",
    "writing",
    "review",
    "published",
  ]);
  expect(ov.published).toBe(1);
  expect(ov.inProgress).toBe(2); // writing + review
  expect(ov.overdue).toBe(1); // the writing one; the published one is excluded
  expect(ov.withBrief).toBe(1);
  expect(ov.unlinked).toBe(1);
  expect(ov.byAssignee.find((a) => a.key === "marie")?.count).toBe(2);
  expect(ov.byAssignee.find((a) => a.key === "Non assigné")?.count).toBe(2);
});

test("upcoming: only dated, soonest first, overdue flagged; empty otherwise", () => {
  const ov = buildContentOverview(
    [
      item({ dueDate: "2026-06-10" }),
      item({ dueDate: "2026-06-04", status: "writing" }), // overdue
      item({ dueDate: null }),
    ],
    NOW,
  );
  expect(ov.upcoming.map((u) => u.dueDate)).toEqual([
    "2026-06-04",
    "2026-06-10",
  ]);
  expect(ov.upcoming[0].overdue).toBe(true);
  expect(ov.upcoming[1].overdue).toBe(false);
  expect(buildContentOverview([], NOW).upcoming).toEqual([]);
});
