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

/**
 * Rollen-/Wehr-Scoping (Definition of Done #3, Plan WS11 Aufgabe 6 / Verifikation
 * 6).
 *
 * NICHT in der Sandbox ausführbar (kein Server/DB) — deferred. Wird über
 * `npm run test:e2e` gegen einen geseedeten Server mit Storage-States aus dem
 * Auth-Setup ausgeführt.
 *
 * Garantien:
 *  - wehr_read kann NICHT schreiben (Status-Änderung -> 403/forbidden).
 *  - wehr_admin A kann Wehr B NICHT ändern (fremdes Asset -> 403/404,
 *    Datensatz bleibt unverändert).
 *  - eigene Ressource: wehr_admin A kann Status setzen (-> 200, status='wartung').
 *
 * Storage-States kommen aus tests/e2e/fixtures/auth.setup.ts. Feste Asset-UUIDs
 * stammen aus dem deterministischen Seed (global-setup.ts).
 */

const VEHICLE_A = process.env.E2E_VEHICLE_A_ID ?? "";
const VEHICLE_B = process.env.E2E_VEHICLE_B_ID ?? "";

test.describe("wehr_read darf nicht schreiben", () => {
  test.skip(!process.env.E2E_WEHR_READ_STATE, "benötigt wehr_read-Fixture");
  test.use({ storageState: process.env.E2E_WEHR_READ_STATE });

  test("Aufruf der Verwaltungs-Schreibseite -> 403", async ({ page }) => {
    const res = await page.goto("/verwaltung/fahrzeuge/neu");
    expect(res?.status()).toBe(403);
  });
});

test.describe("wehr_admin A darf Wehr B nicht ändern", () => {
  test.skip(
    !process.env.E2E_WEHR_ADMIN_STATE || !VEHICLE_B,
    "benötigt wehr_admin-A-Fixture + Wehr-B-Fahrzeug-ID",
  );
  test.use({ storageState: process.env.E2E_WEHR_ADMIN_STATE });

  test("fremdes Fahrzeug (Wehr B) -> 404, unverändert", async ({ page }) => {
    const res = await page.goto(`/verwaltung/fahrzeuge/${VEHICLE_B}`);
    expect(res?.status()).toBe(404);
  });
});

test.describe("wehr_admin A darf eigenes Fahrzeug ändern", () => {
  test.skip(
    !process.env.E2E_WEHR_ADMIN_STATE || !VEHICLE_A,
    "benötigt wehr_admin-A-Fixture + Wehr-A-Fahrzeug-ID",
  );
  test.use({ storageState: process.env.E2E_WEHR_ADMIN_STATE });

  test("eigenes Fahrzeug ist erreichbar (200) und editierbar", async ({
    page,
  }) => {
    const res = await page.goto(`/verwaltung/fahrzeuge/${VEHICLE_A}`);
    expect(res?.status()).toBeLessThan(400);
    // Status auf 'wartung' setzen (Verifikation 6: eigenes -> 200).
    await page.getByLabel(/Status/i).selectOption("wartung");
    await page.getByRole("button", { name: /Speichern/i }).click();
    await expect(page.getByText(/gespeichert|wartung/i)).toBeVisible();
  });
});
