#!/usr/bin/env python3
"""Generate PGS 15:2025 Audit Rapport Template v5.0 — Phoenix Metals B.V. (20 stoffen)"""

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

LOGO_PATH = "/root/projects/jg/assets/branding/jvg-logo-medium.png"
OUTPUT = "/root/projects/jg/2026-pgs15-phoenix-metals/deliverables/docx/PGS15_Audit_Rapport_Template_v5.0.docx"

doc = Document()

# ── Styles ──────────────────────────────────────────────────────────────
style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)
style.font.color.rgb = RGBColor(0x1F, 0x29, 0x37)
style.paragraph_format.space_after = Pt(4)

for level in [1, 2, 3]:
    hs = doc.styles[f'Heading {level}']
    hs.font.name = 'Calibri'
    hs.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
    hs.font.bold = True
    if level == 1:
        hs.font.size = Pt(14)
    elif level == 2:
        hs.font.size = Pt(12)
    else:
        hs.font.size = Pt(11)

# ── Helper functions ────────────────────────────────────────────────────
DARK = RGBColor(0x00, 0x33, 0x66)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_BG = "D9E2F3"
HEADER_BG = "003366"

def set_cell_shading(cell, color_hex):
    shading = OxmlElement('w:shd')
    shading.set(qn('w:fill'), color_hex)
    shading.set(qn('w:val'), 'clear')
    cell._tc.get_or_add_tcPr().append(shading)

def style_header_row(table, bg=HEADER_BG):
    for cell in table.rows[0].cells:
        set_cell_shading(cell, bg)
        for p in cell.paragraphs:
            p.alignment = WD_ALIGN_PARAGRAPH.CENTER
            for r in p.runs:
                r.font.color.rgb = WHITE
                r.font.bold = True
                r.font.size = Pt(10)

def add_field(doc, label, value=""):
    p = doc.add_paragraph()
    r = p.add_run(f"{label}: ")
    r.bold = True
    r.font.size = Pt(11)
    p.add_run(value)

def make_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
    for i, h in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = h
    style_header_row(table)
    for ri, row_data in enumerate(rows):
        for ci, val in enumerate(row_data):
            table.rows[ri + 1].cells[ci].text = str(val)
            for p in table.rows[ri + 1].cells[ci].paragraphs:
                for r in p.runs:
                    r.font.size = Pt(10)
    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

# ── Section 0: Title page ──────────────────────────────────────────────
if os.path.exists(LOGO_PATH):
    doc.add_picture(LOGO_PATH, width=Cm(2.0), height=Cm(1.8))
doc.add_paragraph()
title = doc.add_paragraph()
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = title.add_run("PGS 15:2025 Audit Rapport")
r.font.size = Pt(20)
r.font.bold = True
r.font.color.rgb = DARK

sub = doc.add_paragraph()
sub.alignment = WD_ALIGN_PARAGRAPH.CENTER
r2 = sub.add_run("Phoenix Metals B.V. — Pilot Plant Slag Chemicals")
r2.font.size = Pt(14)
r2.font.color.rgb = DARK

doc.add_paragraph()

# Document header metadata
header_fields = [
    ("Project", "PGS 15 Compliance Audit"),
    ("Type", "Audit Rapport Template"),
    ("Auteur", "JvG Consultancy"),
    ("Versie", "5.0"),
    ("Datum", "06-05-2026"),
    ("Status", "Template — Concept"),
]
make_table(doc, ["Veld", "Waarde"], header_fields, col_widths=[5, 12])
doc.add_paragraph()

add_field(doc, "Auditnummer", "[Auditnummer]")
add_field(doc, "Datum", "[DD-MM-YYYY]")
add_field(doc, "Locatie", "[Locatie]")
doc.add_paragraph()
add_field(doc, "Lead Auditor", "[Lead Auditor]")
add_field(doc, "Auditor(s)", "[Auditor(s)]")
doc.add_paragraph()
add_field(doc, "Scope", "[Scope]")
add_field(doc, "Type", "[Intern / Extern]")
add_field(doc, "Rapportversie", "5.0")

doc.add_page_break()

