#!/usr/bin/env python3
"""Generate PM_VBS03_02_Heet_Werk_Vonken_v1.0.docx"""

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

doc = Document()

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

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

# ── Helper ──
def add_footer(section):
    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")
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
    run.font.name = 'Calibri'

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

def header_row(table, texts):
    row = table.rows[0]
    for i, txt in enumerate(texts):
        cell = row.cells[i]
        cell.text = ''
        p = cell.paragraphs[0]
        run = p.add_run(txt)
        run.bold = True
        run.font.size = Pt(10)
        run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
        run.font.name = 'Calibri'
        set_cell_shading(cell, '003366')

def add_row(table, texts):
    row = table.add_row()
    for i, txt in enumerate(texts):
        cell = row.cells[i]
        cell.text = ''
        p = cell.paragraphs[0]
        run = p.add_run(txt)
        run.font.size = Pt(10)
        run.font.name = 'Calibri'
        run.font.color.rgb = RGBColor(0x1F, 0x29, 0x37)

# ── Section setup ──
section = doc.sections[0]
section.top_margin = Cm(2.5)
section.bottom_margin = Cm(2.5)
section.left_margin = Cm(2.5)
section.right_margin = Cm(2.5)
add_footer(section)

# ════════════════════════════════════════
# PAGE 1 — VOORBLAD
# ════════════════════════════════════════
for _ in range(4):
    doc.add_paragraph('')

# Logo
logo_path = '/root/projects/jg/assets/branding/jvg-logo-white-medium.png'
if os.path.exists(logo_path):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run()
    run.add_picture(logo_path, width=Cm(2.0), height=Cm(1.8))

doc.add_paragraph('')
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Procedure Heet Werk en Vonken')
run.bold = True
run.font.size = Pt(24)
run.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
run.font.name = 'Calibri'

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('VBS Element 3 — Controle op de Exploitatie\nDocument #2 — PE-290-01-11')
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
run.font.name = 'Calibri'

doc.add_paragraph('')

# Info table on voorblad
info = [
    ('Project', '2026-PM-VBS-Element3'),
    ('Bedrijf', 'Phoenix Metals — Vanadiumproductie uit Staalslakken'),
    ('Locatie', 'IJmuiden (Seveso/BRZO inrichting)'),
    ('Type', 'Procedure'),
    ('Auteur', 'HQ_01 — HSEQ Specialist'),
    ('Versie', '1.0'),
    ('Datum', '29 april 2026'),
    ('Status', 'Final'),
]
t = doc.add_table(rows=0, cols=2)
t.alignment = WD_TABLE_ALIGNMENT.CENTER
for label, val in info:
    row = t.add_row()
    c0 = row.cells[0]
    c0.text = ''
    r0 = c0.paragraphs[0].add_run(label)
    r0.bold = True
    r0.font.size = Pt(11)
    r0.font.name = 'Calibri'
    r0.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
    c0.width = Cm(5)
    c1 = row.cells[1]
    c1.text = ''
    r1 = c1.paragraphs[0].add_run(val)
    r1.font.size = Pt(11)
    r1.font.name = 'Calibri'
    r1.font.color.rgb = RGBColor(0x1F, 0x29, 0x37)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('JvG Consultancy | Safety • Governance • Advisory')
run.font.size = Pt(10)
run.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
run.font.name = 'Calibri'
run.italic = True

doc.add_page_break()

# ════════════════════════════════════════
# SECTION 2 — DOCUMENTBEHEERSING
# ════════════════════════════════════════
doc.add_heading('Documentbeheersing', level=1)

t = doc.add_table(rows=1, cols=4)
t.style = 'Table Grid'
header_row(t, ['Versie', 'Datum', 'Auteur', 'Wijziging'])
add_row(t, ['0.1', '2026-04-25', 'HQ_01', 'Concept opgesteld'])
add_row(t, ['1.0', '2026-04-29', 'HQ_01', 'Final — VBS Element 3 inlevering'])

doc.add_paragraph('')
p = doc.add_paragraph()
run = p.add_run('Goedkeuring:')
run.bold = True
run.font.name = 'Calibri'

t2 = doc.add_table(rows=1, cols=4)
t2.style = 'Table Grid'
header_row(t2, ['Rol', 'Naam', 'Datum', 'Handtekening'])
add_row(t2, ['HSEQ Manager', '', '', ''])
add_row(t2, ['Plant Manager', '', '', ''])
add_row(t2, ['Directie', '', '', ''])

doc.add_page_break()

# ════════════════════════════════════════
# SECTION 3 — DOEL & SCOPE
# ════════════════════════════════════════
doc.add_heading('1. Doel en Scope', level=1)

