#!/usr/bin/env python3
"""PGS 15:2025 Audit Checklist — Phoenix Metals v4.0"""

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

doc = Document()

# --- Styles ---
style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(10)

style_h1 = doc.styles['Heading 1']
style_h1.font.size = Pt(16)
style_h1.font.color.rgb = RGBColor(0, 51, 102)

style_h2 = doc.styles['Heading 2']
style_h2.font.size = Pt(13)
style_h2.font.color.rgb = RGBColor(0, 51, 102)

for section in doc.sections:
    section.top_margin = Cm(2)
    section.bottom_margin = Cm(2)
    section.left_margin = Cm(2)
    section.right_margin = Cm(2)

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

def add_table_with_header(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
    # Header
    for i, h in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = h
        for p in cell.paragraphs:
            p.alignment = WD_ALIGN_PARAGRAPH.CENTER
            for r in p.runs:
                r.bold = True
                r.font.size = Pt(9)
                r.font.color.rgb = RGBColor(255, 255, 255)
        set_cell_shading(cell, "003366")
    # Data
    for ri, row in enumerate(rows):
        for ci, val in enumerate(row):
            cell = table.rows[ri + 1].cells[ci]
            cell.text = val
            for p in cell.paragraphs:
                for r in p.runs:
                    r.font.size = Pt(9)
        if ri % 2 == 1:
            for ci in range(len(headers)):
                set_cell_shading(table.rows[ri + 1].cells[ci], "F2F2F2")
    if col_widths:
        for ri in range(len(table.rows)):
            for ci, w in enumerate(col_widths):
                table.rows[ri].cells[ci].width = Cm(w)
    return table

# ========== 1. TITELPAGINA ==========
for _ in range(6):
    doc.add_paragraph()

t = doc.add_paragraph()
t.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = t.add_run("PGS 15:2025 Audit Checklist")
r.bold = True
r.font.size = Pt(26)
r.font.color.rgb = RGBColor(0, 51, 102)

t2 = doc.add_paragraph()
t2.alignment = WD_ALIGN_PARAGRAPH.CENTER
r2 = t2.add_run("Phoenix Metals v4.0")
r2.font.size = Pt(18)
r2.font.color.rgb = RGBColor(0, 51, 102)

doc.add_paragraph()
meta = doc.add_paragraph()
meta.alignment = WD_ALIGN_PARAGRAPH.CENTER
meta.add_run("Gebaseerd op PGS 15:2025 versie 1.0 (januari 2025)\n").font.size = Pt(11)
meta.add_run("Definitief — Audit gebruiksklaar").font.size = Pt(11)

doc.add_page_break()

# ========== 2. ALGEMENE INFORMATIE ==========
doc.add_heading("Algemene Informatie", level=1)
info_fields = [
    ("Auditdatum", ""),
    ("Auditor", ""),
    ("Locatie", "Phoenix Metals"),
    ("Scope", "PGS 15:2025 opslag gevaarlijke stoffen"),
    ("Audittype", "☐ Intern  ☐ Extern  ☐ Heraudit"),
    ("Status", "☐ Gepland  ☐ Uitgevoerd  ☐ Afgehandeld"),
]
info_table = doc.add_table(rows=len(info_fields), cols=2)
info_table.style = 'Table Grid'
for i, (label, val) in enumerate(info_fields):
    info_table.rows[i].cells[0].text = label
    info_table.rows[i].cells[1].text = val
    for r in info_table.rows[i].cells[0].paragraphs[0].runs:
        r.bold = True
        r.font.size = Pt(10)
    info_table.rows[i].cells[0].width = Cm(5)
    info_table.rows[i].cells[1].width = Cm(12)

doc.add_paragraph()

# ========== 3. DEEL A ==========
doc.add_heading("Deel A: Algemene Eisen (PGS 15:2025 Hoofdstuk 1–3)", level=1)
doc.add_paragraph("Betreft algemene eisen rond vergunningen, organisatie en bevoegdheden.", style='Normal')

a_rows = [
    ("1.1", "Bedrijfsomschrijving aanwezig en actueel", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("1.2", "Vergunningen compleet en geldig (Wm/Wabo)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("1.3", "Bouwtechnische vergunningen aanwezig", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("2.1", "Organisatiestructuur HSEQ gedocumenteerd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("2.2", "Bevoegdheid en verantwoordelijkheden vastgelegd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("2.3", "BHV-organisatie ingericht en getraind", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("2.4", "Aanwezigheidsregistratie opslagruimte actief", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("3.1", "Risico-inventarisatie & -evaluatie (RI&E) actueel", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("3.2", "Beheersmaatregelen geïmplementeerd conform RI&E", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("3.3", "Procedure wijzigingen opslag doorgevoerd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
]
add_table_with_header(doc,
    ["PGS 15 Ref.", "Eis", "Status", "Opmerking"],
    a_rows,
    col_widths=[2.5, 6, 3, 5.5]
)
doc.add_paragraph()

# ========== 4. DEEL B ==========
doc.add_heading("Deel B: Opslag Gevaarlijke Stoffen (PGS 15:2025 Hoofdstuk 4–5)", level=1)

b_rows = [
    ("4.1.1", "Opslagoverzicht stoffen actueel en compleet", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.1.2", "Maximum hoeveelheden per opslaglocatie gerespecteerd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.1.3", "Stoffen geclassificeerd conform CLP/GHS", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.2.1", "Lekbeker / opvangbak aanwezig en functioneel", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.2.2", "Lekbeker capaciteit voldoende (≥110% grootste vat / 10% totaal)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.2.3", "Lekbeker visueel inspecteerbaar", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.3.1", "Ventilatie adequaat (natuurlijk en/of mechanisch)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.3.2", "Ventilatiecapaciteit conform PGS 15 eisen (luchtverversing)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.3.3", "Ventilatieopeningen niet afgesloten/geblokkeerd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.4.1", "Constructieve veiligheid: brandwerendheid vloeren/wanden", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.4.2", "Constructieve veiligheid: draagkracht vloeren toereikend", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.4.3", "Constructieve veiligheid: dakconstructie (explosieontlastend indien nodig)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.5.1", "Segregatie stoffen correct (zuur/base gescheiden)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.5.2", "Segregatie conform separatietabel PGS 15", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.5.3", "Brandbare stoffen gescheiden van oxiderende stoffen", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.6.1", "Verpakkingsvoorschriften nageleefd (ADR/CLP)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.6.2", "Verpakkingen in goede staat (geen lekkage, corrosie)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.6.3", "Binnen-opslag (gasflessen, kleine verpakkingen) conform eisen", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.7.1", "Etikettering compleet en leesbaar op alle verpakkingen", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.7.2", "GHS-gevaarpictogrammen zichtbaar", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("4.7.3", "H-zinnen en P-zinnen vermeld conform CLP", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("5.1.1", "Buitenslag eisen nageleefd (afstand tot perceelgrens)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("5.1.2", "Binnenslag specifieke eisen toegepast waar van toepassing", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("5.2.1", "Opslag van giftige stoffen conform specifieke eisen", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("5.2.2", "CMR-stoffen opslag conform aanvullende eisen", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
]
add_table_with_header(doc,
    ["PGS 15 Ref.", "Eis", "Status", "Opmerking"],
    b_rows,
    col_widths=[2.5, 6, 3, 5.5]
)
doc.add_paragraph()

# ========== 5. DEEL C ==========
doc.add_heading("Deel C: Veiligheidssystemen (PGS 15:2025 Hoofdstuk 6–7)", level=1)

c_rows = [
    ("6.1.1", "Branddetectiesysteem aanwezig en functioneel", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("6.1.2", "Branddetectie getest binnen kalibratieperiode", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("6.2.1", "Brandblusmiddelen adequaat (type en capaciteit)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("6.2.2", "Brandblusapparatuur gekeurd en toegankelijk", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("6.2.3", "Automatische blusinstallatie (indien vereist) operationeel", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("6.3.1", "Gasdetectiesysteem aanwezig (indien van toepassing)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("6.3.2", "Gasdetectie gekoppeld aan ventilatie/alarm", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("6.4.1", "Alarmeringssysteem (brand/gas) operationeel", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("6.4.2", "Alarmering hoorbaar/zichtbaar in alle ruimtes", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("7.1.1", "Noodverlichting aanwezig en functioneel", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("7.1.2", "Noodverlichting getest (periodieke controle)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("7.2.1", "Calamiteitenkaart aanwezig en zichtbaar bij ingang", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("7.2.2", "Calamiteitenkaart bevat juiste contactgegevens en procedures", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("7.3.1", "Vluchtroutes vrij en gemarkeerd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("7.3.2", "Nooduitgangen vrij toegankelijk en van binnenuit te openen", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
]
add_table_with_header(doc,
    ["PGS 15 Ref.", "Eis", "Status", "Opmerking"],
    c_rows,
    col_widths=[2.5, 6, 3, 5.5]
)
doc.add_paragraph()

# ========== 6. DEEL D ==========
doc.add_heading("Deel D: Documentatie (PGS 15:2025 Hoofdstuk 8)", level=1)

d_rows = [
    ("8.1.1", "Safety Data Sheets (SDS) actueel en toegankelijk", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.1.2", "SDS'en in taal begrijpelijk voor medewerkers (NL/EN)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.1.3", "SDS bereikbaar binnen 5 minuten", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.2.1", "RI&E opslag aanwezig en actueel", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.2.2", "RI&E bevat alle opgeslagen stoffen", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.3.1", "Task Risk Analyses (TRA's) per werkzaamheid beschikbaar", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.3.2", "TRA's geautoriseerd door bevoegd persoon", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.4.1", "Calamiteitenplan actueel en goedgekeurd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.4.2", "Calamiteitenplan bevat specifieke stof-scenario's", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.5.1", "Inspectierapporten gearchiveerd en raadpleegbaar", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.5.2", "Inspecties uitgevoerd conform planning", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.6.1", "Oefenverslagen (brand/gas/evacuatie) aanwezig", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.6.2", "Oefenfrequentie conform wettelijke eisen (≥ 1x/jaar)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("8.7.1", "Onderhoudslogboeken installaties bijgewerkt", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
]
add_table_with_header(doc,
    ["PGS 15 Ref.", "Eis", "Status", "Opmerking"],
    d_rows,
    col_widths=[2.5, 6, 3, 5.5]
)
doc.add_paragraph()

# ========== 7. DEEL E ==========
doc.add_heading("Deel E: Organisatorische Maatregelen", level=1)

e_rows = [
    ("E.1", "Werkplekinstructies (WPI's) aanwezig per werkplek", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("E.2", "WPI's bevatten juiste stof-specifieke instructies", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("E.3", "PBM's beschikbaar, geïnspecteerd en binnen houdbaarheid", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("E.4", "PBM-selectie conform SDS-eisen en RI&E", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("E.5", "Training medewerkers gedocumenteerd en actueel", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("E.6", "Inwerkinstructie nieuwe medewerkers conform HSEQ-beleid", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("E.7", "Taakverdeling HSEQ duidelijk en gecommuniceerd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("E.8", "Toezicht op opslagruimte geregeld (deurbeheer)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("E.9", "Procedure voor ontvangst/vervoer stoffen vastgelegd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("E.10", "Incidentenregistratie actief en geëvalueerd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
]
add_table_with_header(doc,
    ["Ref.", "Eis", "Status", "Opmerking"],
    e_rows,
    col_widths=[2.5, 6, 3, 5.5]
)
doc.add_paragraph()

# ========== 8. DEEL F ==========
doc.add_heading("Deel F: Specifieke Eisen Phoenix Metals", level=1)
doc.add_paragraph("Specifieke eisen gebaseerd op Phoenix Metals werkzaamheden (metaalrecycling, CMR-stoffen, NORM).", style='Normal').runs[0].italic = True

f_rows = [
    ("F.1", "CMR-ash opslag conform PGS 15 + aanvullende eisen", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("F.2", "CMR-stoffen gescheiden opgeslagen (afgesloten ruimte)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("F.3", "Stralingsveiligheid (NORM) maatregelen gedocumenteerd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("F.4", "NORM-monitoring protocol actief (poortmonitoring)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("F.5", "Flow cabinet (afzuigkast) gebruik conform voorschrift", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("F.6", "Flow cabinet periodiek gekeurd (afzuigcapaciteit)", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("F.7", "Radioactief afvoer protocol vastgelegd en goedgekeurd", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("F.8", "Vervoer CMR/NORM conform ADR-stralingseisen", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("F.9", "Persoonlijke dosimetrie NORM-werkers geregeld", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
    ("F.10", "Afvalstroom registratie CMR/NORM compleet", "☐ ✅  ☐ ⚠️  ☐ ❌", ""),
]
add_table_with_header(doc,
    ["Ref.", "Eis", "Status", "Opmerking"],
    f_rows,
    col_widths=[2.5, 6, 3, 5.5]
)
doc.add_paragraph()

# ========== 9. SAMENVATTING ==========
doc.add_page_break()
doc.add_heading("Samenvatting & Handtekeningen", level=1)

doc.add_heading("Score Overzicht", level=2)
score_rows = [
    ("Deel A", "Algemene Eisen", "", ""),
    ("Deel B", "Opslag Gevaarlijke Stoffen", "", ""),
    ("Deel C", "Veiligheidssystemen", "", ""),
    ("Deel D", "Documentatie", "", ""),
    ("Deel E", "Organisatorische Maatregelen", "", ""),
    ("Deel F", "Specifieke Eisen Phoenix Metals", "", ""),
    ("", "TOTAAL", "", ""),
]
score_table = doc.add_table(rows=len(score_rows), cols=4)
score_table.style = 'Table Grid'
headers_s = ["Deel", "Onderwerp", "Score", "Opmerking"]
for ci, h in enumerate(headers_s):
    cell = score_table.rows[0].cells[ci]
    cell.text = h
    for r in cell.paragraphs[0].runs:
        r.bold = True
        r.font.size = Pt(10)
        r.font.color.rgb = RGBColor(255, 255, 255)
    set_cell_shading(cell, "003366")

# Fix: write data rows starting at row index 1
for ri in range(len(score_rows)):
    row_data = score_rows[ri]
    for ci, val in enumerate(row_data):
        score_table.rows[ri].cells[ci].text = val
        for r in score_table.rows[ri].cells[ci].paragraphs[0].runs:
            r.font.size = Pt(10)

# Bold the TOTAAL row
total_row = score_table.rows[-1]
for ci in range(4):
    for r in total_row.cells[ci].paragraphs[0].runs:
        r.bold = True

doc.add_paragraph()

doc.add_heading("Bevindingen Samenvatting", level=2)
findings_fields = [
    "Kritieke bevindingen (❌):",
    "",
    "Verbeterpunten (⚠️):",
    "",
    "Positieve bevindingen (✅):",
    "",
]
for f in findings_fields:
    p = doc.add_paragraph(f)
    if f.endswith(":"):
        for r in p.runs:
            r.bold = True
    else:
        # Add empty line for writing space
        p.add_run("___________________________________________________________________________")

doc.add_paragraph()
doc.add_heading("Vervolgacties", level=2)
p = doc.add_paragraph()
p.add_run("Datum volgende audit: ").bold = True
p.add_run("____________________")
p = doc.add_paragraph()
p.add_run("Verantwoordelijke opvolging: ").bold = True
p.add_run("____________________")

doc.add_paragraph()
doc.add_heading("Handtekeningen", level=2)
sig_table = doc.add_table(rows=2, cols=3)
sig_table.style = 'Table Grid'
sig_headers = ["Rol", "Naam", "Handtekening / Datum"]
for ci, h in enumerate(sig_headers):
    sig_table.rows[0].cells[ci].text = h
    for r in sig_table.rows[0].cells[ci].paragraphs:
        for run in r.runs:
            r.bold = True
            run.font.size = Pt(10)
            run.font.color.rgb = RGBColor(255, 255, 255)
    set_cell_shading(sig_table.rows[0].cells[ci], "003366")
sig_table.rows[1].cells[0].text = "Auditor"
sig_table.rows[1].height = Cm(2)

# Add second signature row
sig_row2 = sig_table.add_row()
sig_row2.cells[0].text = "Management"
sig_row2.height = Cm(2)

doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("— Einde Checklist —")
r.italic = True
r.font.color.rgb = RGBColor(128, 128, 128)

# Save
output_path = "/root/projects/jg/2026-pgs15-phoenix-metals/deliverables/docx/PGS15_Audit_Checklist_v4.0.docx"
doc.save(output_path)
print(f"✅ Opgeslagen: {output_path}")