# ── Section 1: Inhoudsopgave ───────────────────────────────────────────
doc.add_heading("1. Inhoudsopgave", level=1)
toc_items = [
    "2. Bedrijfsgegevens",
    "3. Audit Samenvatting",
    "4. Audit Scope & Methode",
    "5. Stoffeninventarisatie (20 stoffen)",
    "6. Bevindingen",
    "7. Score Overzicht",
    "8. Corrective Action Plan (CAP)",
    "9. Conclusie & Aanbevelingen",
    "10. Handtekeningen",
    "11. Bijlagen",
    "12. Bronverwijzingen",
    "13. TierVerify Log",
]
for item in toc_items:
    p = doc.add_paragraph(item, style='List Number')
    for r in p.runs:
        r.font.size = Pt(11)

doc.add_page_break()

# ── Section 2: Bedrijfsgegevens ─────────────────────────────────────────
doc.add_heading("2. Bedrijfsgegevens", level=1)
for lbl in ["Bedrijfsnaam", "Adres", "Contactpersoon", "Telefoon", "E-mail",
            "Locatie(s) geaudit", "Vergunningsnummer", "KVK-nummer"]:
    add_field(doc, lbl, f"[{lbl}]")

doc.add_page_break()

# ── Section 3: Audit Samenvatting ───────────────────────────────────────
doc.add_heading("3. Audit Samenvatting", level=1)
doc.add_heading("3.1 Algemene Conclusie", level=2)
doc.add_paragraph("[Conform / Gedeeltelijk conform / Non-conform]")

doc.add_heading("3.2 Bevindingenoverzicht", level=2)
# Updated: +CMR-non-conform, +milieu-tekortkoming
findings_rows = [
    ("Major Non-conformity", "[0]"),
    ("Minor Non-conformity", "[0]"),
    ("CMR Non-conformity", "[0]"),
    ("Milieu-tekortkoming", "[0]"),
    ("Observation", "[0]"),
    ("Good Practice", "[0]"),
    ("Totaal", "[0]"),
]
make_table(doc, ["Classificatie", "Aantal"], findings_rows, col_widths=[10, 5])

doc.add_heading("3.3 Scope Samenvatting", level=2)
doc.add_paragraph("[Korte beschrijving van de audit scope en belangrijkste vaststellingen]")

doc.add_page_break()

# ── Section 4: Audit Scope & Methode ───────────────────────────────────
doc.add_heading("4. Audit Scope & Methode", level=1)
doc.add_heading("4.1 Wat is geaudit", level=2)
doc.add_paragraph("[Beschrijving van de onderdelen van PGS 15:2025 die binnen de audit vallen]")

doc.add_heading("4.2 Documenten geraadpleegd", level=2)
make_table(doc, ["Nr.", "Document", "Versie / Datum"],
           [["1", "[Documentnaam]", "[Versie]"],
            ["2", "[Documentnaam]", "[Versie]"],
            ["3", "[Documentnaam]", "[Versie]"]],
           col_widths=[1.5, 10, 5])

doc.add_heading("4.3 Locaties bezocht", level=2)
make_table(doc, ["Nr.", "Locatie / Afdeling", "Datum"],
           [["1", "[Locatie]", "[DD-MM-YYYY]"],
            ["2", "[Locatie]", "[DD-MM-YYYY]"]],
           col_widths=[1.5, 10, 5])

doc.add_heading("4.4 Personen geïnterviewd", level=2)
make_table(doc, ["Nr.", "Naam", "Functie", "Datum"],
           [["1", "[Naam]", "[Functie]", "[DD-MM-YYYY]"],
            ["2", "[Naam]", "[Functie]", "[DD-MM-YYYY]"]],
           col_widths=[1.5, 5, 5, 4])

doc.add_heading("4.5 Gebruikte Checklist", level=2)
doc.add_paragraph(
    "Deze audit is uitgevoerd conform de PGS 15:2025 Audit Checklist v5.0 en Audit Procedure v5.0."
)

doc.add_page_break()

