<?php

namespace Database\Seeders;

use App\Enums\CommitmentStatus;
use App\Enums\FaseStatus;
use App\Enums\FaseType;
use App\Enums\Prioriteit;
use App\Enums\ProjectRol;
use App\Enums\ProjectStatus;
use App\Enums\SpeerpuntStatus;
use App\Models\Afhankelijkheid;
use App\Models\Commitment;
use App\Models\Document;
use App\Models\Fase;
use App\Models\Project;
use App\Models\Role;
use App\Models\Speerpunt;
use App\Models\Thema;
use App\Models\User;
use App\Models\KennisArtikel;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * Planning 2026 – R&D Lab Waterschap Brabantse Delta
     * Source: Planning 2026.pptx
     */
    public function run(): void
    {
        // ──────────────────────────────────────────────────────────────
        // 1. System roles
        // ──────────────────────────────────────────────────────────────
        $roleAdmin = Role::create([
            'naam' => 'admin',
            'beschrijving' => 'Volledige toegang tot het platform',
            'permissies' => ['*'],
        ]);

        $roleProjectOwner = Role::create([
            'naam' => 'project_owner',
            'beschrijving' => 'Kan projecten beheren en bewerken',
            'permissies' => ['projects.manage', 'commitments.manage', 'documents.manage'],
        ]);

        $roleTeamMember = Role::create([
            'naam' => 'team_member',
            'beschrijving' => 'Kan bijdragen aan toegewezen projecten',
            'permissies' => ['projects.view', 'commitments.edit', 'documents.upload'],
        ]);

        Role::create([
            'naam' => 'viewer',
            'beschrijving' => 'Alleen-lezen toegang',
            'permissies' => ['projects.view', 'documents.view'],
        ]);

        // ──────────────────────────────────────────────────────────────
        // 2. Users (R&D team)
        // ──────────────────────────────────────────────────────────────
        $admin = User::create([
            'name' => 'Admin',
            'email' => 'admin@innovatieplatform.nl',
            'password' => Hash::make('password'),
            'functie' => 'Platform Beheerder',
            'afdeling' => 'R&D Lab',
            'email_verified_at' => now(),
        ]);
        $admin->roles()->attach($roleAdmin);

        $rene = User::create([
            'name' => 'Rene de Ren',
            'email' => 'rene@wbd-rd.nl',
            'password' => Hash::make('password'),
            'functie' => 'R&D Engineer / Teamlead',
            'afdeling' => 'R&D Lab',
            'email_verified_at' => now(),
        ]);
        $rene->roles()->attach($roleProjectOwner);

        $pim = User::create([
            'name' => 'Pim Moerman',
            'email' => 'p.moerman@wbd-rd.nl',
            'password' => Hash::make('password'),
            'functie' => 'Technisch Adviseur OT/IT',
            'afdeling' => 'R&D Lab',
            'email_verified_at' => now(),
        ]);
        $pim->roles()->attach($roleTeamMember);

        $sjoerd = User::create([
            'name' => 'Sjoerd Fijnje',
            'email' => 's.fijnje@wbd-rd.nl',
            'password' => Hash::make('password'),
            'functie' => 'Werktuigbouwkundige / Elektro',
            'afdeling' => 'R&D Lab',
            'email_verified_at' => now(),
        ]);
        $sjoerd->roles()->attach($roleTeamMember);

        // ──────────────────────────────────────────────────────────────
        // 3. Themas – 2026 strategic themes
        //
        // Kaders: geen nieuwe ML-modellen, geen nieuwe digital twins,
        // focus op werkend krijgen, architectuur aantonen, overdragen.
        // ──────────────────────────────────────────────────────────────
        $themaArchitectuur = Thema::create([
            'naam' => 'Architectuur & Veiligheid',
            'beschrijving' => 'Aantonen dat de EDGE-laag architectuur veilig, betrouwbaar en schaalbaar is. OT/IT-scheiding, Siemens-koppeling, CI/CD implementatie.',
            'prioriteit' => Prioriteit::Hoog,
            'periode_start' => '2026-01-01',
            'periode_eind' => '2026-12-31',
        ]);

        $themaProductie = Thema::create([
            'naam' => 'Productiewaardig Maken',
            'beschrijving' => 'Bestaande innovaties werkend, overdraagbaar en schaalbaar maken. Begeleiding van aanbestedingen en overdracht naar Bouwen/Beheer.',
            'prioriteit' => Prioriteit::Hoog,
            'periode_start' => '2026-01-01',
            'periode_eind' => '2026-12-31',
        ]);

        $themaLab = Thema::create([
            'naam' => 'Lab & Prototyping',
            'beschrijving' => 'Fysieke opstellingen valideren, uitbreiden en koppelen tot een realistische testomgeving voor afvlakkingsregelingen.',
            'prioriteit' => Prioriteit::Midden,
            'periode_start' => '2026-01-01',
            'periode_eind' => '2026-12-31',
        ]);

        $themaGovernance = Thema::create([
            'naam' => 'Governance & Teamborging',
            'beschrijving' => 'R&D minder persoonsafhankelijk maken. Projectstructuur, documentatie, besluitvorming en rolafbakening vastleggen.',
            'prioriteit' => Prioriteit::Midden,
            'periode_start' => '2026-01-01',
            'periode_eind' => '2026-12-31',
        ]);

        // ──────────────────────────────────────────────────────────────
        // 4. Speerpunten (2 per thema)
        // ──────────────────────────────────────────────────────────────

        // Architectuur & Veiligheid
        $spEdge = Speerpunt::create([
            'thema_id' => $themaArchitectuur->id,
            'naam' => 'EDGE-laag & OT/IT-scheiding',
            'beschrijving' => 'Implementatie en validatie van de EDGE-architectuur met beveiligde OT/IT-scheiding op pilotlocatie.',
            'eigenaar_id' => $rene->id,
            'status' => SpeerpuntStatus::Actief,
        ]);

        $spCicd = Speerpunt::create([
            'thema_id' => $themaArchitectuur->id,
            'naam' => 'CI/CD & DevOps R&D-stack',
            'beschrijving' => 'Continuous Integration en Deployment implementeren in de R&D-stack voor maximale efficiëntie en herhaalbaarheid.',
            'eigenaar_id' => $rene->id,
            'status' => SpeerpuntStatus::Concept,
        ]);

        // Productiewaardig Maken
        $spOverdracht = Speerpunt::create([
            'thema_id' => $themaProductie->id,
            'naam' => 'Overdracht naar Bouwen/Beheer',
            'beschrijving' => 'Innovaties begeleiden van R&D naar productie: documentatie, oplevering, kennisoverdracht.',
            'eigenaar_id' => $rene->id,
            'status' => SpeerpuntStatus::Actief,
        ]);

        $spAanbesteding = Speerpunt::create([
            'thema_id' => $themaProductie->id,
            'naam' => 'Aanbesteding & TCO-toetsing',
            'beschrijving' => 'Technische toetsing van aanbestedingen op prestatie-eisen, energie-efficiëntie en inpasbaarheid.',
            'eigenaar_id' => $pim->id,
            'status' => SpeerpuntStatus::Actief,
        ]);

        // Lab & Prototyping
        $spDtValidatie = Speerpunt::create([
            'thema_id' => $themaLab->id,
            'naam' => 'Digital Twin Validatie',
            'beschrijving' => 'Valideren van 2025-ontwikkelingen (Measurement, Rotating Machine, Aeration Tank, MGC, Diffuser) op het fysieke prototype.',
            'eigenaar_id' => $rene->id,
            'status' => SpeerpuntStatus::Actief,
        ]);

        $spGemalenketen = Speerpunt::create([
            'thema_id' => $themaLab->id,
            'naam' => 'Gemalenketen Testomgeving',
            'beschrijving' => 'Realiseren van een volledige gemalenketen in het lab voor experimentele afvlakkingsregelingen.',
            'eigenaar_id' => $sjoerd->id,
            'status' => SpeerpuntStatus::Concept,
        ]);

        // Governance & Teamborging
        $spProjectstructuur = Speerpunt::create([
            'thema_id' => $themaGovernance->id,
            'naam' => 'Projectstructuur & Documentatie',
            'beschrijving' => 'Afspraken vastleggen over projectstructuur, documentatie, besluitvorming en beleid.',
            'eigenaar_id' => $rene->id,
            'status' => SpeerpuntStatus::Actief,
        ]);

        $spRolafbakening = Speerpunt::create([
            'thema_id' => $themaGovernance->id,
            'naam' => 'Rolafbakening R&D ↔ Organisatie',
            'beschrijving' => 'Verduidelijken wat R&D wel en niet doet. Afbakening richting Beheer, Bouwen, ICT en Datalab.',
            'eigenaar_id' => $rene->id,
            'status' => SpeerpuntStatus::Concept,
        ]);

        // ──────────────────────────────────────────────────────────────
        // 5. Projects – 2026 planning (6 projects from the presentation)
        // ──────────────────────────────────────────────────────────────

        // --- B.R.I.D.G.E (Bidirectional Real-time Interface for Data & Grid Exchange) ---
        $bridge = $this->createProject([
            'speerpunt_id' => $spEdge->id,
            'naam' => 'B.R.I.D.G.E – Pilot Klundert',
            'beschrijving' => 'Aantonen dat de nieuwe EDGE-laag veilig en betrouwbaar assets kan uitlezen en aansturen, en correct kan koppelen met Siemens-omgevingen. Implementatie Ubuntu LTS, Node-RED orkestratie, OPC UA communicatie met Siemens PLC (T-serie).',
            'eigenaar_id' => $rene->id,
            'status' => ProjectStatus::Pilot,
            'prioriteit' => Prioriteit::Hoog,
            'startdatum' => '2026-01-15',
            'streef_einddatum' => '2026-09-30',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Pilot]);

        // --- C.R.I.S.P (Compressor Replacement for Immediate System Performance) ---
        $crisp = $this->createProject([
            'speerpunt_id' => $spAanbesteding->id,
            'naam' => 'C.R.I.S.P – Compressor Aanbesteding',
            'beschrijving' => 'Technische toetsing van aanbestedingsmethodiek voor compressorvervanging Nieuwveer. Prestatie-eisen, energie-efficiëntie, inpasbaarheid in procesautomatisering. R&D als inhoudelijke sparringpartner voor Bouwen.',
            'eigenaar_id' => $pim->id,
            'status' => ProjectStatus::Verkenning,
            'prioriteit' => Prioriteit::Hoog,
            'startdatum' => '2026-02-01',
            'streef_einddatum' => '2026-08-31',
        ], [FaseType::Signaal, FaseType::Verkenning]);

        // --- W.I.S.E (Weather and Influent Sampling Engine) ---
        $wise = $this->createProject([
            'speerpunt_id' => $spOverdracht->id,
            'naam' => 'W.I.S.E – Monsternamekast Overdracht',
            'beschrijving' => 'Overdracht monsternamekast naar Bouwen. Opleveren Node-RED flows, documentatie, afbakening R&D vs beheer. Samenwerking met Datalab (data & integratie voorspellend model) en Beheer/Operatie.',
            'eigenaar_id' => $rene->id,
            'status' => ProjectStatus::OverdrachtBouwen,
            'prioriteit' => Prioriteit::Hoog,
            'startdatum' => '2025-06-01',
            'streef_einddatum' => '2026-06-30',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Pilot, FaseType::Besluitvorming, FaseType::OverdrachtBouwen]);

        // --- Gemaal 3.0 – Prototype Validatie ---
        $gemaal = $this->createProject([
            'speerpunt_id' => $spDtValidatie->id,
            'naam' => 'Gemaal 3.0 – Prototype Validatie',
            'beschrijving' => 'Valideren dat het recent gebouwde prototype functioneel correct is. Testen van alle elektrische aansluitingen, I/O-functionaliteit en randapparatuur. Go/no-go voor verdere uitrol naar 2 kopieën.',
            'eigenaar_id' => $sjoerd->id,
            'status' => ProjectStatus::Experiment,
            'prioriteit' => Prioriteit::Midden,
            'startdatum' => '2026-03-01',
            'streef_einddatum' => '2026-07-31',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment]);

        // --- Afvlakkingsregeling – Lab Gemalenketen ---
        $afvlak = $this->createProject([
            'speerpunt_id' => $spGemalenketen->id,
            'naam' => 'Afvlakkingsregeling – Lab Keten',
            'beschrijving' => 'Nabootsen van een volledige gemalenketen in het lab, klaarstomen voor afvlakkingsregeling. Realiseren 2 extra opstellingen, koppelen tot keten, basissoftware testen op ketengedrag.',
            'eigenaar_id' => $sjoerd->id,
            'status' => ProjectStatus::Concept,
            'prioriteit' => Prioriteit::Midden,
            'startdatum' => '2026-06-01',
            'streef_einddatum' => '2026-12-31',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept]);

        // --- Structuur & Borging R&D-team ---
        $governance = $this->createProject([
            'speerpunt_id' => $spProjectstructuur->id,
            'naam' => 'Structuur & Borging R&D',
            'beschrijving' => 'R&D minder persoonsafhankelijk en beter voorspelbaar maken. Afspraken over projectstructuur, documentatie, besluitvorming, beleid. Inrichten ICT in Bouvigne voor R&D en Datanetwerkteam.',
            'eigenaar_id' => $rene->id,
            'status' => ProjectStatus::Verkenning,
            'prioriteit' => Prioriteit::Midden,
            'startdatum' => '2026-01-01',
            'streef_einddatum' => '2026-12-31',
        ], [FaseType::Signaal, FaseType::Verkenning]);

        // ──────────────────────────────────────────────────────────────
        // 6. Assign team members
        // ──────────────────────────────────────────────────────────────
        $bridge->teamleden()->attach($pim->id, ['rol' => ProjectRol::Lid->value]);
        $bridge->teamleden()->attach($sjoerd->id, ['rol' => ProjectRol::Lid->value]);
        $crisp->teamleden()->attach($rene->id, ['rol' => ProjectRol::Reviewer->value]);
        $wise->teamleden()->attach($pim->id, ['rol' => ProjectRol::Lid->value]);
        $gemaal->teamleden()->attach($rene->id, ['rol' => ProjectRol::Reviewer->value]);
        $afvlak->teamleden()->attach($rene->id, ['rol' => ProjectRol::Reviewer->value]);
        $governance->teamleden()->attach($pim->id, ['rol' => ProjectRol::Lid->value]);
        $governance->teamleden()->attach($sjoerd->id, ['rol' => ProjectRol::Lid->value]);

        // ──────────────────────────────────────────────────────────────
        // 7. Commitments
        // ──────────────────────────────────────────────────────────────

        // BRIDGE
        Commitment::create([
            'project_id' => $bridge->id,
            'beschrijving' => 'Architectuur validatiedocument opleveren conform stackKlundertPilot.pdf',
            'eigenaar_id' => $rene->id,
            'deadline' => '2026-04-30',
            'status' => CommitmentStatus::InUitvoering,
            'bron' => 'Planning 2026 – slide 3',
        ]);

        Commitment::create([
            'project_id' => $bridge->id,
            'beschrijving' => 'OT/IT beveiligingsassessment en scheidingsrapport',
            'eigenaar_id' => $pim->id,
            'deadline' => '2026-06-30',
            'status' => CommitmentStatus::Open,
            'bron' => 'Planning 2026 – slide 3',
        ]);

        Commitment::create([
            'project_id' => $bridge->id,
            'beschrijving' => 'Beslisdocument voor opschaling EDGE-laag naar andere locaties',
            'eigenaar_id' => $rene->id,
            'deadline' => '2026-09-30',
            'status' => CommitmentStatus::Open,
            'bron' => 'Planning 2026 – slide 3',
        ]);

        // CRISP
        Commitment::create([
            'project_id' => $crisp->id,
            'beschrijving' => 'TCO-onderbouwde aanbestedingsdocumenten technisch getoetst vóór marktgang',
            'eigenaar_id' => $pim->id,
            'deadline' => '2026-05-31',
            'status' => CommitmentStatus::Open,
            'bron' => 'Planning 2026 – slide 4',
        ]);

        // WISE
        Commitment::create([
            'project_id' => $wise->id,
            'beschrijving' => 'Node-RED flows opleveren aan Bouwen / uitvoerende partij',
            'eigenaar_id' => $rene->id,
            'deadline' => '2026-03-31',
            'status' => CommitmentStatus::InUitvoering,
            'bron' => 'Planning 2026 – slide 5',
        ]);

        Commitment::create([
            'project_id' => $wise->id,
            'beschrijving' => 'Overdracht- en documentatiepakket compleet (afbakening R&D vs beheer)',
            'eigenaar_id' => $rene->id,
            'deadline' => '2026-06-30',
            'status' => CommitmentStatus::Open,
            'bron' => 'Planning 2026 – slide 5',
        ]);

        // Gemaal 3.0
        Commitment::create([
            'project_id' => $gemaal->id,
            'beschrijving' => 'Go/no-go besluit voor uitrol naar 2 kopieën op basis van testresultaten',
            'eigenaar_id' => $sjoerd->id,
            'deadline' => '2026-06-30',
            'status' => CommitmentStatus::Open,
            'bron' => 'Planning 2026 – slide 6',
        ]);

        Commitment::create([
            'project_id' => $gemaal->id,
            'beschrijving' => 'Overzicht software/hardware functionaliteiten en validatie digital twins',
            'eigenaar_id' => $rene->id,
            'deadline' => '2026-07-31',
            'status' => CommitmentStatus::Open,
            'bron' => 'Planning 2026 – slide 6',
        ]);

        // Afvlakkingsregeling
        Commitment::create([
            'project_id' => $afvlak->id,
            'beschrijving' => '2 extra opstellingen gerealiseerd en gekoppeld tot keten',
            'eigenaar_id' => $sjoerd->id,
            'deadline' => '2026-10-31',
            'status' => CommitmentStatus::Open,
            'bron' => 'Planning 2026 – slide 7',
        ]);

        // Governance
        Commitment::create([
            'project_id' => $governance->id,
            'beschrijving' => 'Projectstructuur- en documentatieafspraken vastgelegd',
            'eigenaar_id' => $rene->id,
            'deadline' => '2026-03-31',
            'status' => CommitmentStatus::InUitvoering,
            'bron' => 'Planning 2026 – slide 8',
        ]);

        Commitment::create([
            'project_id' => $governance->id,
            'beschrijving' => 'Rolafbakening R&D ↔ Beheer ↔ Bouwen vastgelegd en gecommuniceerd',
            'eigenaar_id' => $rene->id,
            'deadline' => '2026-06-30',
            'status' => CommitmentStatus::Open,
            'bron' => 'Planning 2026 – slide 8',
        ]);

        // ──────────────────────────────────────────────────────────────
        // 8. Documents
        // ──────────────────────────────────────────────────────────────
        Document::create([
            'project_id' => $bridge->id,
            'titel' => 'Stack Architectuur Klundert Pilot',
            'type' => 'technisch_ontwerp',
            'inhoud' => 'Systeemarchitectuur EDGE-laag: Ubuntu LTS, Node-RED orkestratie, OPC UA communicatie met Siemens PLC T-serie, InfluxDB/Grafana datastromen.',
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        Document::create([
            'project_id' => $wise->id,
            'titel' => 'Overdrachtsprotocol Monsternamekast',
            'type' => 'protocol',
            'inhoud' => 'Opleverdocument voor de overdracht van de monsternamekast naar Bouwen. Bevat: Node-RED flow specificaties, integratie voorspellend model, afbakening verantwoordelijkheden.',
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        Document::create([
            'project_id' => $crisp->id,
            'titel' => 'Technische Toetsing Aanbesteding Compressoren',
            'type' => 'technisch_rapport',
            'inhoud' => 'Q&A en technische beoordeling van aanbestedingsdocumenten voor compressorvervanging Nieuwveer. TCO-analyse, prestatie-eisen, energie-efficiëntie.',
            'versie' => 1,
            'auteur_id' => $pim->id,
        ]);

        Document::create([
            'project_id' => $gemaal->id,
            'titel' => 'Testrapport Prototype Gemaal 3.0',
            'type' => 'technisch_rapport',
            'inhoud' => 'Bevindingen en verbeterpunten uit validatie van het prototype: elektrische aansluitingen, I/O-functionaliteit, randapparatuur, digital twin koppelingen.',
            'versie' => 1,
            'auteur_id' => $sjoerd->id,
        ]);

        Document::create([
            'project_id' => $governance->id,
            'titel' => 'R&D Projectstructuur & Beleidskader',
            'type' => 'projectplan',
            'inhoud' => 'Afspraken over projectstructuur, documentatiestandaarden, besluitvormingsproces en beleid voor het R&D-lab.',
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        // --- Documents extracted from architecture diagrams (raw/*.drawio.png) ---

        // EVOLV-Tracks-Maintracks: full ISA-88 node hierarchy
        Document::create([
            'project_id' => $gemaal->id,
            'titel' => 'EVOLV Digital Twin Hiërarchie (ISA-88 Tracks)',
            'type' => 'technisch_ontwerp',
            'inhoud' => "EVOLV node-hiërarchie conform ISA-88 (S88) batch control standaard.\n\n"
                . "**Control Module**: measurement, diffuser, healthCompact, filterController\n"
                . "**Equipment**: Rotating Machine, sump (gepland)\n"
                . "**Unit**: machineGroupControl, valve, hydraulic network (gepland)\n"
                . "**Process Cell**: Pumping Station\n"
                . "**Area**: Sewage Pumping Group Control\n"
                . "**Complex models**: Influent Prediction\n"
                . "**Utilities**: generalFunctions, coreSync, convert, dashboardAPI\n"
                . "**Data manipulation**: onderste laag\n\n"
                . "Verticale tracks per asset-keten. Horizontale vertakkingen per ISA-88 niveau. "
                . "Stippellijncirkels = geplande maar nog niet gebouwde nodes. "
                . "Bron: EVOLV-Tracks-Maintracks.drawio.png",
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        // EVOLV-Tracks-PumpingStation: vertical dependency chain
        Document::create([
            'project_id' => $gemaal->id,
            'titel' => 'Pumping Station Afhankelijkheidsketen',
            'type' => 'technisch_ontwerp',
            'inhoud' => "Verticale afhankelijkheidsketen voor de Pumping Station track:\n\n"
                . "measurement (Control Module) → Rotating Machine (Equipment) → "
                . "machineGroupControl (Unit) → Sewage Pumping Station (Process Cell) → "
                . "Sewage Pumping Group Control (Area) → Influent Prediction (Complex) → "
                . "generalFunctions + coreSync + convert + dashboardAPI (Utilities)\n\n"
                . "Elke laag is afhankelijk van de laag erboven. Equipment-nodes die als stippellijn staan "
                . "(sump) zijn gepland maar nog niet ontwikkeld.\n"
                . "Bron: EVOLV-Tracks-PumpingStation.drawio.png",
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        // PLCEdge: network architecture VLAN separation
        Document::create([
            'project_id' => $bridge->id,
            'titel' => 'PLC/EDGE Netwerk Architectuur (VLAN-scheiding)',
            'type' => 'technisch_ontwerp',
            'inhoud' => "Netwerkarchitectuur voor de BRIDGE pilot met VLAN-scheiding:\n\n"
                . "**Extern Serverpark** (Internet): Digital Twin + Integratielaag op Edem expert system\n"
                . "**Bouvigne Serverpark** (VLAN 1): Linux Server met Digital Twin + Integratielaag\n"
                . "**On-site Gemaal/RWZI** (VLAN 2 + 3):\n"
                . "  - VLAN 3: Linux EDGE met Digital Twin + Integratielaag\n"
                . "  - VLAN 2: Siemens 1500 PLC (Typical) + Remote IO modules → Pomp\n\n"
                . "Communicatie: HTTPS tussen extern en Bouvigne, tunnel naar EDGE, OPC UA naar PLC.\n"
                . "Bron: PLCEdge-Page-1.drawio.png",
            'versie' => 2,
            'auteur_id' => $pim->id,
        ]);

        // Stack: full R&D software stack
        Document::create([
            'project_id' => $bridge->id,
            'titel' => 'R&D Stack Topologie (Cloud / EDGE / OT)',
            'type' => 'technisch_ontwerp',
            'inhoud' => "Drielaagse R&D stack architectuur:\n\n"
                . "**Cloud/Central Layer**: nginx-proxy, Nodered, Portainer, SSL CertResolver, "
                . "jenkins, influx-db, Grafana, Mosquitto, MQTT Broker, Fluffle (MQTT OUT ONLY broker), "
                . "ESL dit (single port only)\n\n"
                . "**EDGE Layer**: Mosquitto/VPN bridge, Nodered, Portainer, influx-db, "
                . "Grafana, CoreSync, Mosquitto, MQTT SX\n\n"
                . "**OT Layer**: OPCua Server → PLC\n\n"
                . "Tunnel-verbinding tussen Cloud en EDGE. OPC UA van EDGE naar OT.\n"
                . "Bron: Stack.drawio (2).png",
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        // CoreSync: local/central sync topology
        Document::create([
            'project_id' => $bridge->id,
            'titel' => 'CoreSync Netwerk Setup (Single Level)',
            'type' => 'technisch_ontwerp',
            'inhoud' => "CoreSync single-level configuratie:\n\n"
                . "**R&D lokaal ZRG (LVL 1)**: Apparaat 1 + Apparaat 2 met measurement nodes, "
                . "verbonden via Apparaat 3 (Node-Red container) met GR Bridge flows\n\n"
                . "**R&D Centraal (LVL 1)**: Apparaat 4 (Node-Red container) met GR Bridge flows, "
                . "verbonden via HTTPS naar lokaal\n\n"
                . "Notitie: Elk netwerk dat UR, DR en 1RG bijv de edges zijn dit simpel. "
                . "Ga through AZURE. Per net tekent voor edge = 1 à 1 b/u to net. "
                . "PI flow at Bouvigne.\n"
                . "Bron: CoreSync-Single level.drawio.png",
            'versie' => 1,
            'auteur_id' => $pim->id,
        ]);

        // Complex gitflow: R&D timeline with branching tracks
        Document::create([
            'project_id' => $governance->id,
            'titel' => 'R&D Tijdlijn & Releasebeleid (Gitflow)',
            'type' => 'projectplan',
            'inhoud' => "R&D release-tijdlijn als metro-tracks (gitflow model):\n\n"
                . "**Tracks**: Bestuurlijk, Hotfix, Release, Release Fixes, Studenten, Yellowchess, Budget\n\n"
                . "**Tijdlijn**:\n"
                . "- 7/'21: R&D start PRO\n"
                . "- 8/'21: Introductie met minor avans\n"
                . "- 9/'21: Start minor PA avans, Opbouw partytent\n"
                . "- 8/'21: Budget 40k\n"
                . "- Pilot v0.1 → Verhuizing loods hardenberg → Pilot v0.2\n"
                . "- Release 2.0 → 2.1\n\n"
                . "Vertakkingen tonen hoe R&D-werk splitst en samenkomt.\n"
                . "Bron: EVOLV-Tracks-complex gitflow.drawio.png",
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        // ──────────────────────────────────────────────────────────────
        // 9. Dependencies between projects
        // ──────────────────────────────────────────────────────────────

        // Afvlakkingsregeling hangt af van Gemaal 3.0 (prototype moet gevalideerd zijn)
        Afhankelijkheid::create([
            'project_id' => $afvlak->id,
            'afhankelijk_van_project_id' => $gemaal->id,
            'type' => 'technisch',
            'beschrijving' => 'De afvlakkingsregeling vereist gevalideerde prototypes van Gemaal 3.0 (× 2 kopieën) als basis voor de ketenopstelling.',
            'status' => 'open',
        ]);

        // WISE overdracht profiteert van BRIDGE architectuur (gedeelde EDGE-infrastructuur)
        Afhankelijkheid::create([
            'project_id' => $wise->id,
            'afhankelijk_van_project_id' => $bridge->id,
            'type' => 'infrastructuur',
            'beschrijving' => 'De monsternamekast draait op dezelfde EDGE-architectuur die BRIDGE valideert.',
            'status' => 'open',
        ]);

        // Gemaal 3.0 validatie van digital twins hangt samen met BRIDGE architectuur
        Afhankelijkheid::create([
            'project_id' => $gemaal->id,
            'afhankelijk_van_project_id' => $bridge->id,
            'type' => 'technisch',
            'beschrijving' => 'Digital twin validatie in Gemaal 3.0 gebruikt dezelfde EDGE-laag als bewezen in BRIDGE.',
            'status' => 'open',
        ]);

        // ══════════════════════════════════════════════════════════════════
        // 10. ONDERZOEK — Research thema with student tracks
        //
        // Track grouping based on cross-reference analysis of source docs.
        // Students who build on each other share a track (same speerpunt).
        // See CLAUDE.md "Metro Map Data Rules > Student Work Rules".
        // ══════════════════════════════════════════════════════════════════

        $themaOnderzoek = Thema::create([
            'naam' => 'Onderzoek',
            'beschrijving' => 'Afstudeer-, stage- en groepsprojecten (Avans, Fontys, TU/e). Tracks gegroepeerd op basis van cross-referenties: studenten die op elkaars werk voortbouwen delen een track.',
            'prioriteit' => Prioriteit::Midden,
            'periode_start' => '2021-07-01',
            'periode_eind' => '2026-12-31',
        ]);

        // --- Speerpunten = tracks based on cross-reference chains ---
        // See CLAUDE.md "Student Work Rules" for evidence

        // TRACK 1: Gemalen & CRC chain
        // Grace (pump curves, refs CRC 18x) → Kevin (CRC/IOT2050, refs Grace) → Robin (D.R.A.I.N., refs CRC 3x) → Adriaan (pilot 3, refs D.R.A.I.N.)
        $spGemalenCRC = Speerpunt::create([
            'thema_id' => $themaOnderzoek->id,
            'naam' => 'Gemalen & CRC Keten',
            'beschrijving' => 'Ketensamenwerking: pompefficiëntie → CRC edge computing → regelsoftware → pilot gemaalketen. Grace → Kevin → Robin → Adriaan.',
            'eigenaar_id' => $rene->id,
            'status' => SpeerpuntStatus::Actief,
        ]);

        // TRACK 2: Monitoring branch (forks from Kevin's CRC)
        // Kevin → Yamai (CRC 78x, MCSA, explicitly references Kevin)
        $spMonitoring = Speerpunt::create([
            'thema_id' => $themaOnderzoek->id,
            'naam' => 'Condition Monitoring (CRC→MCSA)',
            'beschrijving' => 'Vertakking vanuit Kevin\'s CRC: Yamai bouwt voort met Motor Current Signal Analysis voor condition-based monitoring.',
            'eigenaar_id' => $rene->id,
            'status' => SpeerpuntStatus::Actief,
        ]);

        // TRACK 3: Zuivering & Beluchting
        // Noa (beluchting 24x) ‖ Elise (algen 289x, beluchting 92x) — parallel approaches to same problem
        $spZuivering = Speerpunt::create([
            'thema_id' => $themaOnderzoek->id,
            'naam' => 'Zuivering & Beluchting',
            'beschrijving' => 'Parallelle aanpak beluchtingsprobleem: Noa (mechanisch model) en Elise (biologisch via algen). Geen directe cross-refs maar zelfde onderzoeksvraag.',
            'eigenaar_id' => $rene->id,
            'status' => SpeerpuntStatus::Actief,
        ]);

        // TRACK 4: EVOLV Reactor (standalone)
        // Pieter (EVOLV 25x, reactor 55x) — no cross-refs to other students
        $spReactor = Speerpunt::create([
            'thema_id' => $themaOnderzoek->id,
            'naam' => 'EVOLV Reactor Model',
            'beschrijving' => 'Standalone masterstage: ASM reactor model voor EVOLV. Geen cross-refs naar andere studenten, directe EVOLV-bijdrage.',
            'eigenaar_id' => $rene->id,
            'status' => SpeerpuntStatus::Actief,
        ]);

        // TRACK 5: IoT & Infrastructuur
        // Bart (IoT-hub, EDGE) → Fontys ICT (Docker/CI-CD/SOC) → Fontys TOGAF (EDGE security)
        $spIoTInfra = Speerpunt::create([
            'thema_id' => $themaOnderzoek->id,
            'naam' => 'IoT & ICT Infrastructuur',
            'beschrijving' => 'Infrastructuurketen: Bart (IoT-hub integratielaag) → Fontys ICT (Docker/CI-CD/SOC) → Fontys TOGAF (security architectuur). Alle drie raken edge-infra.',
            'eigenaar_id' => $pim->id,
            'status' => SpeerpuntStatus::Actief,
        ]);

        // --- Student projects ---

        // Adriaan Sol — Pilot 3 rioolgemaalketen
        $pAdriaan = $this->createProject([
            'speerpunt_id' => $spGemalenCRC->id,
            'naam' => 'Ontwerp Pilot 3 Rioolgemaalketen',
            'beschrijving' => 'Afstudeerstage Avans Chemische Technologie. Ontwerp van pilot 3 rioolgemaalketen bij RWZI Nieuwveer. Student: Adriaan Sol (2154257).',
            'eigenaar_id' => $rene->id,
            'status' => ProjectStatus::Evaluatie,
            'prioriteit' => Prioriteit::Midden,
            'startdatum' => '2025-04-01',
            'streef_einddatum' => '2025-10-21',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Pilot, FaseType::Evaluatie]);

        Document::create([
            'project_id' => $pAdriaan->id,
            'titel' => 'Eindverslag: Ontwerp pilot 3 rioolgemaalketen',
            'type' => 'technisch_rapport',
            'inhoud' => "Definitief eindverslag afstuderen Adriaan Sol (Avans, Chemische Technologie, PO²).\n\n"
                . "Onderwerp: Ontwerp van pilot 3 rioolgemaalketen bij RWZI Nieuwveer.\n"
                . "Focus: Procesontwerp en -optimalisatie voor de rioolgemaal testopstelling.\n"
                . "Begeleider: Rene de Ren\n"
                . "Bron: Definitief Eindverslag Waterschap Brabantse Delta Adriaan Sol 21-10-2025 - V1.docx",
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        // Robin van Weelie — D.R.A.I.N.
        $pRobin = $this->createProject([
            'speerpunt_id' => $spGemalenCRC->id,
            'naam' => 'D.R.A.I.N. – Regelsoftware Rioolgemalen',
            'beschrijving' => 'Afstudeeronderzoek naar data-gedreven en energie-efficiënte aansturing rioolgemalen. Technische analyse Hooge- en Lage Zwaluwe, invloed kelderhoogte en drukverschil op energetisch gedrag.',
            'eigenaar_id' => $rene->id,
            'status' => ProjectStatus::Evaluatie,
            'prioriteit' => Prioriteit::Hoog,
            'startdatum' => '2024-09-01',
            'streef_einddatum' => '2025-06-30',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Evaluatie]);

        Document::create([
            'project_id' => $pRobin->id,
            'titel' => 'Eindverslag D.R.A.I.N. – Robin van Weelie',
            'type' => 'technisch_rapport',
            'inhoud' => "Project D.R.A.I.N.: data-gedreven aansturing rioolgemalen.\n\n"
                . "Onderzoeksvragen: (1) Geschiktheid gemalen Hooge-/Lage Zwaluwe voor nieuwe regelsoftware, "
                . "(2) Invloed kelderhoogte en drukverschil op energetisch gedrag Hooge Zwaluwe.\n"
                . "Methode: P&ID-analyse, pompspecificaties, meetdata.\n"
                . "Bron: Eindverslag_WSBD_Robin_van_Weelie_V4-11-12.docx",
            'versie' => 4,
            'auteur_id' => $rene->id,
        ]);

        Document::create([
            'project_id' => $pRobin->id,
            'titel' => 'Werkplan Digital Twin Experiment Hooge Zwaluwe',
            'type' => 'projectplan',
            'inhoud' => "Werkplan voor Digital Twin experiment op gemaal Hooge Zwaluwe.\n\n"
                . "Competentie Experimenteren Niveau 2: aanpak kiezen en onderbouwen.\n"
                . "Digital Twin als methode voor validatie van regelsoftware.\n"
                . "Bron: Experiment Digital Twin Robin.docx",
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        // Grace van Geel — Pompefficiëntie
        $pGrace = $this->createProject([
            'speerpunt_id' => $spGemalenCRC->id,
            'naam' => 'Efficiëntie-curve Centrifugaalpompen',
            'beschrijving' => 'Afstudeeronderzoek Avans naar invloed van voordruk, verschildruk en parallel werkende pompen op de efficiëntie-curve van centrifugaalpompen. Student: Grace van Geel.',
            'eigenaar_id' => $rene->id,
            'status' => ProjectStatus::Evaluatie,
            'prioriteit' => Prioriteit::Midden,
            'startdatum' => '2023-09-01',
            'streef_einddatum' => '2024-01-12',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Experiment, FaseType::Evaluatie]);

        Document::create([
            'project_id' => $pGrace->id,
            'titel' => 'Afstudeerverslag: Efficiëntie centrifugaalpompen',
            'type' => 'technisch_rapport',
            'inhoud' => "Energie-efficiëntie van centrifugaalpompen.\n\n"
                . "Onderwerp: Invloed van voordruk, verschildruk en parallel werkende pompen op de efficiëntie-curve.\n"
                . "Student: Grace van Geel, Avans Hogeschool.\n"
                . "Team: R&D Lab, Waterschap Brabantse Delta.\n"
                . "Bron: Energie-efficiëntie van centrifugaalpompen - Afstudeerverslag Grace van Geel.pdf",
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        // Noa de Groot — Beluchtingsoptimalisatie
        $pNoa = $this->createProject([
            'speerpunt_id' => $spZuivering->id,
            'naam' => 'Optimalisatie Beluchtingsproces RWZI',
            'beschrijving' => 'Ontwerp van een nieuw model voor de optimalisatie van het beluchtingsproces in een rioolwaterzuivering. Student: Noa de Groot, Avans BML.',
            'eigenaar_id' => $rene->id,
            'status' => ProjectStatus::Evaluatie,
            'prioriteit' => Prioriteit::Midden,
            'startdatum' => '2024-01-01',
            'streef_einddatum' => '2024-06-10',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Evaluatie]);

        Document::create([
            'project_id' => $pNoa->id,
            'titel' => 'Eindverslag: Optimalisatie beluchtingsproces',
            'type' => 'technisch_rapport',
            'inhoud' => "Ontwerp van een nieuw model voor de optimalisatie van het beluchtingsproces in een RWZI.\n\n"
                . "Student: Noa de Groot, Avans BML.\n"
                . "Begeleiders: René de Ren, Angelique Asselman, Margriet van Gestel.\n"
                . "Bron: Eindverslag compleet versie 2.docx",
            'versie' => 2,
            'auteur_id' => $rene->id,
        ]);

        // Elise Nouws — Algen voor zuurstof
        $pElise = $this->createProject([
            'speerpunt_id' => $spZuivering->id,
            'naam' => 'Zuurstofproductie door Algen',
            'beschrijving' => 'Onderzoek naar zuurstofproductie door algen voor beluchtingstanks als alternatief voor mechanische beluchting. Student: Elise Nouws, Avans Chemische Technologie.',
            'eigenaar_id' => $rene->id,
            'status' => ProjectStatus::Evaluatie,
            'prioriteit' => Prioriteit::Laag,
            'startdatum' => '2024-01-01',
            'streef_einddatum' => '2024-06-11',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Experiment, FaseType::Evaluatie]);

        Document::create([
            'project_id' => $pElise->id,
            'titel' => 'Afstudeerverslag: Zuurstofproductie door algen',
            'type' => 'technisch_rapport',
            'inhoud' => "Zuurstofproductie door algen voor beluchtingstanks.\n\n"
                . "Student: Elise Nouws (2166910), Avans Chemische Technologie.\n"
                . "Begeleiding: Sanne de Krom (school), Rene de Ren (bedrijf).\n"
                . "Bron: afstudeerverslag Elise Nouws WSBD.pdf",
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        // Pieter van der Wilt — Reactor model EVOLV
        // TRACK 4: EVOLV Reactor (standalone, no student cross-refs)
        $pPieter = $this->createProject([
            'speerpunt_id' => $spReactor->id,
            'naam' => 'Non-Ideal ASM Reactor Model (EVOLV)',
            'beschrijving' => 'Masterstage: ontwikkeling van een niet-ideaal activated sludge reactor model voor het EVOLV-framework. Focus op computational setup, reaction model, transfer terms. Student: Pieter van der Wilt.',
            'eigenaar_id' => $rene->id,
            'status' => ProjectStatus::Evaluatie,
            'prioriteit' => Prioriteit::Hoog,
            'startdatum' => '2025-06-01',
            'streef_einddatum' => '2025-11-21',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Evaluatie]);

        Document::create([
            'project_id' => $pPieter->id,
            'titel' => 'Internship Report: Non-Ideal ASM for EVOLV',
            'type' => 'technisch_rapport',
            'inhoud' => "Development of a Non-Ideal Activated Sludge Reactor Model for the EVOLV Framework.\n\n"
                . "Contents: System description, model development, computational setup, assumptions, "
                . "reaction model (ASM), transfer terms.\n"
                . "Student: Pieter van der Wilt.\n"
                . "Bron: Internship_report.pdf",
            'versie' => 1,
            'auteur_id' => $rene->id,
        ]);

        // Kevin Haest — Carbon Reducing Controller
        $pKevin = $this->createProject([
            'speerpunt_id' => $spGemalenCRC->id,
            'naam' => 'Carbon Reducing Controller (Siemens IOT2050)',
            'beschrijving' => 'Afstudeerproject Avans E&T: CRC-systeem met edge computing op de Siemens IOT2050. Integratie IoT in afvalwaterzuivering. Samenwerking met Minor Procesautomatisering. Student: Kevin Haest.',
            'eigenaar_id' => $rene->id,
            'status' => ProjectStatus::Evaluatie,
            'prioriteit' => Prioriteit::Hoog,
            'startdatum' => '2023-09-01',
            'streef_einddatum' => '2024-03-21',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Pilot, FaseType::Evaluatie]);

        Document::create([
            'project_id' => $pKevin->id,
            'titel' => 'Afstudeerrapport CRC – Kevin Haest',
            'type' => 'technisch_rapport',
            'inhoud' => "Carbon Reducing Controller: Edge computing met de Siemens IOT2050.\n\n"
                . "Academie voor Techniek en Innovatie, Avans Breda.\n"
                . "Focus: IoT-integratie afvalwaterzuivering, modulair gemaal ontwerp, "
                . "samenwerking Minor Procesautomatisering (Bram van der Weijden).\n"
                . "Begeleiders: Rene de Ren, Angelique Asselman, Frank Arnouts.\n"
                . "Bron: Rapport_CRC_WSBD_KGA Haest_v3.0.docx",
            'versie' => 3,
            'auteur_id' => $rene->id,
        ]);

        // Yamai van Rooij — Condition-based monitoring + CRC + MCSA
        // TRACK 2: Monitoring branch (forks from Kevin's CRC)
        $pYamai = $this->createProject([
            'speerpunt_id' => $spMonitoring->id,
            'naam' => 'Condition-Based Monitoring & MCSA',
            'beschrijving' => 'Stage Avans IE&M: verbetering operationele efficiëntie via CRC-systeem en Motor Current Signal Analysis. Innovatie van onderhoudspraktijken en energieverbruik reductie.',
            'eigenaar_id' => $rene->id,
            'status' => ProjectStatus::Evaluatie,
            'prioriteit' => Prioriteit::Midden,
            'startdatum' => '2024-09-01',
            'streef_einddatum' => '2025-03-01',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Evaluatie]);

        Document::create([
            'project_id' => $pYamai->id,
            'titel' => 'Main Report: Condition-Based Monitoring at WBD',
            'type' => 'technisch_rapport',
            'inhoud' => "Condition-based monitoring innovations at Waterboard Brabantse Delta.\n\n"
                . "CRC-systeem implementatie en MCSA-methodologie voor pompoperaties.\n"
                . "Student: Yamai van Rooij (2186229), Avans IE&M.\n"
                . "Begeleiders: Rene de Ren, Angelique Asselman.\n"
                . "Bron: Main_report_WBD_V2.docx",
            'versie' => 2,
            'auteur_id' => $rene->id,
        ]);

        // Bart van Gool — IoT-hub integratielaag
        // TRACK 5: IoT & Infrastructuur chain
        $pBart = $this->createProject([
            'speerpunt_id' => $spIoTInfra->id,
            'naam' => 'IoT-hub Implementatie Integratielaag',
            'beschrijving' => 'Afstudeerproject Avans TI: implementatie van een IoT-hub in de integratielaag van het waterschap. Koppeling R&D en integratieteam. Student: Bart van Gool. Begeleider: Pim Moerman.',
            'eigenaar_id' => $pim->id,
            'status' => ProjectStatus::Experiment,
            'prioriteit' => Prioriteit::Midden,
            'startdatum' => '2024-02-01',
            'streef_einddatum' => '2024-08-01',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment]);

        Document::create([
            'project_id' => $pBart->id,
            'titel' => 'Plan van Aanpak: IoT-hub Integratielaag',
            'type' => 'projectplan',
            'inhoud' => "Plan van aanpak voor implementatie IoT-hub in de integratielaag.\n\n"
                . "Student: Bart van Gool (2168447), Avans TI.\n"
                . "Bedrijfsbegeleider: Pim Moerman.\n"
                . "Afdeling: R&D, Facilitair & ICT (integratie).\n"
                . "Scope: RWZI Nieuwveer + kantoor Bouvigne.\n"
                . "Bron: Plan van aanpak V4.0- Bart van Gool - 2168447 (1).docx",
            'versie' => 4,
            'auteur_id' => $pim->id,
        ]);

        // Fontys ICT groep — Docker, CI/CD, SOC
        $pFontysICT = $this->createProject([
            'speerpunt_id' => $spIoTInfra->id,
            'naam' => 'Fontys ICT Proftaak – Docker & CI/CD & SOC',
            'beschrijving' => 'Groepsopdracht Fontys ICT: (1) Docker Swarm & load balancing, (2) Geautomatiseerde CI/CD-pijplijn ter vervanging van USB-deployments, (3) SOC-implementatie voor procesautomatisering.',
            'eigenaar_id' => $pim->id,
            'status' => ProjectStatus::Concept,
            'prioriteit' => Prioriteit::Midden,
            'startdatum' => '2025-09-01',
            'streef_einddatum' => '2026-02-01',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept]);

        Document::create([
            'project_id' => $pFontysICT->id,
            'titel' => 'Opdracht Fontys ICT Proftaak',
            'type' => 'projectplan',
            'inhoud' => "Drie deelprojecten voor Fontys ICT groep:\n\n"
                . "**1. Docker Swarm**: Clusters opzetten, containers dynamisch schalen, load balancing.\n"
                . "**2. CI/CD Pipeline**: Geautomatiseerde code-deployments, geen USB-sticks meer.\n"
                . "**3. SOC**: Security Operations Center voor procesautomatisering, "
                . "monitoringtools, incident response procedures.\n"
                . "Bron: Opdracht Fontys ICT proftaak groep v0.1.docx",
            'versie' => 1,
            'auteur_id' => $pim->id,
        ]);

        // Fontys SOC/TOGAF groep
        $pTOGAF = $this->createProject([
            'speerpunt_id' => $spIoTInfra->id,
            'naam' => 'TOGAF Security Architectuur Edge-Devices',
            'beschrijving' => 'Fontys groepsproject: beveiligingsadvies op basis van TOGAF-methodiek + NIST Cybersecurity Framework voor edge-apparaten waterschap.',
            'eigenaar_id' => $pim->id,
            'status' => ProjectStatus::Concept,
            'prioriteit' => Prioriteit::Midden,
            'startdatum' => '2025-09-01',
            'streef_einddatum' => '2026-02-01',
        ], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept]);

        Document::create([
            'project_id' => $pTOGAF->id,
            'titel' => 'Groepsproject TOGAF – Beveiligingsarchitectuur',
            'type' => 'technisch_ontwerp',
            'inhoud' => "TOGAF-gebaseerd beveiligingsadvies voor edge-devices.\n\n"
                . "Stakeholder: IT-management Waterschap Brabantse Delta.\n"
                . "Kaders: TOGAF ADM + NIST Cybersecurity Framework.\n"
                . "Scope: Governance, architectuurprincipes, beveiligingsontwerp edge-computers.\n"
                . "Besluitvorming: groep → stakeholder → docenten.\n"
                . "Bron: Groepsproject TOGAF.docx",
            'versie' => 1,
            'auteur_id' => $pim->id,
        ]);

        // --- Inter-student dependencies (track chains) ---

        // TRACK 1 chain: Grace → Kevin → Robin → Adriaan
        Afhankelijkheid::create([
            'project_id' => $pKevin->id,
            'afhankelijk_van_project_id' => $pGrace->id,
            'type' => 'data',
            'beschrijving' => 'Kevin references Grace\'s pump efficiency curves (CRC 18x in Grace\'s report). CRC builds on pump characterization.',
            'status' => 'opgelost',
        ]);
        Afhankelijkheid::create([
            'project_id' => $pRobin->id,
            'afhankelijk_van_project_id' => $pKevin->id,
            'type' => 'technisch',
            'beschrijving' => 'Robin references CRC (3x) and uses Digital Twin approach enabled by Kevin\'s edge platform.',
            'status' => 'opgelost',
        ]);
        Afhankelijkheid::create([
            'project_id' => $pAdriaan->id,
            'afhankelijk_van_project_id' => $pRobin->id,
            'type' => 'technisch',
            'beschrijving' => 'Adriaan references D.R.A.I.N. (1x). Pilot 3 keten design builds on Robin\'s gemaal analysis.',
            'status' => 'opgelost',
        ]);

        // TRACK 2 branch: Kevin → Yamai
        Afhankelijkheid::create([
            'project_id' => $pYamai->id,
            'afhankelijk_van_project_id' => $pKevin->id,
            'type' => 'technisch',
            'beschrijving' => 'Yamai\'s MCSA work directly extends Kevin\'s CRC system (CRC referenced 78x). Explicitly references Kevin.',
            'status' => 'opgelost',
        ]);

        // TRACK 5 chain: Bart → Fontys ICT → Fontys TOGAF
        Afhankelijkheid::create([
            'project_id' => $pFontysICT->id,
            'afhankelijk_van_project_id' => $pBart->id,
            'type' => 'infrastructuur',
            'beschrijving' => 'Fontys ICT Docker/CI-CD work extends Bart\'s IoT-hub integration layer infrastructure.',
            'status' => 'open',
        ]);
        Afhankelijkheid::create([
            'project_id' => $pTOGAF->id,
            'afhankelijk_van_project_id' => $pFontysICT->id,
            'type' => 'technisch',
            'beschrijving' => 'TOGAF security architecture applies to the Docker/edge infrastructure set up by Fontys ICT.',
            'status' => 'open',
        ]);

        // --- Student → 2026 project dependencies ---

        Afhankelijkheid::create([
            'project_id' => $bridge->id,
            'afhankelijk_van_project_id' => $pKevin->id,
            'type' => 'technisch',
            'beschrijving' => 'BRIDGE bouwt voort op Kevin\'s CRC edge computing met Siemens IOT2050.',
            'status' => 'opgelost',
        ]);
        Afhankelijkheid::create([
            'project_id' => $gemaal->id,
            'afhankelijk_van_project_id' => $pRobin->id,
            'type' => 'data',
            'beschrijving' => 'Gemaal 3.0 gebruikt Robin\'s meetdata en analyse gemalen Hooge-/Lage Zwaluwe.',
            'status' => 'opgelost',
        ]);
        Afhankelijkheid::create([
            'project_id' => $gemaal->id,
            'afhankelijk_van_project_id' => $pPieter->id,
            'type' => 'technisch',
            'beschrijving' => 'Het ASM reactor model van Pieter is geïntegreerd in het EVOLV-framework dat Gemaal 3.0 valideert.',
            'status' => 'opgelost',
        ]);

        // ──────────────────────────────────────────────────────────────
        // 11. Kennis Artikelen — key findings extracted from student work
        // ──────────────────────────────────────────────────────────────

        KennisArtikel::create([
            'titel' => 'ISA-88 Node Hiërarchie voor EVOLV Digital Twins',
            'inhoud' => "De EVOLV digital twin architectuur volgt de ISA-88 (S88) batch control standaard:\n\n"
                . "Control Module → Equipment → Unit → Process Cell → Area → Complex Models → Utilities\n\n"
                . "Elke laag heeft eigen Node-RED nodes. Verticale afhankelijkheden bepalen de dataflow. "
                . "Horizontale vertakkingen per niveau representeren parallelle assets.\n\n"
                . "Voorbeeld Pumping Station keten: measurement → Rotating Machine → machineGroupControl → "
                . "Sewage Pumping Station → Sewage Pumping Group Control → Influent Prediction.",
            'auteur_id' => $rene->id,
        ]);

        KennisArtikel::create([
            'titel' => 'VLAN-scheiding OT/IT voor EDGE-implementatie',
            'inhoud' => "De EDGE-architectuur gebruikt drie VLAN-niveaus:\n\n"
                . "VLAN 1 (Bouvigne): Linux server met Digital Twin + Integratielaag\n"
                . "VLAN 2 (On-site OT): Siemens 1500 PLC + Remote IO\n"
                . "VLAN 3 (On-site IT): Linux EDGE met Digital Twin + Integratielaag\n\n"
                . "Communicatie: HTTPS extern→Bouvigne, tunnel Bouvigne→EDGE, OPC UA EDGE→PLC.\n"
                . "Gevalideerd in de BRIDGE pilot Klundert.",
            'auteur_id' => $pim->id,
        ]);

        KennisArtikel::create([
            'titel' => 'Carbon Reducing Controller (CRC) — Siemens IOT2050',
            'inhoud' => "De CRC is een edge-computing oplossing op de Siemens IOT2050 voor CO₂-reductie "
                . "in de afvalwaterzuivering.\n\n"
                . "Ontwikkeld door Kevin Haest (Avans E&T, 2024). Combineert IoT met procesautomatisering. "
                . "Het modulaire gemaal ontwerp integreert lessen uit eerdere prototypes.\n\n"
                . "Motor Current Signal Analysis (MCSA) door Yamai van Rooij (2025) bouwt hierop voort "
                . "voor condition-based monitoring van pompoperaties.",
            'auteur_id' => $rene->id,
        ]);

        KennisArtikel::create([
            'titel' => 'Efficiëntiecurves Centrifugaalpompen — Meetresultaten',
            'inhoud' => "Onderzoek Grace van Geel (Avans, 2024) toont aan dat:\n\n"
                . "- Voordruk significant de efficiëntiecurve van centrifugaalpompen beïnvloedt\n"
                . "- Verschildruk de optimale werking verschuift\n"
                . "- Parallel werkende pompen een ander efficiëntieprofiel geven dan individuele pompen\n\n"
                . "Deze bevindingen zijn relevant voor de Gemaal 3.0 digital twin validatie "
                . "en de afvlakkingsregeling in de gemalenketen.",
            'auteur_id' => $rene->id,
        ]);

        KennisArtikel::create([
            'titel' => 'R&D Stack — Drielaagse Architectuur',
            'inhoud' => "De R&D-stack bestaat uit drie lagen:\n\n"
                . "**Cloud/Central**: nginx-proxy, Node-RED, Portainer, Jenkins, InfluxDB, Grafana, Mosquitto MQTT\n"
                . "**EDGE**: Node-RED, Portainer, InfluxDB, Grafana, CoreSync, Mosquitto\n"
                . "**OT**: OPC UA Server → PLC\n\n"
                . "CoreSync verzorgt synchronisatie tussen lokaal (ZRG) en centraal (Bouvigne) niveau. "
                . "Fluffle is een write-only MQTT bridge voor veilige data-export.",
            'auteur_id' => $rene->id,
        ]);
    }

    /**
     * Helper: create a project with its completed and active phases.
     */
    private function createProject(array $attributes, array $faseTypes): Project
    {
        $project = Project::create($attributes);

        $project->teamleden()->attach($attributes['eigenaar_id'], ['rol' => ProjectRol::Eigenaar->value]);

        foreach ($faseTypes as $index => $faseType) {
            $isLast = $index === count($faseTypes) - 1;

            Fase::create([
                'project_id' => $project->id,
                'type' => $faseType,
                'status' => $isLast ? FaseStatus::Actief : FaseStatus::Afgerond,
                'startdatum' => now()->subMonths(count($faseTypes) - 1 - $index),
                'einddatum' => $isLast ? null : now()->subMonths(count($faseTypes) - 2 - $index),
            ]);
        }

        return $project;
    }
}
