import assert from "node:assert/strict";
import test from "node:test";
import { renderToStaticMarkup } from "react-dom/server";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { PathnameContext } from "next/dist/shared/lib/hooks-client-context.shared-runtime";
import { AppLanguageProvider } from "@/components/providers/app-language-provider";
import { MinistryMeetingCalendarGrid } from "./components/ministry-meeting-calendar-grid";
import { MinistryMeetingCalendarFilters } from "./components/ministry-meeting-calendar-filters";
import { useMeetingRequestI18n } from "../meeting-request/use-meeting-request-i18n";

function CalendarControls() {
  const { t } = useMeetingRequestI18n();
  return (
    <>
      <MinistryMeetingCalendarFilters
        filters={{ status: [], year: [], issueCount: [] }}
        onChange={() => {}}
        labels={t.meetingCalendar.filters}
        statusLabels={t.statusLabels}
      />
      <MinistryMeetingCalendarGrid
        rows={[]}
        initialMonth={{ year: 2026, monthIndex: 0 }}
      />
    </>
  );
}

test("shared calendar renders module-owned API month, weekday, navigation and filter labels", () => {
  const client = new QueryClient({
    defaultOptions: { queries: { retry: false } },
  });
  try {
    for (const owner of ["ministry", "cdcgpsf"])
      for (const language of ["en", "km"])
        client.setQueryData(
          ["translations", owner, "meeting_calendar", language],
          {
            "calendar_ui.months.jan": owner + " January",
            "calendar_ui.weekdays.mon": owner + " Monday",
            "calendar_ui.previous_month": owner + " Previous",
            "calendar_ui.next_month": owner + " Next",
            "filter_panel.filter": owner + " Filter",
          },
        );
    for (const owner of ["ministry", "cdcgpsf"]) {
      const route = owner === "cdcgpsf" ? "cdc-gpsf" : owner;
      const html = renderToStaticMarkup(
        <QueryClientProvider client={client}>
          <PathnameContext.Provider value={`/${route}/meeting-calendar`}>
            <AppLanguageProvider>
              <CalendarControls />
            </AppLanguageProvider>
          </PathnameContext.Provider>
        </QueryClientProvider>,
      );
      for (const label of ["January", "Monday", "Previous", "Next", "Filter"])
        assert.ok(html.includes(owner + " " + label), owner + " " + label);
      assert.ok(
        !html.includes(
          (owner === "ministry" ? "cdcgpsf" : "ministry") + " January",
        ),
      );
    }
  } finally {
    client.clear();
  }
});