doc.add_heading('1.1 Doel', level=2)
p = doc.add_paragraph()
p.add_run('Deze procedure definieert de eisen en veiligheidsmaatregelen voor het uitvoeren van heet werk en vonkvormende werkzaamheden bij Phoenix Metals, overeenkomstig PE-290-01-11 [1]. Het doel is het voorkomen van brand, explosie en letselschade door een gestructureerd werkvergunningensysteem met risicoanalyse, preventieve maatregelen en nabewaking.')

doc.add_heading('1.2 Scope', level=2)
p = doc.add_paragraph()
p.add_run('Deze procedure is van toepassing op ').font.name = 'Calibri'
run = p.add_run('alle werkzaamheden met open vuur, vonkvorming, of temperaturen >200°C')
run.bold = True
run.font.name = 'Calibri'
p.add_run(' uitgevoerd op alle Phoenix Metals locaties (IJmuiden pilot/demo plant en bijbehorende terreinen). Dit omvat onder meer:')

items = [
    'Lassen (MIG, TIG, booglassen, gaslassen)',
    'Snijden (autogeen, plasma)',
    'Slijpen en schuren met vonkvormend gereedschap',
    'Boren in metaal met vonkvorming',
    'Verhitten (branders, hittekanonnen)',
    'Stralen en gritstralen (stofvonkvorming)',
    'Elke andere werkzaamheid waarbij temperatuur >200°C of vonkvorming ontstaat',
]
for item in items:
    p = doc.add_paragraph(item, style='List Bullet')
    p.paragraph_format.space_after = Pt(2)

doc.add_heading('1.3 Referentie', level=2)
p = doc.add_paragraph()
p.add_run('Procedurecode: PE-290-01-11 [1]. Onderdeel van het Control of Work systeem (PE-290-01) conform BRZO 2015 Art. 7 [2] en NTA 8620 [3].')

# ════════════════════════════════════════
# SECTION 4 — WETTELIJK KADER
# ════════════════════════════════════════
doc.add_heading('2. Wettelijk Kader', level=1)

t = doc.add_table(rows=1, cols=3)
t.style = 'Table Grid'
header_row(t, ['Wetgeving / Norm', 'Relevantie', 'Artikel/Bepaling'])
data = [
    ('BRZO 2015', 'Operationele procedures voor Seveso-inrichtingen', 'Art. 7 (Element IV) [2]'),
    ('Arbobesluit', 'Algemene plicht zorg voor veilige werkplek', 'Art. 3.1, 3.5, 3.6'),
    ('NTA 8620', 'Control of Work, Hot Work vergunning', 'Hoofdstuk 8.4 [3]'),
    ('PGS 15', 'Opslag gevaarlijke stoffen nabij heet werk', 'Richtlijn veilige afstanden [4]'),
    ('ATEX 137/114', 'Explosieve atmosferen — verbod/extra eisen in ATEX zones', 'RL 1999/92/EC, 2014/34/EU'),
    ('Seveso III', 'Major Accident Prevention, Control of Work', '2012/18/EU Art. 12'),
]
for row_data in data:
    add_row(t, row_data)

# ════════════════════════════════════════
# SECTION 5 — DEFINITIES
# ════════════════════════════════════════
doc.add_heading('3. Definities', level=1)

defs = [
    ('Heet werk', 'Alle werkzaamheden waarbij open vuur, vonken of temperaturen >200°C ontstaan, waaronder lassen, snijden, slijpen, boren en verhitten.'),
    ('Brandwacht (Fire Watch)', 'Een aangewezen persoon die tijdens en na heet werk de omgeving bewaakt op beginnende brand of rookontwikkeling. De brandwacht is uitgerust met een brandblusapparaat en mag geen andere taken uitvoeren.'),
    ('Vonkvrij certificaat', 'Een verklaring dat het gereedschap of de werkmethode voldoet aan de eisen voor gebruik in of nabij gebieden met explosiegevaar, conform ATEX-classificatie.'),
    ('Gasmeting', 'Meting van de concentratie brandbare gassen (LEL), zuurstof (O₂), waterstofsulfide (H₂S) en koolmonoxide (CO) in de werkomgeving vóór en tijdens heet werk.'),
    ('Brandblusmiddel', 'Een voor de locatie geschikt brandblusapparaat (minimaal 6 kg poeder of CO₂), direct beschikbaar en door de brandwacht bedienbaar.'),
    ('Werkvergunning Heet Werk (WV-HW)', 'Het officiële document waarmee een bevoegd persoon toestemming verleent voor het uitvoeren van heet werk onder specifieke voorwaarden.'),
    ('LEL (Lower Explosive Limit)', 'Onderste explosiegrens — de minimale concentratie van een gas in lucht waarbij een explosiemengsel kan ontstaan. Eis: <10% LEL.'),
    ('Permit Author', 'De bevoegde persoon die de werkvergunning beoordeelt en goedkeurt (doorgaans de shiftleider of HSEQ Manager).'),
]
t = doc.add_table(rows=1, cols=2)
t.style = 'Table Grid'
header_row(t, ['Term', 'Definitie'])
for term, defn in defs:
    add_row(t, [term, defn])