# ── Section 5: Stoffeninventarisatie (20 stoffen) — NEW ────────────────
doc.add_heading("5. Stoffeninventarisatie (20 stoffen)", level=1)
doc.add_paragraph(
    "Onderstaande tabel bevat de volledige stoffeninventarisatie van de Pilot Plant Slag Chemicals, "
    "gebaseerd op het Meta-Dossier v5.0. Correcties ten opzichte van de vorige versie zijn verwerkt [1]."
)

substances = [
    # (ID, Naam, CAS, Vorm, H-codes, ADR, CMR, Milieu)
    ("IC-01", "Steelmaking Slag (Ladle Slag), powder", "65996-71-6", "Vast", "H315, H318, H335, H372", "Niet gereguleerd", "Nee", "Nee"),
    ("IC-02", "Sulfuric acid 25%", "7664-93-9", "Vloeistof", "H290, H314, H318", "8 / UN 2796 / PG II", "Nee", "Nee"),
    ("IC-03", "Hydrogen peroxide 30%", "7722-84-1", "Vloeistof", "H302, H318, H332", "5.1(8) / UN 2014 / PG II", "Nee", "Nee"),
    ("IC-04", "Sodium persulfate", "7775-27-1", "Vast", "H272, H302, H315, H317, H319, H334, H335", "5.1 / UN 1505 / PG III", "Nee", "Nee"),
    ("IC-05", "Hydrochloric acid 20%", "7647-01-0", "Vloeistof", "H290, H315, H319, H335", "8 / UN 1789 / PG II", "Nee", "Nee"),
    ("IM-01", "Calcium sulfate silica (mixture)", "10101-41-4 / 112945-52-5", "Vast", "Geen", "Niet gereguleerd", "Nee", "Nee"),
    ("IM-02", "Sodium sulfate decahydrate", "7727-73-3", "Vast", "Geen", "Niet gereguleerd", "Nee", "Nee"),
    ("IM-03", "Trisodium orthovanadate", "13721-39-6", "Vast", "H302, H312, H315, H319, H332", "Niet gereguleerd", "Nee", "Nee"),
    ("IM-04", "Sodium metavanadate solution", "13718-26-8", "Vast/Vloeistof", "H301, H319, H332, H341, H361fd, H372, H411", "6.1 / UN 3285 / PG III", "Muta. 2, Repr. 2", "H411"),
    ("EP-01", "Calcium hydroxide", "1305-62-0", "Vast", "H315, H318, H335", "Niet gereguleerd", "Nee", "Nee"),
    ("EP-02", "Silica, precipitated", "112945-52-5", "Vast", "Geen", "Niet gereguleerd", "Nee", "Nee"),
    ("EP-03", "Iron(III) oxide", "1309-37-1", "Vast", "Geen", "Niet gereguleerd", "Nee", "Nee"),
    ("EP-04", "Manganese(IV) oxide", "1313-13-9", "Vast", "H302, H332, H373", "Niet gereguleerd", "Nee", "Nee"),
    ("EP-05", "Magnesium hydroxide", "1309-42-8", "Vast", "Geen", "Niet gereguleerd", "Nee", "Nee"),
    ("EP-06", "Sodium aluminate, solution", "1302-42-7", "Vloeistof", "H290, H314, H318", "8 / UN 1819 / PG II", "Nee", "Nee"),
    ("EP-07", "Sodium phosphate (TSP)", "7601-54-9", "Vast", "H315, H319, H335", "Niet gereguleerd", "Nee", "Nee"),
    ("EP-08", "Vanadium pentoxide", "1314-62-1", "Vast", "H301, H318, H330, H335, H341, H350, H361fd, H362, H372, H411", "6.1 / UN 2862 / PG III", "Carc. 1B, Muta. 2, Repr. 2, Lact.", "H411"),
    ("EP-09", "Vanadium electrolyte", "Multi-component", "Vloeistof", "H290, H302, H314, H318, H335, H361, H370, H372, H401, H411", "8 / UN 2796 / PG II", "Repr. 2", "H401, H411"),
]

