#!/usr/bin/env python3
"""PGS 15 Master SOP Opslagveiligheid D4 — Phoenix Metals B.V. v1.0"""
import json, os
from docx import Document
from docx.shared import Cm, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml

with open('/root/projects/jg/pgs15-scanner-projecten/PhoenixMetals_20260519/research/scan_data.json') as f:
    data = json.load(f)
sr = data['scan_result']

doc = Document()
doc.core_properties.title = "PGS 15 Master SOP Opslagveiligheid D4 — Phoenix Metals B.V."
doc.core_properties.author = "Kas (Director of Operations) via JvG Consultancy"
doc.core_properties.keywords = "PGS 15:2025; SOP; opslagveiligheid; Phoenix Metals"
doc.core_properties.category = "HSEQ SOP"

PRIMARY = RGBColor(0x00, 0x33, 0x66)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK = RGBColor(0x1F, 0x29, 0x37)
GRAY = RGBColor(0x37, 0x41, 0x51)
LIGHT_GRAY = RGBColor(0x6B, 0x72, 0x80)
SUCCESS = RGBColor(0x00, 0xA8, 0x59)

style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)
style.font.color.rgb = DARK
for lvl in ['Heading 1', 'Heading 2', 'Heading 3']:
    h = doc.styles[lvl]
    h.font.name = 'Calibri'
    h.font.color.rgb = PRIMARY
    h.font.bold = True

def set_cell_shading(cell, color):
    shading_elm = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color}"/>')
    cell._tc.get_or_add_tcPr().append(shading_elm)

