#!/usr/bin/env python3
"""Genereer PGS 15 DOC 3 (Werkinstructie) + DOC 4 (Compliance Toets) — Phoenix Metals B.V."""

from docx import Document
from docx.shared import Pt, Cm, RGBColor, Inches, Emu
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
import os

# === Kleuren ===
BLUE = RGBColor(0, 51, 102)       # #003366 primair
ORANGE = RGBColor(0xFF, 0x66, 0x00)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK = RGBColor(0x1F, 0x29, 0x37) # #1F2937 tekst
GREEN = RGBColor(0x00, 0xA8, 0x59)
AMBER = RGBColor(0xF5, 0x9E, 0x0B)
RED_C = RGBColor(0xEF, 0x44, 0x44)
GREY = RGBColor(0x88, 0x88, 0x88)

LOGO_PATH = '/root/projects/jg/assets/branding/jvg-logo-white-medium.png'
OUT_DIR = '/root/projects/jg/2026-pgs15-2025-phoenix-metals/deliverables/docx'

# ============================================================
# SHARED HELPERS
# ============================================================
def setup_styles(doc):
    style = doc.styles['Normal']
    style.font.name = 'Calibri'
    style.font.size = Pt(11)
    style.font.color.rgb = DARK
    style.paragraph_format.space_after = Pt(4)
    style.paragraph_format.line_spacing = 1.15
    for lvl in range(1, 4):
        hs = doc.styles[f'Heading {lvl}']
        hs.font.color.rgb = BLUE
        hs.font.name = 'Calibri'
        hs.font.size = Pt(16 if lvl == 1 else 14 if lvl == 2 else 12)
        hs.font.bold = True

def add_para(doc, text, bold=False, italic=False, align=None, size=None, color=None, space_after=Pt(4)):
    p = doc.add_paragraph()
    run = p.add_run(text)
    run.bold = bold
    run.italic = italic
    if size: run.font.size = size
    if color: run.font.color.rgb = color
    if align: p.alignment = align
    p.paragraph_format.space_after = space_after
    return p

def add_bullet(doc, text, level=0, bold_prefix=None):
    p = doc.add_paragraph(style='List Bullet')
    if bold_prefix:
        r = p.add_run(bold_prefix)
        r.bold = True
        r.font.size = Pt(11)
        r2 = p.add_run(text)
        r2.font.size = Pt(11)
    else:
        r = p.add_run(text)
        r.font.size = Pt(11)
    p.paragraph_format.left_indent = Cm(1.5 + level * 0.8)
    p.paragraph_format.space_after = Pt(2)
    return p

def set_cell_shading(cell, color_hex):
    shading = cell._element.get_or_add_tcPr()
    bg = shading.makeelement(qn('w:shd'), {qn('w:fill'): color_hex, qn('w:val'): 'clear'})
    shading.append(bg)

def add_styled_table(doc, headers, rows, col_widths=None, header_color='FF6600'):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Light Grid Accent 1'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    for i, h in enumerate(headers):
        c = table.rows[0].cells[i]
        c.text = ''
        p = c.paragraphs[0]
        r = p.add_run(h)
        r.bold = True
        r.font.size = Pt(9.5)
        r.font.color.rgb = WHITE
        set_cell_shading(c, header_color)
    for ri, row in enumerate(rows):
        for ci, val in enumerate(row):
            c = table.rows[ri+1].cells[ci]
            c.text = ''
            p = c.paragraphs[0]
            r = p.add_run(str(val))
            r.font.size = Pt(9.5)
    if col_widths:
        for i, w in enumerate(col_widths):
            for row in table.rows:
                row.cells[i].width = Cm(w)
    return table

def add_separator(doc):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(2)
    p.paragraph_format.space_after = Pt(2)
    r = p.add_run('─' * 80)
    r.font.color.rgb = RGBColor(0xCC, 0xCC, 0xCC)
    r.font.size = Pt(6)