# ════════════════════════════════════════
# SECTION 6 — VERANTWOORDELIJKHEDEN (RACI)
# ════════════════════════════════════════
doc.add_heading('4. Verantwoordelijkheden (RACI)', level=1)

t = doc.add_table(rows=1, cols=6)
t.style = 'Table Grid'
header_row(t, ['Activiteit', 'Permit Author', 'Uitvoerder', 'Brandwacht', 'HSEQ Manager', 'Operationeel Manager'])
raci = [
    ('Aanvraag WV-HW', 'A', 'R', 'I', 'C', 'I'),
    ('TRA uitvoeren', 'C', 'R', 'C', 'A', 'I'),
    ('Locatiebeoordeling / ATEX check', 'R', 'C', 'I', 'A', 'I'),
    ('Gasmeting uitvoeren', 'C', 'R', 'R', 'C', 'I'),
    ('Brandpreventieve maatregelen treffen', 'C', 'R', 'R', 'C', 'I'),
    ('Brandwacht aanwijzen', 'A', 'I', 'R', 'C', 'I'),
    ('Goedkeuring vergunning', 'R', 'I', 'I', 'A', 'C'),
    ('Uitvoering heet werk', 'I', 'R', 'R', 'C', 'I'),
    ('Nabewaking (60 min)', 'I', 'C', 'R', 'C', 'I'),
    ('Afsluiting en aftekening', 'A', 'R', 'R', 'I', 'I'),
]
for row_data in raci:
    add_row(t, row_data)

p = doc.add_paragraph()
run = p.add_run('R = Responsible (uitvoerend) | A = Accountable (eindverantwoordelijk) | C = Consulted (geraadpleegd) | I = Informed (geïnformeerd)')
run.font.size = Pt(9)
run.italic = True
run.font.name = 'Calibri'

doc.add_page_break()

# ════════════════════════════════════════
# SECTION 7 — PROCEDURE STAP-VOOR-STAP
# ════════════════════════════════════════
doc.add_heading('5. Procedure Heet Werk', level=1)

steps = [
    ('Stap 1: Aanvraag Werkvergunning Heet Werk (WV-HW)',
     'De uitvoerder dient een aanvraag in via het Control of Work systeem (PE-290-01). De aanvraag bevat: werkomschrijving, locatie, tijdstip, gereedschap, betrokken personen en tijdsduur. De WV-HW is persoonsgebonden en locatiespecifiek.'),
    ('Stap 2: Task Risk Assessment (TRA)',
     'Een specifieke TRA wordt uitgevoerd voor de heet werk activiteit. De TRA identificeert gevaren: brand, explosie, blootstelling aan gevaarlijke stoffen, elektrische risico\'s, en werken op hoogte. Maatregelen worden gedocumenteerd op het TRA-formulier. Bij H₂SO₄- of V₂O₅-betrokkenheid wordt de TRA aangescherpt met chemische risico\'s [5].'),
    ('Stap 3: Locatiebeoordeling en ATEX Zone Check',
     'De locatie wordt beoordeeld op: (a) aanwezigheid van ATEX-zones (koppeling met Element 2, Document #06 — ATEX-classificatie [4]), (b) nabijheid van gevaarlijke stoffen (H₂SO₄, NaOH, V₂O₅, CaO), (c) aanwezigheid van brandbare materialen binnen 13 meter radius, (d) ventilatie en afzuiging. Bij twijfel wordt de HSEQ Manager geraadpleegd.'),
    ('Stap 4: Gasmeting (Explosiemeting)',
     'Een gasmeting wordt uitgevoerd door een bevoegd persoon met een gecalibreerd meetinstrument. Gemeten parameters: LEL (<10% vereist), O₂ (19,5–23,5%), H₂S (<10 ppm), CO (<25 ppm). De meting wordt vastgelegd op de WV-HW. Bij overschrijding van een grenswaarde wordt het heet werk NIET gestart.'),
    ('Stap 5: Brandpreventieve Maatregelen',
     'Binnen een straal van 13 meter rondom de werkplek: (a) alle brandbare materialen verwijderd of afgedekt met brandwerende dekken, (b) openingen (kabelgoten, putten, roosters) afgedekt, (c) minimaal één geschikt brandblusmiddel (6 kg poeder/CO₂) direct beschikbaar, (d) vloer en wanden vrij van olie, vet en afval, (e) vonkenvangers geplaatst bij werk op hoogte.'),
    ('Stap 6: Brandwacht Aanwijzen',
     'Een brandwacht wordt aangewezen per werkplek. Eisen: (a) getraind in brandbestrijding, (b) bekend met locatie en vluchtroutes, (c) uitgerust met brandblusapparaat, (d) mag geen andere taken uitvoeren tijdens heet werk, (e) blijft op post tot 60 minuten na afloop.'),
    ('Stap 7: Goedkeoring door Bevoegd Persoon',
     'De Permit Author (shiftleider of HSEQ Manager) controleert: WV-HW compleet, TRA ondertekend, gasmeting acceptabel, brandpreventieve maatregelen getroffen, brandwacht aangewezen. Bij akkoord wordt de vergunning ondertekend en geldig gesteld (max. één shift, tenzij anders vermeld).'),
    ('Stap 8: Uitvoering met Continue Monitoring',
     'Tijdens het heet werk: (a) brandwacht monitort continu op vonken, rook of brand, (b) gasmeting wordt herhaald bij verandering van omstandigheden (elke 2 uur of bij twijfel), (c) bij onveilige situatie wordt het werk onmiddellijk stilgelegd, (d) de vergunning wordt geactualiseerd bij wijzigingen.'),
    ('Stap 9: Nabewaking (60 minuten)',
     'Na afloop van het heet werk blijft de brandwacht minimaal 60 minuten op post. De omgeving wordt systematisch gecontroleerd op nasmeul, warmteontwikkeling en rook. Dit omvat: de directe werkplek, gebieden onder/achter de werkplek (vonken kunnen 13+ meter afleggen), verborgen ruimtes en kabelgoten.'),
    ('Stap 10: Aftekening en Afsluiting',
     'Na succesvolle nabewaking: (a) brandwacht tekent af op WV-HW, (b) uitvoerder tekent af, (c) Permit Author sluit de vergunning formeel, (d) de vergunning wordt gearchiveerd in het CoW-systeem, (e) eventuele afwijkingen of incidenten worden gerapporteerd via de meldingsprocedure [5].'),
]