def add_styled_table(doc, headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    bg_hex = f"{PRIMARY[0]:02X}{PRIMARY[1]:02X}{PRIMARY[2]:02X}"
    row = table.rows[0]
    for i, h in enumerate(headers):
        cell = row.cells[i]
        cell.text = ''
        p = cell.paragraphs[0]
        run = p.add_run(h)
        run.bold = True
        run.font.color.rgb = WHITE
        run.font.size = Pt(10)
        set_cell_shading(cell, bg_hex)
    for r_idx, row_data in enumerate(rows):
        for c_idx, val in enumerate(row_data):
            cell = table.rows[r_idx + 1].cells[c_idx]
            cell.text = ''
            p = cell.paragraphs[0]
            run = p.add_run(str(val))
            run.font.size = Pt(9)
            if r_idx % 2 == 1:
                set_cell_shading(cell, "F8F9FA")
    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_branded_heading(doc, text, level=1):
    h = doc.add_heading(text, level=level)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = 'Calibri'
    return h

def add_footer_with_logo(doc):
    for section in doc.sections:
        header = section.header
        header.is_linked_to_previous = False
        hdr_table = header.add_table(rows=1, cols=2, width=Cm(16))
        hdr_table.alignment = WD_TABLE_ALIGNMENT.CENTER
        left_cell = hdr_table.rows[0].cells[0]
        left_cell.text = ''
        p = left_cell.paragraphs[0]
        run = p.add_run("PGS 15 MASTER SOP — Opslagveiligheid D4")
        run.bold = True
        run.font.color.rgb = PRIMARY
        run.font.size = Pt(10)
        right_cell = hdr_table.rows[0].cells[1]
        right_cell.text = ''
        p = right_cell.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        logo_path = '/root/projects/jg/assets/branding/jvg-logo-white-medium.png'
        if os.path.exists(logo_path):
            run = p.add_run()
            run.add_picture(logo_path, width=Cm(2.0), height=Cm(1.8))
        else:
            run = p.add_run("JvG Consultancy")
            run.font.color.rgb = PRIMARY
        footer = section.footer
        footer.is_linked_to_previous = False
        p = footer.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run("JvG Consultancy | Safety - Governance - Advisory | 2026 | Pagina ")
        run.font.size = Pt(8)
        run.font.color.rgb = LIGHT_GRAY
        fld_char1 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="begin"/>')
        instr_text = parse_xml(f'<w:instrText {nsdecls("w")} xml:space="preserve">PAGE</w:instrText>')
        fld_char2 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="end"/>')
        run._r.append(fld_char1)
        run._r.append(instr_text)
        run._r.append(fld_char2)

# ═══════════════════════════════════════════════════════════════════════════════
# VOORBLAD
# ═══════════════════════════════════════════════════════════════════════════════
doc.add_paragraph()
doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("PGS 15 MASTER SOP")
run.bold = True
run.font.size = Pt(28)
run.font.color.rgb = PRIMARY

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Opslagveiligheid")
run.bold = True
run.font.size = Pt(22)
run.font.color.rgb = PRIMARY

doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Phoenix Metals B.V.")
run.bold = True
run.font.size = Pt(16)
run.font.color.rgb = DARK

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("PlantOne, Rotterdam Europoort")
run.font.size = Pt(12)
run.font.color.rgb = GRAY

doc.add_paragraph()
doc.add_paragraph()

info_table = doc.add_table(rows=6, cols=2)
info_table.alignment = WD_TABLE_ALIGNMENT.CENTER
info_data = [
    ("Project:", "PGS 15:2025 Master SOP Opslagveiligheid D4"),
    ("Type:", "Standard Operating Procedure"),
    ("Auteur:", "JvG Consultancy"),
    ("Versie:", "1.0"),
    ("Datum:", "19 mei 2026"),
    ("Status:", "Definitief"),
]
for i, (label, val) in enumerate(info_data):
    row = info_table.rows[i]
    row.cells[0].text = ''
    p = row.cells[0].paragraphs[0]
    run = p.add_run(label)
    run.bold = True
    run.font.size = Pt(10)
    row.cells[1].text = ''
    p = row.cells[1].paragraphs[0]
    run = p.add_run(val)
    run.font.size = Pt(10)

doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Vertrouwelijk")
run.italic = True
run.font.size = Pt(9)
run.font.color.rgb = LIGHT_GRAY

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# INHOUDSOPGAVE
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "Inhoudsopgave")
toc = [
    "1. Doel & Scope",
    "2. SOP-01: Opslaginventarisatie",
    "3. SOP-02: Opslagvoorschriften",
    "4. SOP-03: Laden & Lossen",
    "5. SOP-04: Lekbeker & Inspectie",
    "6. SOP-05: Calamiteitenprocedures",
    "7. SOP-06: Documentatie & Compliance",
    "8. Bijlagen",
    "9. Bronverwijzingen",
    "TierVerify Log",
]
for item in toc:
    p = doc.add_paragraph()
    run = p.add_run(item)
    run.font.size = Pt(10)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 1 — DOEL & SCOPE
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "1. Doel & Scope")

add_branded_heading(doc, "1.1 Doel", level=2)
doc.add_paragraph(
    "Deze Master Standard Operating Procedure (SOP) definieert de operationele procedures voor veilige "
    "opslag van gevaarlijke stoffen bij Phoenix Metals B.V., conform PGS 15:2025 (versie 1.0, januari 2025) "
    "en de vereisten voor opslagvoorzieningen, scheiding, inspectie en calamiteitenafhandeling. [1]"
)

add_branded_heading(doc, "1.2 Scope", level=2)
doc.add_paragraph("Deze SOP is van toepassing op:")
doc.add_paragraph("Alle opslag- en handling-activiteiten van gevaarlijke stoffen op Phoenix Metals locaties.", style='List Bullet')
doc.add_paragraph("Verpakte gevaarlijke stoffen: vaten, IBC's, jerrycans, canisters en gasflessen.", style='List Bullet')
doc.add_paragraph("ADR-klassen: 5.1 (oxiderend), 6.1 (toxisch), 8 (bijtend).", style='List Bullet')
doc.add_paragraph("Tijdelijke opslag, werkvoorraad en ontvangst/verzending.", style='List Bullet')

