import { describe, expect, it, vi } from "vitest";
import { addons, registerReportSection, registerReservationPanel, registerTab, splitTab } from "./addon";

const Empty = () => null;

describe("splitTab", () => {
    it("takes the first segment as the tab and keeps the rest", () => {
        expect(splitTab("guests/12?q=lan")).toEqual({ id: "guests", path: "12?q=lan" });
        expect(splitTab("guests")).toEqual({ id: "guests", path: "" });
        expect(splitTab("")).toEqual({ id: "", path: "" });
    });
});

describe("the add-on registry", () => {
    it("refuses a built-in tab's name and odd ids", () => {
        const warn = vi.spyOn(console, "warn").mockImplementation(() => undefined);
        registerTab({ id: "settings", label: "x", Component: Empty });
        registerTab({ id: "Guests!", label: "x", Component: Empty });

        expect(warn).toHaveBeenCalledTimes(2);
        expect(addons().tabs).toEqual([]);
    });

    it("adds tabs in order and replaces one registered twice", () => {
        registerTab({ id: "guests", label: "Guests", Component: Empty });
        registerTab({ id: "deposits", label: "Deposits", Component: Empty });
        registerTab({ id: "guests", label: "Guest book", Component: Empty });
        registerReservationPanel({ id: "guest", Component: Empty });
        registerReportSection({ id: "covers", Component: Empty });
        registerReportSection({ id: "covers", Component: Empty });

        expect(addons().tabs.map((tab) => tab.label)).toEqual(["Deposits", "Guest book"]);
        expect(addons().panels.map((panel) => panel.id)).toEqual(["guest"]);
        expect(addons().reports.map((section) => section.id)).toEqual(["covers"]);
    });
});