# Add correcties footnotes
substance_headers = ["ID", "Stofnaam", "CAS-nr.", "Vorm", "H-codes", "ADR-class.", "CMR", "Milieu"]
table5 = doc.add_table(rows=1 + len(substances), cols=8)
table5.style = 'Table Grid'
table5.alignment = WD_TABLE_ALIGNMENT.CENTER
for i, h in enumerate(substance_headers):
    table5.rows[0].cells[i].text = h
style_header_row(table5)

for ri, row_data in enumerate(substances):
    for ci, val in enumerate(row_data):
        cell = table5.rows[ri + 1].cells[ci]
        cell.text = val
        for p in cell.paragraphs:
            for r in p.runs:
                r.font.size = Pt(8)

# Set column widths
widths = [1.2, 4.0, 2.5, 1.5, 4.5, 3.0, 2.5, 1.5]
for row in table5.rows:
    for ci, w in enumerate(widths):
        row.cells[ci].width = Cm(w)

doc.add_paragraph()
p_note = doc.add_paragraph()
r_note = p_note.add_run("Correcties t.o.v. vorige versie: ")
r_note.bold = True
r_note.font.size = Pt(9)
run = p_note.add_run(
    "(1) Sodium metavanadate: H341 (Muta. 2) toegevoegd per Merck SDS; "
    "(2) Sodium aluminate: H290 toegevoegd, ADR PG III → PG II per SDS; "
    "(3) Vanadium electrolyte: H411 toegevoegd per SDS [1]."
)
run.font.size = Pt(9)

doc.add_heading("5.1 ADR Beoordelingsgrid", level=2)
doc.add_paragraph(
    "Onderstaand grid toont de ADR-klassen die van toepassing zijn op de geïnventariseerde stoffen. "
    "In v4.0 werd alleen klasse 8 beoordeeld; v5.0 dekt nu ook 5.1 en 6.1 [1]."
)
adr_headers = ["ADR Klasse", "Stoffen", "Aantal", "PG II", "PG III"]
adr_rows = [
    ("5.1 — Oxiderende stoffen", "Hydrogen peroxide 30%, Sodium persulfate", "2", "1", "1"),
    ("6.1 — Giftige stoffen", "Sodium metavanadate, Vanadium pentoxide", "2", "0", "2"),
    ("8 — Corrosieve stoffen", "Sulfuric acid 25%, HCl 20%, Sodium aluminate, Vanadium electrolyte", "4", "4", "0"),
    ("Niet gereguleerd", "Overige 12 stoffen", "12", "—", "—"),
]
make_table(doc, adr_headers, adr_rows, col_widths=[3.5, 7, 1.5, 1.5, 1.5])

doc.add_page_break()

# ── Section 6: Bevindingen ─────────────────────────────────────────────
doc.add_heading("6. Bevindingen", level=1)
doc.add_paragraph("Onderstaand worden de bevindingen per item weergegeven.")

for b_num in ["B1", "B2", "B3", "B4", "B5"]:
    doc.add_heading(f"Bevinding {b_num}", level=2)
    b_rows = [
        ("Bevindingsnummer", b_num),
        ("PGS 15:2025 referentie", "[Hoofdstuk.Paragraaf]"),
        ("Classificatie", "[Major / Minor / CMR-non-conform / Milieu-tekortkoming / Observation / Good Practice]"),
        ("Beschrijving", "[Beschrijving van de bevinding]"),
        ("Risico-inschatting", "[Hoog / Midden / Laag]"),
        ("Corrective Action vereist", "[Ja / Nee]"),
        ("Termijn", "[DD-MM-YYYY]"),
        ("Verantwoordelijke", "[Naam / Functie]"),
    ]
    make_table(doc, ["Veld", "Waarde"], b_rows, col_widths=[5, 12])
    doc.add_paragraph()

p_rep = doc.add_paragraph("[Herhaal bovenstaande tabel voor elke aanvullende bevinding B6, B7, …]")
for r in p_rep.runs:
    r.font.italic = True
    r.font.size = Pt(10)

doc.add_page_break()

# ── Section 7: Score Overzicht ─────────────────────────────────────────
doc.add_heading("7. Score Overzicht", level=1)
doc.add_paragraph("Scores per deel van de PGS 15:2025 Audit Checklist v5.0.")

