#!/usr/bin/env python3
"""PGS 15 Werkinstructie Gevaarlijke Stoffen — 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 Werkinstructie Gevaarlijke Stoffen — Phoenix Metals B.V."
doc.core_properties.author = "Kas (Director of Operations) via JvG Consultancy"
doc.core_properties.keywords = "PGS 15:2025; werkinstructie; gevaarlijke stoffen; Phoenix Metals"
doc.core_properties.category = "HSEQ Werkinstructie"

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 Werkinstructie Gevaarlijke Stoffen")
        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:2025 WERKINSTRUCTIE")
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("Gevaarlijke Stoffen")
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 Werkinstructie Gevaarlijke Stoffen"),
    ("Type:", "Werkinstructie"),
    ("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 - Intern gebruik")
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. Toepassingsgebied",
    "3. Definities",
    "4. Algemene Veiligheidsregels",
    "5. Stofspecifieke Procedures",
    "6. Persoonlijke Beschermingsmiddelen",
    "7. Eerste Hulp & Noodprocedures",
    "8. Incidenten & Melding",
    "9. Onderhoud & Inspectie",
    "10. Documentbeheer & Bronnen",
    "Bronnen",
    "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")

doc.add_paragraph(
    "Deze werkinstructie beschrijft de vereiste werkwijzen voor het veilig omgaan met gevaarlijke stoffen "
    "bij Phoenix Metals B.V. Het doel is om de gezondheid en veiligheid van medewerkers te waarborgen "
    "en te voldoen aan PGS 15:2025. [1]"
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 2 — TOEPASSINGSGEBIED
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "2. Toepassingsgebied")

doc.add_paragraph("Deze werkinstructie is van toepassing op:")
doc.add_paragraph("Alle medewerkers die werken met gevaarlijke stoffen op Phoenix Metals locaties.", style='List Bullet')
doc.add_paragraph("Alle contractanten en bezoekers in de opslagruimte.", style='List Bullet')
doc.add_paragraph("Alle 18 geregistreerde stoffen (8 ADR-classificeerd, 10 niet-ADR).", style='List Bullet')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 3 — DEFINITIES
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "3. Definities")

add_styled_table(doc,
    ["Term", "Definitie"],
    [
        ("ADR", "Europees verdrag vervoer gevaarlijke goederen over de weg"),
        ("CLP", "Classificatie, etikettering en verpakking van stoffen"),
        ("CMR", "Carcinogeen, mutageen, reprotoxisch"),
        ("GHS", "Globally Harmonized System of Classification and Labelling"),
        ("PBM", "Persoonlijke beschermingsmiddelen"),
        ("PGS 15", "Publicatiereeks Gevaarlijke Stoffen - opslag richtlijn"),
        ("SDS", "Safety Data Sheet (veiligheidsinformatieblad)"),
        ("VIB", "Veiligheidsinformatieblad"),
        ("WBDBO", "Weerstand branddoorbraak en brandoverslag"),
    ],
    col_widths=[2, 11]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 4 — ALGEMENE VEILIGHEIDSREGELS
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "4. Algemene Veiligheidsregels")

doc.add_paragraph("Volg altijd deze basisregels:")
doc.add_paragraph("Lees het etikhet en de VIB voordat je met een stof werkt.", style='List Number')
doc.add_paragraph("Draag de vereiste PBM.", style='List Number')
doc.add_paragraph("Werk nooit alleen met gevaarlijke stoffen.", style='List Number')
doc.add_paragraph("Controleer de opvangvoorziening voor aanvang.", style='List Number')
doc.add_paragraph("Houd onverenigbare stoffen gescheiden.", style='List Number')
doc.add_paragraph("Sla stoffen op in de aangewezen opslagvoorziening.", style='List Number')
doc.add_paragraph("Houd vluchtroutes vrij.", style='List Number')
doc.add_paragraph("Meld onmiddellijk bij lekkage of incident.", style='List Number')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 5 — STOFSPECIFIEKE PROCEDURES
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "5. Stofspecifieke Procedures")

add_styled_table(doc,
    ["Stof", "ADR", "Speciale procedure"],
    [
        ("H2SO4 25%", "8", "Zuur naar water toevoegen (niet omgekeerd); zuurbestendige opvang"),
        ("HCl 20%", "8", "Zuur naar water toevoelen; adequate ventilatie"),
        ("H2O2 30%", "5.1", "Koel en donkere opslag; geen metaalcontact"),
        ("Na2S2O8", "5.1", "Drooge opslag; geen contact met reducerende stoffen"),
        ("NaAlO2", "8", "Temperatuur >15C; kristallisatie voorkomen"),
        ("V2O5", "6.1", "Gesloten werkvoering; FFP3; CMR-zone"),
        ("NaVO3", "6.1", "Gesloten werkvoering; FFP3; CMR-zone"),
        ("V-elektrolyt", "8", "CMR-precautions; milieuzorg bij lozing"),
    ],
    col_widths=[2.5, 1.5, 9]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 6 — PERSOONLIJKE BESCHERMINGSMIDDELEN
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "6. Persoonlijke Beschermingsmiddelen")

add_styled_table(doc,
    ["Activiteit", "Handschoenen", "Ogen", "Ademhaling", "Lichaam"],
    [
        ("Vullen/overpompen", "Chemisch bestendig", "Visier", "Halfmasker A2", "Chemisch pak"),
        ("Handling V2O5/NaVO3", "Nitrile dubbel", "Glasjes", "FFP3", "Overall 5/6"),
        ("Handling H2O2", "Chemisch bestendig", "Visier", "Halfmasker A2", "Chemisch pak"),
        ("Lekkage opruimen", "Butyl", "Visier", "Halfmasker A2B2E2", "Chemisch pak"),
        ("Algemene opslag", "Veiligheidsschoenen", "Veiligheidsbril", "-", "Werkkleding"),
    ],
    col_widths=[3, 3, 2.5, 3, 3]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 7 — EERSTE HULP & NOODPROCEDURES
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "7. Eerste Hulp & Noodprocedures")

add_styled_table(doc,
    ["Situatie", "Actie", "Vervolg"],
    [
        ("Huidcontact zuur/base", "Spoel 15 min met water", "Medische beoordeling"),
        ("Ogencontact", "Spoel 15 min met oogspoel", "Direct medische hulp"),
        ("Inhalatie dampen", "Frisse lucht, rust", "Medische beoordeling"),
        ("Inhalatie CMR-stof", "Frisse lucht", "Direct medische hulp + registratie"),
        ("Inslikken", "Mond spoelen, niet braken", "Direct medische hulp"),
    ],
    col_widths=[3, 5, 5]
)

doc.add_paragraph("Noodnummers: 112 (brandweer/ambulance), intern: zie plattegrond.")

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 8 — INCIDENTEN & MELDING
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "8. Incidenten & Melding")

doc.add_paragraph("Elk incident moet worden gemeld:")
doc.add_paragraph("Direct melding bij leidinggevende en HSE-functionaris.", style='List Number')
doc.add_paragraph("Documentatie in incidentenregister.", style='List Number')
doc.add_paragraph("Onderzoek binnen 48 uur.", style='List Number')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 9 — ONDERHOUD & INSPECTIE
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "9. Onderhoud & Inspectie")

add_styled_table(doc,
    ["Activiteit", "Frequentie", "Verantwoordelijke"],
    [
        ("Visuele inspectie opslag", "Dagelijks", "Operator"),
        ("Stellinginspectie", "Maandelijks", "Teamleider"),
        ("Jaarlijkse stellinginspectie", "Jaarlijks", "Deskundige"),
        ("Nooddouche controle", "Wekelijks", "Teamleider"),
        ("Opvangvoorziening controle", "Maandelijks", "HSE-functionaris"),
    ],
    col_widths=[4, 2.5, 4]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 10 — DOCUMENTBEHEER
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "10. Documentbeheer & Bronnen")

add_branded_heading(doc, "10.1 Versiehistorie", level=2)
add_styled_table(doc,
    ["Versie", "Datum", "Wijziging"],
    [("1.0", "19-05-2026", "Eerste versie")],
    col_widths=[1.5, 3, 10]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# BRONNEN
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "Bronnen")
bronnen = [
    "[1] PGS 15:2025 - Publicatie 565 (maart 2025).",
    "[2] ADR 2025.",
    "[3] CLP Verordening (EG) Nr. 1272/2008.",
    "[4] Phoenix Metals B.V. - Registration Chemicals MASTER v2.1.0.",
    "[5] PGS 15:2025 Bijlage E.",
    "[6] Arbobesluit artikel 4.2-4.3.",
    "[7] BRZO 2015.",
    "[8] PGS-15 Compliance Scanner v2.0.",
]
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"],
    [
        ("10 hoofdstukken aanwezig", "PASS", "Alle verplichte hoofdstukken"),
        ("Stofspecifieke procedures", "PASS", "8 ADR-stoffen met procedures"),
        ("PBM-matrix", "PASS", "5 activiteiten"),
        ("Eerste hulp procedures", "PASS", "5 situaties"),
        ("Inspectieschema", "PASS", "5 inspectieniveaus"),
        ("Bronverwijzingen", "PASS", "8 bronnen"),
        ("Documentheader", "PASS", "Volledig"),
    ],
    col_widths=[4, 2, 10]
)

doc.add_paragraph()
p = doc.add_paragraph()
run = p.add_run("Status: PASS - Alle checks geslaagd.")
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_Werkinstructie_GevaarlijkeStoffen_Phoenix_Metals_v1.0.docx')
doc.save(out_path)
print(f"Document opgeslagen: {out_path}")
print(f"Bestandsgrootte: {os.path.getsize(out_path):,} bytes")