add_branded_heading(doc, "1.3 Toepasselijkheid", level=2)
doc.add_paragraph(
    "Deze SOP is van toepassing op alle medewerkers, contractanten en bezoekers die betrokken zijn bij "
    "opslag, handling of transport van gevaarlijke stoffen op Phoenix Metals faciliteiten."
)

add_branded_heading(doc, "1.4 Referentiekader", level=2)
add_styled_table(doc,
    ["Document", "Relevantie"],
    [
        ("PGS 15:2025", "Primaire norm voor opslag verpakte gevaarlijke stoffen"),
        ("ADR 2025", "Classificatie en transporteisen"),
        ("CLP Verordening", "Gevarenidentificatie en etikettering"),
        ("Arbowet/Arbobesluit", "Arbeidsomstandigheden en CMR-beleid"),
    ],
    col_widths=[4, 12]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# SOP-01: OPSLAGINVENTARISATIE
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "2. SOP-01: Opslaginventarisatie")

add_branded_heading(doc, "2.1 Chemisch Register", level=2)
doc.add_paragraph(
    "Phoenix Metals voert een centraal chemisch register (Registration Chemicals - MASTER, v2.1.0) met "
    "minimaal de volgende gegevens per stof: [4]"
)
add_styled_table(doc,
    ["Veld", "Beschrijving", "Voorbeeld"],
    [
        ("Identificatie", "Stofnaam en synoniemen", "Zwavelzuur / Sulfuric acid"),
        ("CAS", "CAS-nummer", "7664-93-9"),
        ("Classificatie", "ADR-klasse, UN-nummer, verpakkingsgroep", "ADR 8, UN 2796, PG II"),
        ("CLP", "CLP-gevarenaanduidingen (H- en P-zinnen)", "H290, H314"),
        ("Voorraad", "Hoeveelheid per locatie (kg/L)", "2400 kg"),
        ("Verpakking", "Verpakkingstype", "IBC, jerrycan, vat"),
        ("Locatie", "Locatiecode", "Rack lab"),
        ("SDS", "Actuele SDS beschikbaar", "Ja/Nee"),
    ],
    col_widths=[2.5, 4, 6]
)

add_branded_heading(doc, "2.2 Actueel Register - Phoenix Metals", level=2)
doc.add_paragraph("Stand per 19 mei 2026 (bron: PGS-15 Compliance Scanner v2.0): [8]")
stoffen_rows = []
for s in sr['per_stof']:
    adr = s['adr_klasse'] if s['adr_klasse'] else '-'
    stoffen_rows.append([
        s['naam'][:35],
        s['cas'][:15] if s['cas'] else '-',
        adr,
        s['vg'] if s['vg'] else '-',
        str(s['hoeveelheid']),
        s['vorm'],
    ])

add_styled_table(doc,
    ["Stof", "CAS", "ADR", "VG", "kg", "Vorm"],
    stoffen_rows,
    col_widths=[3.5, 2.5, 1.2, 1, 1, 1.5]
)

add_branded_heading(doc, "2.3 Maximum Hoeveelheden per Opslaglocatie", level=2)
doc.add_paragraph(
    "PGS 15:2025 classificeert het vereiste veiligheidsniveau op basis van hoeveelheid en stofeigenschappen. "
    "Voor Phoenix Metals gelden de volgende grenswaarden per ADR-klasse: [1]"
)
agg = sr['aggregatie']
add_styled_table(doc,
    ["ADR-klasse", "Ondergrens", "Niveau C", "Niveau B", "Actueel"],
    [
        ("8", "250 kg", "2.500 kg", "10.000 kg", f"{agg['per_klasse']['8']['totaal_kg']} kg"),
        ("5.1", "50 kg", "2.500 kg", "10.000 kg", f"{agg['per_klasse']['5.1']['totaal_kg']} kg"),
        ("6.1", "50 kg", "10.000 kg", "50.000 kg", f"{agg['per_klasse']['6.1']['totaal_kg']} kg"),
    ],
    col_widths=[2, 2.5, 2.5, 2.5, 2.5]
)

