import { describe, it, expect } from "vitest";
import { modules } from "@/lib/modules";
import { moduleHandleidingen, vindHandleiding, ALGEMENE_SNELSTART, HANDELINGSREGIMES } from "./handleiding";

// ── Registry-volledigheid ────────────────────────────────────────────────────
// Zelfde principe als de barrel-guard: een nieuwe module kan niet stilzwijgend
// zonder handleiding blijven, en de handleiding kan niet verwijzen naar
// modules die niet (meer) bestaan.

describe("handleiding ↔ modules-register", () => {
  const moduleIds = new Set(modules.map((m) => m.id));

  it("elke geregistreerde module heeft een handleiding", () => {
    const ontbreekt = modules.filter((m) => !vindHandleiding(m.id)).map((m) => m.id);
    expect(ontbreekt).toEqual([]);
  });

  it("elke handleiding hoort bij een bestaande module (geen wezen, geen dubbels)", () => {
    const ids = moduleHandleidingen.map((h) => h.moduleId);
    expect(ids.filter((id) => !moduleIds.has(id))).toEqual([]);
    expect(new Set(ids).size).toBe(ids.length);
  });

  it("elke interactie verwijst naar een bestaande, andere module", () => {
    for (const h of moduleHandleidingen) {
      for (const interactie of h.interacties) {
        expect(moduleIds.has(interactie.metModuleId), `${h.moduleId} → ${interactie.metModuleId}`).toBe(true);
        expect(interactie.metModuleId).not.toBe(h.moduleId);
      }
    }
  });
});

describe("handleiding — inhoudelijke minima", () => {
  it("elke handleiding heeft een één-zin-samenvatting, snelstart en werking", () => {
    for (const h of moduleHandleidingen) {
      expect(h.inEenZin.trim(), h.moduleId).not.toBe("");
      expect(h.snelstart.length, `${h.moduleId}: snelstart`).toBeGreaterThan(0);
      expect(h.werking.length, `${h.moduleId}: werking`).toBeGreaterThan(0);
      for (const stap of [...h.snelstart, ...h.werking, ...h.tips]) {
        expect(stap.trim(), h.moduleId).not.toBe("");
      }
    }
  });

  it("de algemene snelstart en de drie handelingsregimes zijn aanwezig", () => {
    expect(ALGEMENE_SNELSTART.length).toBeGreaterThanOrEqual(3);
    expect(HANDELINGSREGIMES).toHaveLength(3);
  });
});