def add_logo_header(doc):
    """Add logo to header if file exists."""
    if os.path.exists(LOGO_PATH):
        section = doc.sections[0]
        header = section.header
        hp = header.paragraphs[0] if header.paragraphs else header.add_paragraph()
        hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        run = hp.add_run()
        run.add_picture(LOGO_PATH, width=Cm(2.0), height=Cm(1.8))

def add_title_page(doc, title, subtitle, info_rows):
    for _ in range(4):
        doc.add_paragraph()
    add_para(doc, title, bold=True, align=WD_ALIGN_PARAGRAPH.CENTER, size=Pt(28), color=BLUE, space_after=Pt(2))
    add_para(doc, subtitle, bold=True, align=WD_ALIGN_PARAGRAPH.CENTER, size=Pt(16), color=ORANGE, space_after=Pt(20))
    for _ in range(2):
        doc.add_paragraph()
    t = doc.add_table(rows=len(info_rows), cols=2)
    t.alignment = WD_TABLE_ALIGNMENT.CENTER
    for i, (k, v) in enumerate(info_rows):
        c0, c1 = t.rows[i].cells[0], t.rows[i].cells[1]
        c0.width, c1.width = Cm(4), Cm(8)
        c0.text = ''
        c1.text = ''
        r0 = c0.paragraphs[0].add_run(k)
        r0.bold = True
        r0.font.size = Pt(11)
        r0.font.color.rgb = BLUE
        r1 = c1.paragraphs[0].add_run(v)
        r1.font.size = Pt(11)
    doc.add_page_break()

def add_footer_note(doc, text):
    add_para(doc, '')
    add_separator(doc)
    add_para(doc, text, italic=True, size=Pt(9), color=GREY)