add_branded_heading(doc, "2.4 Workflow Nieuwe Stof Toevoegen", level=2)
doc.add_paragraph("Stap 1: Aanvrager vult HSE Chemical Request Form in.", style='List Number')
doc.add_paragraph("Stap 2: HSE-beoordeling: ZZS-status, carcinogeniteit, reprotoxiciteit, brandgevaar.", style='List Number')
doc.add_paragraph("Stap 3: Goedkeuring door HSE-functionaris + Directie.", style='List Number')
doc.add_paragraph("Stap 4: Opslaglocatie bepaald en goedgekeurd voor inkoop.", style='List Number')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# SOP-02: OPSLAGVOORSCHRIFTEN
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "3. SOP-02: Opslagvoorschriften")

add_branded_heading(doc, "3.1 Algemene voorschriften", level=2)
doc.add_paragraph("Alle opslag moet voldoen aan de volgende algemene voorschriften: [1]")
doc.add_paragraph("Opslaan in bestemde opslagvoorziening (M2)", style='List Bullet')
doc.add_paragraph("Opvangvoorziening: 110% grootste verpakking of 10% totaal (M30)", style='List Bullet')
doc.add_paragraph("Onverenigbare combinaties gescheiden (M35)", style='List Bullet')
doc.add_paragraph("Gescheiden opslag in stellingen (M36)", style='List Bullet')
doc.add_paragraph("Geen verspreiding via riolering (M29)", style='List Bullet')
doc.add_paragraph("Niet toegankelijk voor onbevoegden (M88)", style='List Bullet')
doc.add_paragraph("Veiligheidssignalering aanwezig (M135)", style='List Bullet')
doc.add_paragraph("Etiketten leesbaar (M136)", style='List Bullet')

add_branded_heading(doc, "3.2 Scheidingsvoorschriften", level=2)
doc.add_paragraph(
    "Conform PGS 15:2025 Bijlage E moeten onverenigbare stoffen gescheiden worden opgeslagen. "
    "Phoenix Metals heeft 20 onverenigbare combinaties geidentificeerd. [1][5]"
)
add_styled_table(doc,
    ["Opslaggroep", "Stoffen", "Scheidings-eis"],
    [
        ("SG2 - Brandbevorderend", "H2O2, Na2S2O8", "Min. 3,0 m tot SG1; 60 min brandwerend"),
        ("SG4 - Toxisch (CMR)", "NaVO3, V2O5", "Min. 1,2 m tot SG5; 30 min brandwerend"),
        ("SG5 - Corrosief", "H2SO4, HCl, NaAlO2, V-elektrolyt", "Min. 1,2 m tot SG1/SG4"),
    ],
    col_widths=[3.5, 5, 5.5]
)

add_branded_heading(doc, "3.3 Specifieke opslagvoorschriften per stof", level=2)
add_styled_table(doc,
    ["Stof", "Opslagtemperatuur", "Specifieke eis", "Scheiding"],
    [
        ("H2SO4 25%", "Omgeving", "Zuurbestendige opvangbak", "Van basen (NaAlO2)"),
        ("HCl 20%", "Omgeving", "Zuurbestendige opvangbak", "Van basen (NaAlO2)"),
        ("H2O2 30%", "Koel, donker", "Geen metaalcontact", "Van brandbaren"),
        ("Na2S2O8", "Droog", "Geen reducerende stoffen", "Van brandbaren"),
        ("NaAlO2", ">15C", "Temperatuurbewaking", "Van zuren"),
        ("V2O5", "Omgeving", "Gesloten; FFP3", "Van voedsel/CMR-zone"),
        ("NaVO3", "Omgeving", "Gesloten; FFP3", "Van voedsel/CMR-zone"),
        ("V-elektrolyt", "Omgeving", "CMR-precautions", "Van zuren"),
    ],
    col_widths=[2.5, 2.5, 4.5, 4.5]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# SOP-03: LADEN & LOSSEN
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "4. SOP-03: Laden & Lossen")