score_rows = [
    ("A", "Algemeen / Organisatie", "[..]", "[..]", "[..]", "[..]", "[..%]"),
    ("B", "Opslag", "[..]", "[..]", "[..]", "[..]", "[..%]"),
    ("C", "Veiligheidsmaatregelen", "[..]", "[..]", "[..]", "[..]", "[..%]"),
    ("D", "Transport & Logistiek", "[..]", "[..]", "[..]", "[..]", "[..%]"),
    ("E", "Milieuzorg", "[..]", "[..]", "[..]", "[..]", "[..%]"),
    ("F", "Documentatie & Beheer", "[..]", "[..]", "[..]", "[..]", "[..%]"),
    ("", "TOTAAL", "[..]", "[..]", "[..]", "[..]", "[..%]"),
]
make_table(doc, ["Deel", "Onderwerp", "Items gecontroleerd", "Conform", "Non-conform", "N.v.t.", "Score %"],
           score_rows, col_widths=[1.5, 4.5, 2.5, 2, 2, 1.5, 2])

doc.add_page_break()

# ── Section 8: Corrective Action Plan ───────────────────────────────────
doc.add_heading("8. Corrective Action Plan (CAP)", level=1)
doc.add_paragraph("[Voeg rijen toe voor elke corrective action]")

cap_headers = ["CAP nr.", "Bevinding", "Beschrijving vereiste actie", "Categorie", "Verantwoordelijke", "Termijn", "Datum afgerond", "Verificatie datum"]
cap_rows = [
    ["CAP-001", "[B1]", "[Beschrijving actie]", "[Veiligheid / CMR / Milieu]", "[Naam]", "[DD-MM-YYYY]", "[DD-MM-YYYY]", "[DD-MM-YYYY]"],
    ["CAP-002", "[B2]", "[Beschrijving actie]", "[Veiligheid / CMR / Milieu]", "[Naam]", "[DD-MM-YYYY]", "[DD-MM-YYYY]", "[DD-MM-YYYY]"],
    ["CAP-003", "[B3]", "[Beschrijving actie]", "[Veiligheid / CMR / Milieu]", "[Naam]", "[DD-MM-YYYY]", "[DD-MM-YYYY]", "[DD-MM-YYYY]"],
    ["CAP-004", "[B4]", "[Beschrijving actie]", "[Veiligheid / CMR / Milieu]", "[Naam]", "[DD-MM-YYYY]", "[DD-MM-YYYY]", "[DD-MM-YYYY]"],
    ["CAP-005", "[B5]", "[Beschrijving actie]", "[Veiligheid / CMR / Milieu]", "[Naam]", "[DD-MM-YYYY]", "[DD-MM-YYYY]", "[DD-MM-YYYY]"],
]
make_table(doc, cap_headers, cap_rows)

doc.add_page_break()

# ── Section 9: Conclusie & Aanbevelingen ────────────────────────────────
doc.add_heading("9. Conclusie & Aanbevelingen", level=1)
doc.add_heading("9.1 Algemene Conclusie", level=2)
doc.add_paragraph("[Samenvattende conclusie over het nalevingsniveau van PGS 15:2025]")

doc.add_heading("9.2 Top 3 Prioriteiten", level=2)
for i in range(1, 4):
    doc.add_paragraph(f"[Prioriteit {i}: beschrijving]", style='List Number')

doc.add_heading("9.3 Aanbevelingen voor Verbetering", level=2)
for i in range(1, 6):
    doc.add_paragraph(f"[Aanbeveling {i}]", style='List Bullet')

doc.add_heading("9.4 Datum Volgende Audit", level=2)
add_field(doc, "Voorgestelde datum", "[DD-MM-YYYY]")
add_field(doc, "Type", "[Follow-up / Periodiek]")

doc.add_page_break()

# ── Section 10: Handtekeningen ─────────────────────────────────────────
doc.add_heading("10. Handtekeningen", level=1)
make_table(doc, ["Rol", "Naam", "Handtekening", "Datum"],
           [["Lead Auditor", "[Naam]", "", "[DD-MM-YYYY]"],
            ["Managementvertegenwoordiger", "[Naam]", "", "[DD-MM-YYYY]"]],
           col_widths=[5, 5, 4, 3])