for title, desc in steps:
    doc.add_heading(title, level=2)
    p = doc.add_paragraph(desc)
    p.paragraph_format.space_after = Pt(4)

doc.add_page_break()

# ════════════════════════════════════════
# SECTION 8 — SPECIFIEKE EISEN PER LOCATIETYPE
# ════════════════════════════════════════
doc.add_heading('6. Specifieke Eisen per Locatietype', level=1)

p = doc.add_paragraph('De volgende tabel toont aanvullende vereisten afhankelijk van het locatietype waar heet werk wordt uitgevoerd:')

t = doc.add_table(rows=1, cols=2)
t.style = 'Table Grid'
header_row(t, ['Locatietype', 'Extra Vereisten'])
loc_data = [
    ('ATEX zone 20/21/22', 'VERBODEN zonder uitgebreide TRA + explosiebeveiligingsdocument. Raadpleeg Element 2 Doc #06 [4]. Uitsluitend vonkvrij gereedschap. Extra gasmeting vereist.'),
    ('Nabij H₂SO₄ opslag', 'Vonkvrij certificaat vereist voor gereedschap. Extra TRA voor chemische blootstelling (corrosieve dampen). PGS 15 veilige afstand toepassen [4].'),
    ('Nabij V₂O₅ opslag', 'Stofmeting vereist (V₂O₅ = Carc. 1B). Afzuiging + stofafscherming. Ademhalingsbescherming (P3). Afhankelijk van resultaat: vonkvrij certificaat.'),
    ('Buiten (open lucht)', 'Windrichting bepalen en documenteren. Werkzaamheden staken bij windkracht ≥6 Beaufort. Vonkenvangers opwinds geplaatst. Weersomstandigheden vastleggen op WV-HW.'),
    ('Besloten ruimte', 'Continue gasmeting vereist. Mechanische ventilatie + zuurstofmonitoring. Reddingsteam stand-by. Twee vluchtroutes vereist. Communicatiemiddelen verplicht.'),
    ('Op/nabij leidingen', 'LOTO uitvoeren conform PE-290-01. Drukmeting leeg (<0,1 bar). Leiding leeggelopen en gespoeld. Geen restdruk of residu. Afzonderlijke vergunning vereist.'),
]
for row_data in loc_data:
    add_row(t, row_data)

# ════════════════════════════════════════
# SECTION 9 — BRANDPREVENTIE CHECKLIST
# ════════════════════════════════════════
doc.add_heading('7. Brandpreventie Checklist (10-punts)', level=1)

p = doc.add_paragraph('De brandwacht vult deze checklist uit vóór aanvang van het heet werk:')

checklist = [
    'Brandbare materialen binnen 13 meter radius verwijderd of afgedekt met brandwerende dekken.',
    'Opening