# ============================================================
# DOC 3: WERKINSTRUCTIE OPSLAG & H-ZIN BEHEER
# ============================================================
def generate_werkinstructie():
    doc = Document()
    setup_styles(doc)
    add_logo_header(doc)

    add_title_page(doc,
        'WERKINSTRUCTIE',
        'PGS 15:2025 — Opslag & H-zin Beheer',
        [
            ('Bedrijf:', 'Phoenix Metals B.V.'),
            ('Locatie:', 'PlantOne Rotterdam'),
            ('Datum:', '27 april 2026'),
            ('Versie:', '1.0'),
            ('Auteur:', 'HSEQ Manager / Kas'),
            ('Opslagniveau:', 'C-niveau'),
            ('Doelgroep:', 'Operators, magazijnmedewerkers, laboranten'),
        ]
    )

    # === 1. Stappenplan ===
    doc.add_heading('1. Stappenplan: Stof Toevoegen aan Opslag', level=1)

    steps = [
        ('1', 'Informatie verzamelen',
         'Verzamel: productnaam, CAS-nummer, SDS (altijd vóór levering opvragen), ADR-klasse, Verpakkingsgroep (VG), CLP-classificatie (H-zinnen).'),
        ('2', 'HSE-goedkeuring',
         'Vul het HSE Chemical Request Form in. HSE Manager beoordeelt risico\'s en opslagcompatibiliteit. Pas na goedkeuring: stof bestellen.'),
        ('3', 'Classificeren',
         'Bepaal: ADR-klasse (2, 3, 4.1, 4.2, 4.3, 5.1, 5.2, 6.1, 6.2, 8, 9), Verpakkingsgroep (I, II, III), CMR-status, Acute Toxiciteit (Cat. 1, 2, 3).'),
        ('4', 'Niveaubepaling',
         'Controleer of de stof boven de ondergrens van PGS 15:2025 Tabel 2 valt. Zie tabel hieronder.'),
        ('5', 'Opslaglocatie bepalen',
         'Raadpleeg scheidingstabel (Bijlage E PGS 15:2025). Controleer verenigbaarheid met reeds opgeslagen stoffen. Wijs juiste vak toe (Zone A: bijtend, Zone B: giftig, Zone C: overig).'),
        ('6', 'Registreren',
         'Voeg de stof toe aan de Stoffenregistratie (Registration Chemicals MASTER). Noteer: naam, CAS, ADR, CLP, hoeveelheid, locatie, leverancier, datum.'),
        ('7', 'Fysiek opslaan',
         'Plaats in aangewezen vak. Controleer etikettering. Zorg voor gesloten verpakking. Controleer productopvang onder stelling.'),
    ]

    for num, title, desc in steps:
        p = doc.add_paragraph()
        r = p.add_run(f'Stap {num}: {title}')
        r.bold = True
        r.font.color.rgb = ORANGE
        r.font.size = Pt(12)
        p.paragraph_format.space_after = Pt(2)
        add_bullet(doc, desc)
        add_para(doc, '', space_after=Pt(2))

    # Niveaubepaling tabel
    add_styled_table(doc,
        ['ADR-klasse', 'VG', 'Ondergrens'],
        [
            ['Alle', 'I', '1 kg'],
            ['6.1', 'II/III', '50 kg'],
            ['8', 'II/III', '250 kg'],
            ['3', 'II', '25 kg'],
            ['3', 'III', '50 kg'],
            ['CMR-stoffen', '—', '25 kg'],
            ['CLP Acute Tox. 1/2/3', '—', '1 kg'],
        ],
        col_widths=[4, 3, 4]
    )

    # === 2. H-zin Interpretatie ===
    doc.add_heading('2. H-zin Interpretatie en Classificatie', level=1)
    doc.add_heading('2.1 Belangrijkste H-zinnen voor Phoenix Metals', level=2)

    add_styled_table(doc,
        ['H-zin', 'Betekenis', 'Gevarencategorie', 'Impact op opslag'],
        [
            ['H314', 'Veroorzaakt ernstige brandwonden en oogletsel', 'Skin Corr. 1A/1B', 'ADR 8, basisveiligheidsniveau'],
            ['H315', 'Veroorzaakt huidirritatie', 'Skin Irrit. 2', 'Geen PGS 15-impact'],
            ['H318', 'Veroorzaakt ernstig oogletsel', 'Eye Dam. 1', 'Geen specifiek niveau'],
            ['H319', 'Veroorzaakt oogirritatie', 'Eye Irrit. 2', 'Geen PGS 15-impact'],
            ['H330', 'Dodelijk bij inademing', 'Acute Tox. 2', 'C-niveau vanaf 1 kg'],
            ['H335', 'Kan luchtwegen irriteren', 'STOT SE 3', 'Geen specifiek niveau'],
            ['H350i', 'Kan kanker veroorzaken bij inademing', 'Carc. 1B', 'CMR — extra maatregelen'],
            ['H361fd', 'Vermoedelijk schadelijk voor vruchtbaarheid', 'Repr. 2', 'CMR — extra maatregelen'],
            ['H372', 'Schade aan organen bij langdurige blootstelling', 'STOT RE 1', 'Geen specifiek niveau'],
            ['H302', 'Schadelijk bij inslikken', 'Acute Tox. 4', 'Geen PGS 15-niveau'],
            ['H312', 'Schadelijk bij contact met de huid', 'Acute Tox. 4', 'Geen PGS 15-niveau'],
        ],
        col_widths=[1.8, 4.5, 3.2, 4.5]
    )

    doc.add_heading('2.2 H-zin → Opslagniveau vertaling', level=2)
    add_styled_table(doc,
        ['H-zin categorie', 'Niveau vanaf ondergrens'],
        [
            ['H330, H310, H300 (Acute Tox. 1/2)', 'C-niveau'],
            ['H331, H311, H301 (Acute Tox. 3)', 'C-niveau'],
            ['H350, H350i, H340 (Carc./Mut. 1A/1B)', 'Via ADR-route + CMR-maatregelen'],
            ['H360, H360f, H360Fd (Repr. 1A/1B)', 'Via ADR-route + CMR-maatregelen'],
            ['H314 (Skin Corr. 1A/1B)', 'ADR 8 → basisveiligheidsniveau'],
        ],
        col_widths=[6, 8]
    )

    # === 3. Niveaubepaling per Stof ===
    doc.add_heading('3. Niveaubepaling per Stof — Phoenix Metals Voorbeelden', level=1)

    examples = [
        ('Voorbeeld 1: Sodium hydroxide 50% oplossing',
         ['ADR: 8 / II → Ondergrens 250 kg → Hoeveelheid 120 kg → Onder ondergrens',
          'CLP: Skin Corr. 1A (H314) → Geen CMR, geen Acute Tox.',
          'Resultaat: Basisveiligheidsniveau (bijdragend aan ADR 8 aggregaat)']),
        ('Voorbeeld 2: Sulfuric acid 75% oplossing',
         ['ADR: 8 / II → Ondergrens 250 kg → Hoeveelheid 50 kg → Onder ondergrens',
          'CLP: Skin Corr. 1A (H314) → Geen CMR, geen Acute Tox.',
          'Resultaat: Basisveiligheidsniveau']),
        ('Voorbeeld 3: Vanadium(V) oxide (V₂O₅) — KRITIEK',
         ['ADR: 6.1 / II → Ondergrens 50 kg',
          'CLP Acute Tox. 2 (H330): Ondergrens 1 kg → C-niveau',
          'CLP Carc. 1B (H350i): CMR, ondergrens 25 kg → via ADR-route',
          'Resultaat: C-niveau vanaf 1 kg — bepaalt opslagniveau voor hele locatie']),
    ]
    for title, items in examples:
        doc.add_heading(title, level=2)
        for item in items:
            add_bullet(doc, item)

    # === 4. PGS 15 Scanner Tool ===
    doc.add_heading('4. Gebruik PGS 15 Scanner Tool', level=1)
    add_para(doc, 'De PGS 15 Scanner tool automatiseert de niveaubepaling op basis van ingevoerde stofdata (CAS, ADR, CLP, hoeveelheid).')
    add_bullet(doc, 'Open de PGS 15 Scanner')
    add_bullet(doc, 'Voer per stof in: CAS-nummer, productnaam, ADR-klasse, VG, H-zinnen, hoeveelheid (kg)')
    add_bullet(doc, 'De tool berekent automatisch: ondergrens toetsing, ADR-route niveau, CLP-route niveau, aggregatie, strengste niveau')
    add_bullet(doc, 'Resultaat opgeslagen als JSON (compatibel met scanner_compliance_data_v1.0.json)')

    # === 5. Checklist ===
    doc.add_heading('5. Checklist Nieuwe Stof', level=1)
    checklist_items = [
        'SDS ontvangen en beoordeeld',
        'HSE Chemical Request Form ingevuld',
        'ADR-klasse + VG bepaald',
        'H-zinnen geïdentificeerd',
        'CMR-status gecontroleerd',
        'Acute Tox. categorie gecontroleerd',
        'Ondergrens Tabel 2 gecontroleerd',
        'Niveaubepaling uitgevoerd',
        'Scheidingstabel geraadpleegd',
        'Opslagvak toegewezen',
        'Stoffenregistratie bijgewerkt',
        'Etikettering gecontroleerd',
        "PBM's bepaald",
    ]
    add_styled_table(doc,
        ['#', 'Controle', '✅/❌'],
        [[str(i+1), item, '☐'] for i, item in enumerate(checklist_items)],
        col_widths=[1, 10, 2]
    )

    add_footer_note(doc,
        'Werkinstructie Opslag & H-zin Beheer v1.0 — Phoenix Metals — 27 april 2026\n'
        'Goedgekeurd door HSEQ Manager. Herzieningsdatum: april 2027 of bij wijzigingen.'
    )

    out = os.path.join(OUT_DIR, 'PGS15_Werkinstructie_Opslag_Hzinnen_v1.0.docx')
    os.makedirs(OUT_DIR, exist_ok=True)
    doc.save(out)
    sz = os.path.getsize(out)
    print(f'✅ DOC 3 opgeslagen: {out} ({sz:,} bytes)')
    return out