add_branded_heading(doc, "4.1 Ontvangstprocedure", level=2)
doc.add_paragraph("Stap 1: Controleer vrachtbrief en etiketten op juistheid.", style='List Number')
doc.add_paragraph("Stap 2: Inspecteer verpakkingen op beschadigingen en lekkage.", style='List Number')
doc.add_paragraph("Stap 3: Verifieer SDS/VIB is beschikbaar.", style='List Number')
doc.add_paragraph("Stap 4: Transporteer naar aangewezen opsaglocatie met geschikt transportmiddel.", style='List Number')
doc.add_paragraph("Stap 5: Plaats in opslag conform scheidingsvoorschriften.", style='List Number')
doc.add_paragraph("Stap 6: Update chemisch register.", style='List Number')

add_branded_heading(doc, "4.2 Uitgifteprocedure", level=2)
doc.add_paragraph("Stap 1: Controleer aanvraag en autorisatie.", style='List Number')
doc.add_paragraph("Stap 2: Draag vereiste PBM.", style='List Number')
doc.add_paragraph("Stap 3: Controleer opvangvoorziening.", style='List Number')
doc.add_paragraph("Stap 4: Voer uitgifte uit met geschikt hulpmiddel.", style='List Number')
doc.add_paragraph("Stap 5: Sluit verpakking na gebruik.", style='List Number')
doc.add_paragraph("Stap 6: Update chemisch register.", style='List Number')

add_branded_heading(doc, "4.3 Transport binnen de locatie", level=2)
doc.add_paragraph("Gebruik uitsluitend geschikte transportmiddelen (kruipwagen, handpompwagen).", style='List Bullet')
doc.add_paragraph("Verpakkingen zijn tijdens transport altijd gesloten.", style='List Bullet')
doc.add_paragraph("Gemotoriseerde transportmiddelen zijn beperkt toegestaan (M46).", style='List Bullet')
doc.add_paragraph("Controleer deugdelijke constructie van pallets (M52).", style='List Bullet')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# SOP-04: LEKKAGE & INSPECTIE
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "5. SOP-04: Lekbeker & Inspectie")

add_branded_heading(doc, "5.1 Lekkage-procedure", level=2)
doc.add_paragraph("Bij lekkage van gevaarlijke stoffen: [1]")
doc.add_paragraph("Stap 1: Ontruim de directe omgeving.", style='List Number')
doc.add_paragraph("Stap 2: Draag bijgeschikte PBM.", style='List Number')
doc.add_paragraph("Stap 3: Stop de lekkage indien veilig mogelijk.", style='List Number')
doc.add_paragraph("Stap 4: Absorbeer met geschikt absorptiemiddel.", style='List Number')
doc.add_paragraph("Stap 5: Neutraliseer indien van toepassing.", style='List Number')
doc.add_paragraph("Stap 6: Verzamel als chemisch afval.", style='List Number')
doc.add_paragraph("Stap 7: Meld bij HSE-functionaris en documenteer.", style='List Number')

add_branded_heading(doc, "5.2 Inspectieschema", level=2)
add_styled_table(doc,
    ["Inspectie", "Frequentie", "Verantwoordelijke", "Document"],
    [
        ("Visuele inspectie opslag", "Dagelijks", "Operator", "Inspectielijst"),
        ("Stellinginspectie", "Maandelijks", "Teamleider", "Rapport"),
        ("Jaarlijkse stellinginspectie", "Jaarlijks", "Deskundige", "Certificaat"),
        ("Nooddouche/oogspoeling", "Wekelijks", "Teamleider", "Controlelijst"),
        ("Opvangvoorziening", "Maandelijks", "HSE-functionaris", "Rapport"),
    ],
    col_widths=[3.5, 2, 3, 3.5]
)