doc.add_page_break()

# ── Section 11: Bijlagen ───────────────────────────────────────────────
doc.add_heading("11. Bijlagen", level=1)
doc.add_heading("Bijlage A: Uitgewerkte Audit Checklist", level=2)
doc.add_paragraph("[Ingesloten of als apart document — PGS 15:2025 Audit Checklist v5.0, ingevuld]")
doc.add_heading("Bijlage B: Foto's / Bewijsmateriaal", level=2)
make_table(doc, ["Nr.", "Beschrijving", "Bevinding referentie", "Datum"],
           [["1", "[Beschrijving foto]", "[B..]", "[DD-MM-YYYY]"],
            ["2", "[Beschrijving foto]", "[B..]", "[DD-MM-YYYY]"]],
           col_widths=[1.5, 8, 3, 3])

doc.add_page_break()

# ── Section 12: Bronverwijzingen ────────────────────────────────────────
doc.add_heading("12. Bronverwijzingen", level=1)
sources = [
    "[1] Meta-Dossier: Pilot Plant Slag Chemicals — Geverifieerde Stoffenlijst v5.0, JvG Consultancy, 6 mei 2026.",
    "[2] PGS 15:2025 — Publicatiereeks Gevaarlijke Stoffen 15, Versie 2025, Ministerie van I&W.",
    "[3] ADR 2025 — European Agreement concerning the International Carriage of Dangerous Goods by Road, UNECE.",
    "[4] SDS Merck — Sodium metavanadate (CAS 13718-26-8), raadpleging mei 2026.",
    "[5] SDS ThermoFisher — Sodium metavanadate (CAS 13718-26-8), raadpleging mei 2026.",
    "[6] SDS diverse leveranciers — Phoenix Metals B.V. stoffenportefeuille, raadpleging april–mei 2026.",
]
for s in sources:
    doc.add_paragraph(s, style='List Bullet')

doc.add_page_break()

# ── Section 13: TierVerify Log ──────────────────────────────────────────
doc.add_heading("13. TierVerify Log", level=1)
verify_rows = [
    ("Stoffeninventarisatie", "20 stoffen, correcties verwerkt", "Meta-Dossier v5.0 + SDS'en", "✅ Geverifieerd"),
    ("ADR-classificatie", "8 stoffen ADR-geclassificeerd", "SDS'en + ADR 2025", "✅ Geverifieerd"),
    ("CMR-classificatie", "3 stoffen CMR (V₂O₅, NaVO₃, VE)", "SDS Merck / TF", "✅ Geverifieerd"),
    ("Milieu-classificatie", "3 stoffen H411 (NaVO₃, V₂O₅, VE)", "SDS'en", "✅ Geverifieerd"),
    ("Correcties v4→v5", "3 correcties doorgevoerd", "SDS-vs-List vergelijking", "✅ Geverifieerd"),
    ("Beoordelingsgrid", "Klassen 5.1, 6.1, 8 opgenomen", "ADR 2025", "✅ Geverifieerd"),
    ("Bronverwijzingen", "6 bronnen geciteerd", "Documentatie", "✅ Geverifieerd"),
    ("Documentstructuur", "13 secties, compleet template", "PGS 15:2025 richtlijn", "✅ Geverifieerd"),
]
make_table(doc, ["Controle", "Beschrijving", "Bron", "Status"], verify_rows, col_widths=[3.5, 5.5, 4.5, 2.5])

# ── Footer ──────────────────────────────────────────────────────────────
doc.add_paragraph()
p_footer = doc.add_paragraph()
p_footer.alignment = WD_ALIGN_PARAGRAPH.CENTER
r_f = p_footer.add_run("JvG Consultancy | Safety • Governance • Advisory | © 2026")
r_f.font.size = Pt(9)
r_f.font.color.rgb = RGBColor(0x00, 0x33, 0x66)

# ── Save ────────────────────────────────────────────────────────────────
doc.save(OUTPUT)
print(f"✅ Saved: {OUTPUT}")