# ============================================================
# DOC 4: COMPLIANCE TOETS PGS 15:2025
# ============================================================
def generate_compliance_toets():
    doc = Document()
    setup_styles(doc)
    add_logo_header(doc)

    add_title_page(doc,
        'COMPLIANCE TOETS',
        'PGS 15:2025 — Phoenix Metals B.V.',
        [
            ('Bedrijf:', 'Phoenix Metals B.V.'),
            ('Locatie:', 'PlantOne Rotterdam'),
            ('Datum:', '27 april 2026'),
            ('Versie:', '1.0'),
            ('Bepaald opslagniveau:', 'C-niveau'),
            ('Beoordelingsperiode:', 'April 2026'),
            ('Status:', 'CONCEPT'),
        ]
    )

    # === 1. Samenvatting ===
    doc.add_heading('1. Samenvatting', level=1)
    add_styled_table(doc,
        ['Themagebied', 'Score', '# Doelstellingen'],
        [
            ['Brandveiligheid', '⚠️ Gedeeltelijk', '2 voldoet, 4 gedeeltelijk, 5 niet te toetsen'],
            ['Gezondheid', '⚠️ Gedeeltelijk', '2 voldoet, 3 gedeeltelijk, 3 niet te toetsen'],
            ['Milieu', '❓ Grotendeels niet te toetsen', '1 voldoet, 1 gedeeltelijk, 4 niet te toetsen'],
            ['Constructief (C-niveau)', '❓ Niet te toetsen', '6 niet te toetsen'],
            ['Organisatorisch', '⚠️ Gedeeltelijk', '3 voldoet, 4 gedeeltelijk, 3 niet te toetsen'],
            ['Seveso/BRZO', '✅ Voldoet', '4 voldoet'],
        ],
        col_widths=[3.5, 4, 6]
    )
    add_para(doc, 'Phoenix Metals beschikt over een basis HSE-infrastructuur. PGS 15:2025-specifieke naleving is onvoldoende aangetoond voor C-niveau.', italic=True)

    # === 2. Brandveiligheid ===
    doc.add_heading('2. Brandveiligheid', level=1)

    doc.add_heading('2.1 D8 — Voorkomen ontsteking', level=2)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [
            ['1', 'Rookverbod opslagruimte', 'M95', '⚠️ Gedeeltelijk', 'Algemeen rookverbod in HSE policy. Zone-indeling rond opslag niet aangetoond.'],
            ['2', 'Aarding statische elektriciteit', 'M99', '❓ Niet te toetsen', 'Niet gedocumenteerd. Relevant bij V₂O₅ poederoverslag.'],
            ['3', 'Ontstekingsbronnenbeheersing', 'M96-M100', '⚠️ Gedeeltelijk', 'Algemene HSE-maatregelen aanwezig. PGS 15-specifieke invulling ontbreekt.'],
        ],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )
    add_para(doc, 'Maatregelen:', bold=True, space_after=Pt(2))
    for m in ['Formuleer expliciet rookverbod binnen 5 m van opslagruimte',
              'Aardingsprocedure voor overgang/overslag van stoffen',
              'Inventariseer ontstekingsbronnen in/nabij opslag']:
        add_bullet(doc, f'☐ {m}')

    doc.add_heading('2.2 D9 — Voorkomen brand in opslag', level=2)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [['4', 'Brandbare materialen buiten opslag', 'M101', '❓ Niet te toetsen', 'Niet gedocumenteerd.']],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    doc.add_heading('2.3 D6 — Hulpdiensten', level=2)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [['5', 'Toegankelijkheid hulpdiensten', 'M109', '⚠️ Gedeeltelijk', 'Tata Steel terrein — bereikbaarheid waarschijnlijk OK via Tata HSE. Specifieke PGS 15-toets ontbreekt.']],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    doc.add_heading('2.4 D7 — Verspreiding voorkomen (C-niveau)', level=2)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [
            ['6', 'Wbdbo 60 min constructie', 'Tabel 6', '❓ Niet te toetsen', 'Constructieve details niet beschikbaar.'],
            ['7', 'Branddetectie (NEN 2535)', 'M103', '❓ Niet te toetsen', 'Branddetectiesysteem niet gedocumenteerd. C-niveau vereist dit.'],
            ['8', 'Brandwerende wanden', 'Doel D7', '❓ Niet te toetsen', 'Niet gedocumenteerd.'],
        ],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    doc.add_heading('2.5 D10/D11 — Compartimentering en actieve brandbeheersing', level=2)
    add_para(doc, 'Niet van toepassing op C-niveau (pas bij B-niveau).', italic=True)
    doc.add_heading('2.6 D12 — Automatische blussing', level=2)
    add_para(doc, 'Niet van toepassing op C-niveau (pas bij A-niveau, >10 ton V₂O₅).', italic=True)

    # === 3. Gezondheid ===
    doc.add_heading('3. Gezondheid', level=1)

    doc.add_heading('3.1 D4 — Lekkagebeheersing', level=2)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [
            ['10', 'Productopvang voorziening', 'M30', '❓ Niet te toetsen', 'Niet gedocumenteerd. Vereist voor H₂SO₄, NaOH en V₂O₅.'],
            ['11', 'Vloeistofdichte vloer', 'M31', '❓ Niet te toetsen', 'Niet gedocumenteerd.'],
            ['12', 'Afvoer afvalwater', 'M32', '❓ Niet te toetsen', 'Niet gedocumenteerd.'],
        ],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    doc.add_heading('3.2 Blootstelling', level=2)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [
            ['13', 'Ventilatie opslagruimte', 'M25-M28', '❓ Niet te toetsen', 'Niet gedocumenteerd. Kritiek bij H₂SO₄ (dampen) en V₂O₅ (poeder).'],
            ['14', 'Sluiten verpakkingen', 'M33', '⚠️ Gedeeltelijk', 'Jerrycans sluitbaar. Procedures niet expliciet gedocumenteerd.'],
            ['15', 'CMR-maatregelen V₂O₅', 'AI-06', '⚠️ Gedeeltelijk', 'CMR-procedure aanwezig. Toepassing op V₂O₅ moet worden bevestigd.'],
        ],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    doc.add_heading("3.3 PBM's", level=2)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [
            ['16', 'PBM-beleid', '—', '✅ Voldoet', 'PS-201-NL_V1.0 PBM-beleid + PBM-matrix aanwezig.'],
            ['17', "PBM's voor V₂O₅", 'AI-06', '⚠️ Gedeeltelijk', 'Specifieke PBM-selectie voor V₂O₅ (P3-masker) niet aangetoond.'],
            ['18', "PBM's voor bijtende stoffen", '—', '✅ Voldoet', 'HSE policy dekt NaOH/H₂SO₄.'],
        ],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    doc.add_heading('3.4 Gezondheidstoezicht', level=2)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [
            ['19', 'AGO voor CMR-blootstelling', 'Arbowet', '❓ Niet te toetsen', 'Periodiek AGO voor V₂O₅-blootgestelden niet gedocumenteerd.'],
            ['20', 'Blootstellingsregister', 'Arbowet', '❓ Niet te toetsen', 'Niet aangetoond.'],
        ],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    # === 4. Milieu ===
    doc.add_heading('4. Milieu', level=1)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [
            ['21', 'Omgevingsvergunning', 'Omgevingswet', '⚠️ Gedeeltelijk', 'Vergunningstraject in gang (haalbaarheidsstudie). Status onbekend.'],
            ['22', 'Environmental compliance register', '—', '✅ Voldoet', 'Environmental Aspects and Compliance Register.xlsx aanwezig.'],
            ['23', 'Afvang bijtende vloeistoffen', 'Doel D4', '❓ Niet te toetsen', 'Opvangcapaciteit niet gedocumenteerd.'],
            ['24', 'Afvang CMR-poeders', 'Doel D4', '❓ Niet te toetsen', 'Stofvrije opslag + afvang V₂O₅ niet aangetoond.'],
        ],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    # === 5. Constructieve Eisen ===
    doc.add_heading('5. Constructieve Eisen (C-niveau)', level=1)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [
            ['25', 'Wbdbo 60 min', 'Tabel 6', '❓ Niet te toetsen', 'Constructieve details ontbreken.'],
            ['26', 'Branddetectie (NEN 2535)', 'M103', '❓ Niet te toetsen', 'Niet gedocumenteerd.'],
            ['27', 'Brandwerende wanden', 'D7', '❓ Niet te toetsen', 'Niet gedocumenteerd.'],
            ['28', 'Stellingen stabiel + aarding', 'M14', '⚠️ Gedeeltelijk', 'Stellingen aanwezig. Stabiliteit/aarding niet aangetoond.'],
            ['29', 'Aanrijdbeveiliging', 'M14', '❓ Niet te toetsen', 'Niet gedocumenteerd.'],
            ['30', 'Dakconstructie', '—', 'N.v.t.', 'Niet van toepassing bij binnenopslag <10 ton (C-niveau).'],
        ],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    # === 6. Organisatorische Eisen ===
    doc.add_heading('6. Organisatorische Eisen', level=1)

    doc.add_heading('6.1 Administratief', level=2)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [
            ['31', 'Stoffenregistratie compleet', 'M20', '⚠️ Gedeeltelijk', 'MASTER v2.1.0 aanwezig maar incompleet — V₂O₅ ontbreekt.'],
            ['32', 'Etikettering verpakkingen', 'M21', '❓ Niet te toetsen', 'Niet gecontroleerd.'],
            ['33', 'SDS beschikbaar', 'M22', '✅ Voldoet', 'SDS voor NaOH, H₂SO₄, V₂O₅ beschikbaar.'],
            ['34', 'Goedkeuring nieuwe stoffen', 'M23', '✅ Voldoet', 'HSE Chemical Request Form + procedure aanwezig.'],
        ],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    doc.add_heading('6.2 Opleiding', level=2)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [
            ['35', 'Instructie medewerkers', 'M87', '⚠️ Gedeeltelijk', 'Algemene HSE-instructie aanwezig. PGS 15-specifieke training ontbreekt.'],
            ['36', 'Training CMR/V₂O₅', 'AI-06', '❓ Niet te toetsen', 'Niet aangetoond.'],
            ['37', 'Noodprocedure', 'M88-M89', '⚠️ Gedeeltelijk', 'RI&E bevat noodprocedure. PGS 15-specifiek noodplan ontbreekt.'],
        ],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    doc.add_heading('6.3 Procedures', level=2)
    add_styled_table(doc,
        ['#', 'Eis', 'Ref.', 'Status', 'Toelichting'],
        [
            ['38', 'Procedure opslag gevaarlijke stoffen', 'AI-83', '⚠️ Gedeeltelijk', 'Algemene procedure aanwezig. PGS 15-specifieke invulling vereist.'],
            ['39', 'TRA voor werkzaamheden', '—', '✅ Voldoet', 'TRA-systeem aanwezig.'],
            ['40', 'Periodieke inspectie opslag', 'M87', '❓ Niet te toetsen', 'Niet gedocumenteerd.'],
        ],
        col_widths=[0.8, 3.5, 1.5, 2.5, 5.5]
    )

    # === 7. Seveso/BRZO ===
    doc.add_heading('7. Seveso/BRZO', level=1)
    add_styled_table(doc,
        ['#', 'Eis', 'Status', 'Toelichting'],
        [
            ['41', 'Seveso-indicatie', '✅ Voldoet', 'Geen drempels overschreden (Arcadis, sept 2025).'],
            ['42', 'V₂O₅ <50 ton', '✅ Voldoet', 'Pilot-productie <50 ton/jaar.'],
            ['43', 'H₂SO₄ <500 ton', '✅ Voldoet', '~200 L opslag.'],
            ['44', 'NaOH <500 ton', '✅ Voldoet', '~100 L opslag.'],
        ],
        col_widths=[0.8, 4, 2.5, 6]
    )

    # === 8. Actiepunten ===
    doc.add_heading('8. Actiepunten', level=1)
    add_styled_table(doc,
        ['#', 'Prioriteit', 'Actie', 'Thema', 'Deadline'],
        [
            ['A01', '🔴 Hoog', 'Implementeer branddetectie (NEN 2535) in opslagruimte', 'Constructief', '[TBV]'],
            ['A02', '🔴 Hoog', 'Toets Wbdbo constructieve brandwerendheid (60 min)', 'Constructief', '[TBV]'],
            ['A03', '🔴 Hoog', 'Completeer stoffenregistratie (voeg V₂O₅ toe)', 'Organisatorisch', '[TBV]'],
            ['A04', '🔴 Hoog', 'Implementeer scheiding zuur/base (H₂SO₄ ↔ NaOH)', 'Brandveiligheid', '[TBV]'],
            ['A05', '🔴 Hoog', 'Implementeer scheiding giftig/bijtend (V₂O₅ ↔ ADR 8)', 'Brandveiligheid', '[TBV]'],
            ['A06', '🟡 Midden', 'Documenteer ventilatie-eisen opslagruimte', 'Gezondheid', '[TBV]'],
            ['A07', '🟡 Midden', "Specificeer PBM's voor V₂O₅ handling (P3-masker)", 'Gezondheid', '[TBV]'],
            ['A08', '🟡 Midden', 'Start AGO-programma voor V₂O₅-blootgestelden', 'Gezondheid', '[TBV]'],
            ['A09', '🟡 Midden', 'Opzetten blootstellingsregister V₂O₅', 'Gezondheid', '[TBV]'],
            ['A10', '🟡 Midden', 'Implementeer productopvang voor jerrycans', 'Milieu', '[TBV]'],
            ['A11', '🟡 Midden', 'PGS 15-specifieke training medewerkers', 'Organisatorisch', '[TBV]'],
            ['A12', '🟡 Midden', 'Documenteer PGS 15-specifiek noodplan', 'Organisatorisch', '[TBV]'],
            ['A13', '🟢 Laag', 'Verifieer aarding stellingen', 'Constructief', '[TBV]'],
            ['A14', '🟢 Laag', 'Installeer aanrijdbeveiliging', 'Constructief', '[TBV]'],
            ['A15', '🟢 Laag', 'Verifieer CaO ADR-classificatie', 'Organisatorisch', '[TBV]'],
        ],
        col_widths=[1, 2, 5.5, 2.5, 1.5]
    )

    # === 9. Beoordelingsscore ===
    doc.add_heading('9. Beoordelingsscore', level=1)
    add_styled_table(doc,
        ['Score', 'Aantal', 'Percentage'],
        [
            ['✅ Voldoet', '7', '18%'],
            ['⚠️ Gedeeltelijk', '12', '31%'],
            ['❓ Niet te toetsen', '20', '51%'],
            ['❌ Niet voldoende', '0', '0%'],
        ],
        col_widths=[4, 3, 3]
    )
    add_para(doc, 'Conclusie: 49% van de PGS 15:2025-doelstellingen kan niet worden getoetst op basis van beschikbare documentatie. '
             '31% is gedeeltelijk ingevuld. Directe actie vereist voor de 5 hoog-prioritaire actiepunten (A01-A05) om aan C-niveau te voldoen.',
             bold=True, space_after=Pt(12))

    add_footer_note(doc,
        'Compliance Toets PGS 15:2025 v1.0 — Phoenix Metals — 27 april 2026\n'
        'Goedgekeurd door HSEQ Manager. Herzieningsdatum: april 2027 of bij wijzigingen.'
    )

    out = os.path.join(OUT_DIR, 'PGS15_Compliance_Toets_v1.0.docx')
    doc.save(out)
    sz = os.path.getsize(out)
    print(f'✅ DOC 4 opgeslagen: {out} ({sz:,} bytes)')
    return out


# ============================================================
# MAIN
# ============================================================
if __name__ == '__main__':
    f1 = generate_werkinstructie()
    f2 = generate_compliance_toets()
    for f in [f1, f2]:
        sz = os.path.getsize(f)
        status = '✅' if sz > 10000 else '⚠️ TE KLEIN'
        print(f'{status} {os.path.basename(f)}: {sz:,} bytes')