add_branded_heading(doc, "5.3 Inspectiecriteria", level=2)
doc.add_paragraph("Etiketten leesbaar en intact (M136)", style='List Bullet')
doc.add_paragraph("Verpakkingen onbeschadigd, geen lekkage", style='List Bullet')
doc.add_paragraph("Opvangvoorziening schoon en functioneel", style='List Bullet')
doc.add_paragraph("Stellingen stabiel, geen overbelasting (M75)", style='List Bullet')
doc.add_paragraph("Scheidingsmaatregelen in stand (M35)", style='List Bullet')
doc.add_paragraph("VIB beschikbaar (M137)", style='List Bullet')
doc.add_paragraph("Vluchtroutes vrij (M130)", style='List Bullet')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# SOP-05: CALAMITEITENPROCEDURES
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "6. SOP-05: Calamiteitenprocedures")

add_branded_heading(doc, "6.1 Intern noodplan", level=2)
doc.add_paragraph(
    "Phoenix Metals beschikt over een intern noodplan conform PGS 15:2025 M113. Het noodplan wordt "
    "jaarlijks geevalueerd (M114) en bevat: [1]"
)
doc.add_paragraph("Evacueringsroutes en verzamelpunten", style='List Bullet')
doc.add_paragraph("Brandblusmiddelen: draagbaar blustoestel per 200 m2 (M95)", style='List Bullet')
doc.add_paragraph("Nooddouche en oogspoeling binnen 10 seconden loopafstand (M115)", style='List Bullet')
doc.add_paragraph("Informatie voor hulpdiensten (M116)", style='List Bullet')
doc.add_paragraph("Lekkage-instructie (M120) en calamiteiteninstructie (M121)", style='List Bullet')

add_branded_heading(doc, "6.2 Brandprocedure", level=2)
doc.add_paragraph("Hoewel de opgeslagen stoffen grotendeels onbrandbaar zijn, kunnen oxiderende stoffen brand versterken.")
doc.add_paragraph("Stap 1: Alarmeer - roep 112.", style='List Number')
doc.add_paragraph("Stap 2: Evacueer het gebouw.", style='List Number')
doc.add_paragraph("Stap 3: Gebruik GEEN water bij brand in oxiderende stoffen.", style='List Number')
doc.add_paragraph("Stap 4: Meld bij brandweer: opslag van oxiderende en CMR-stoffen.", style='List Number')

add_branded_heading(doc, "6.3 Ongevallen met CMR-stoffen", level=2)
doc.add_paragraph("Bij incidenten met CMR-stoffen (V2O5, NaVO3, V-elektrolyt):")
doc.add_paragraph("Direct medische behandeling en blootstellingsregistratie.", style='List Bullet')
doc.add_paragraph("Decontaminatie van betrokken personen.", style='List Bullet')
doc.add_paragraph("Milieuzorg: voorkom verspreiding naar riolering/grondwater.", style='List Bullet')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# SOP-06: DOCUMENTATIE & COMPLIANCE
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "7. SOP-06: Documentatie & Compliance")

add_branded_heading(doc, "7.1 Verplichte documentatie", level=2)
add_styled_table(doc,
    ["Document", "Bewaartermijn", "Verantwoordelijke"],
    [
        ("Chemisch register", "10 jaar", "HSE-functionaris"),
        ("SDS/VIB", "Levensduur stof + 10 jaar", "HSE-functionaris"),
        ("Inspectierapporten", "5 jaar", "Teamleider"),
        ("Opleidingsbewijzen", "Loopbaan + 10 jaar", "HR"),
        ("Incidentrapporten", "10 jaar", "HSE-functionaris"),
        ("TRA/LMRA", "5 jaar", "Teamleider"),
    ],
    col_widths=[3.5, 3, 5.5]
)

add_branded_heading(doc, "7.2 Compliance monitoring", level=2)
doc.add_paragraph("De volgende compliance-activiteiten zijn verplicht:")
doc.add_paragraph("Jaarlijkse PGS 15 audit (intern)", style='List Bullet')
doc.add_paragraph("Periodieke inspectie door gecertificeerde deskundige", style='List Bullet')
doc.add_paragraph("Actualisering chemisch register bij elke wijziging", style='List Bullet')
doc.add_paragraph("Herziening SOP bij wijziging wetgeving of incidenten", style='List Bullet')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# BIJLAGEN
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "8. Bijlagen")

