import { test, expect } from "@playwright/test";

/**
 * Admin-Gating (Workstream 6, Querschnittsstandard 1–3, default-deny dreifach).
 *
 * NICHT in der Sandbox ausführbar (kein Server/DB) — deferred. Wird über einen
 * laufenden Server ausgeführt. Erwartet:
 *  - anonym: jede /admin/*-Seite -> Redirect auf /login.
 *  - wehr_admin / wehr_read: jede /admin/*-Seite -> 403 (forbidden()).
 *  - platform_admin: /admin erreichbar.
 *
 * Negativ-Probe: Entfernen von `requirePlatformAdmin()` aus (admin)/layout.tsx
 * muss diese Suite rot machen.
 */

const ADMIN_PAGES = [
  "/admin",
  "/admin/merkmale",
  "/admin/merkmale/proposals",
  "/admin/vorlagen",
  "/admin/geraete-kategorien",
  "/admin/wehren",
  "/admin/wehren/neu",
  "/admin/audit",
];

test.describe("Admin: anonym -> Redirect auf /login", () => {
  test.use({ storageState: { cookies: [], origins: [] } });
  for (const path of ADMIN_PAGES) {
    test(`anonymer Aufruf von ${path} leitet auf /login um`, async ({
      page,
    }) => {
      await page.goto(path);
      await expect(page).toHaveURL(/\/login/);
    });
  }
});

// Diese Projekte setzen einen storageState eines wehr_admin/wehr_read-Kontos
// voraus (Test-Workstream stellt die Fixtures bereit). Hier dokumentiert als
// erwartetes Verhalten; das tatsächliche Konto wird über --project gewählt.
test.describe("Admin: falsche Rolle -> 403", () => {
  test.skip(
    !process.env.E2E_WEHR_ADMIN_STATE,
    "benötigt wehr_admin-Fixture (Test-Workstream)",
  );
  test.use({
    storageState: process.env.E2E_WEHR_ADMIN_STATE ?? { cookies: [], origins: [] },
  });
  for (const path of ADMIN_PAGES) {
    test(`wehr_admin-Aufruf von ${path} -> 403`, async ({ page }) => {
      const res = await page.goto(path);
      expect(res?.status()).toBe(403);
    });
  }
});

test.describe("Admin: platform_admin -> erreichbar", () => {
  test.skip(
    !process.env.E2E_PLATFORM_ADMIN_STATE,
    "benötigt platform_admin-Fixture (Test-Workstream)",
  );
  test.use({
    storageState:
      process.env.E2E_PLATFORM_ADMIN_STATE ?? { cookies: [], origins: [] },
  });
  test("/admin ist als platform_admin erreichbar", async ({ page }) => {
    await page.goto("/admin");
    await expect(
      page.getByRole("heading", { name: "Administration" }),
    ).toBeVisible();
  });
});