add_branded_heading(doc, "Bijlage A: Stoffenlijst met SDS-referenties", level=2)
doc.add_paragraph("Zie chemisch register (Registration Chemicals - MASTER v2.1.0) voor volledige SDS-referenties. [4]")

add_branded_heading(doc, "Bijlage B: Scheidingstabel onverenigbare combinaties", level=2)
doc.add_paragraph(
    f"Zie PGS 15:2025 Bijlage E voor de volledige scheidingstabel. Phoenix Metals heeft "
    f"{len(sr['combinatie']['scheiding']['conflicten'])} onverenigbare combinaties geidentificeerd. [1][5]"
)

add_branded_heading(doc, "Bijlage C: Inspectielijsten", level=2)
doc.add_paragraph("Standaard inspectielijsten zijn beschikbaar bij de HSE-functionaris.")

add_branded_heading(doc, "Bijlage D: Noodplan", level=2)
doc.add_paragraph("Het intern noodplan is beschikbaar bij de HSE-functionaris en bij de ingang van de opslagruimte.")

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# BRONVERWIJZINGEN
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "9. Bronverwijzingen")
bronnen = [
    "[1] PGS 15:2025 - Publicatie 565 (maart 2025). Publicatiereeks Gevaarlijke Stoffen.",
    "[2] ADR 2025 - Europees verdrag vervoer gevaarlijke goederen over de weg.",
    "[3] CLP Verordening (EG) Nr. 1272/2008.",
    "[4] Phoenix Metals B.V. - Registration Chemicals MASTER v2.1.0.",
    "[5] PGS 15:2025 Bijlage E - Scheidingstabel onverenigbare stoffen.",
    "[6] Arbobesluit artikel 4.2-4.3 - CMR-stoffen preventiebeleid.",
    "[7] BRZO 2015 - Besluit risico's zware ongevallen.",
    "[8] PGS-15 Compliance Scanner v2.0 - scan__20260519_094556.json.",
]
for b in bronnen:
    p = doc.add_paragraph()
    run = p.add_run(b)
    run.font.size = Pt(9)
    run.font.color.rgb = GRAY

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# TIERVERIFY LOG
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "TierVerify Log")
add_styled_table(doc,
    ["Check", "Status", "Opmerking"],
    [
        ("9 SOPs gedefinieerd", "PASS", "SOP-01 tot SOP-06 + bijlagen"),
        ("Opslaginventaris compleet", "PASS", "18 stoffen met CAS, ADR, hoeveelheid"),
        ("Scheidingsvoorschriften", "PASS", "20 onverenigbare paren, 3 opslaggroepen"),
        ("Inspectieschema", "PASS", "5 inspectieniveaus met frequentie"),
        ("Noodprocedures", "PASS", "Lekkage, brand, CMR-incident"),
        ("Documentatie-eisen", "PASS", "6 documenttypen met bewaartermijn"),
        ("Bronverwijzingen", "PASS", "8 bronnen vermeld"),
        ("Documentheader", "PASS", "Project, Type, Auteur, Versie, Datum, Status"),
    ],
    col_widths=[4, 2, 10]
)

doc.add_paragraph()
p = doc.add_paragraph()
run = p.add_run("Status: PASS - Alle checks geslaagd. Master SOP voldoet aan PGS 15:2025 eisen.")
run.bold = True
run.font.color.rgb = SUCCESS

add_footer_with_logo(doc)

out_dir = '/root/projects/jg/pgs15-scanner-projecten/PhoenixMetals_20260519/deliverables/docx'
os.makedirs(out_dir, exist_ok=True)
out_path = os.path.join(out_dir, 'PGS15_MasterSOP_Opslagveiligheid_Phoenix_Metals_D4_v1.0.docx')
doc.save(out_path)
print(f"Document opgeslagen: {out_path}")
print(f"Bestandsgrootte: {os.path.getsize(out_path):,} bytes")
