#!/usr/bin/env python3
"""Generate PM_VBS04_03_BHV_Organisatie_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, nsdecls
from docx.oxml import parse_xml
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)

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)

# Page margins
for section in doc.sections:
    section.top_margin = Cm(2.5)
    section.bottom_margin = Cm(2.5)
    section.left_margin = Cm(2.5)
    section.right_margin = Cm(2.5)

PRIMARY = RGBColor(0x00, 0x33, 0x66)
TEXT_COLOR = RGBColor(0x1F, 0x29, 0x37)
BORDER_COLOR = RGBColor(0xE5, 0xE7, 0xEB)

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 = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color}"/>')
    cell._tc.get_or_add_tcPr().append(shading)

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
    # Header row
    for i, h in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = ''
        p = cell.paragraphs[0]
        run = p.add_run(h)
        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')
    # Data rows
    for r_idx, row in enumerate(rows):
        for c_idx, val in enumerate(row):
            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(10)
            run.font.name = 'Calibri'
            run.font.color.rgb = TEXT_COLOR
            if r_idx % 2 == 1:
                set_cell_shading(cell, 'F0F4F8')
    if col_widths:
        for i, w in enumerate(col_widths):
            for row in table.rows:
                row.cells[i].width = Cm(w)
    return table

# ── Voorblad ──
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
for _ in range(4):
    p.add_run('\n')

# Logo
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))

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(22)
run.font.color.rgb = PRIMARY
run.font.name = 'Calibri'

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Bedrijfshulpverlening (BHV) Organisatie')
run.bold = True
run.font.size = Pt(18)
run.font.color.rgb = PRIMARY
run.font.name = 'Calibri'

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('VBS Element 4 — Planning voor Noodsituaties | Document #3')
run.font.size = Pt(14)
run.font.color.rgb = TEXT_COLOR
run.font.name = 'Calibri'

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('\n\nVanadiumproductie uit Staalslakken | IJmuiden')
run.font.size = Pt(12)
run.font.color.rgb = TEXT_COLOR

# Documentheader
doc.add_paragraph()
header_info = [
    ('Project', '2026-PM-VBS-Element4'),
    ('Type', 'Organisatie'),
    ('Auteur', 'HQ_04 Technical Writer'),
    ('Versie', '1.0'),
    ('Datum', '29 april 2026'),
    ('Status', 'Final'),
]
table = doc.add_table(rows=len(header_info), cols=2)
table.style = 'Table Grid'
for i, (k, v) in enumerate(header_info):
    c0 = table.rows[i].cells[0]
    c1 = table.rows[i].cells[1]
    c0.text = ''
    c1.text = ''
    r0 = c0.paragraphs[0].add_run(k)
    r0.bold = True
    r0.font.size = Pt(10)
    r0.font.name = 'Calibri'
    r0.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
    set_cell_shading(c0, '003366')
    r1 = c1.paragraphs[0].add_run(v)
    r1.font.size = Pt(10)
    r1.font.name = 'Calibri'
    r1.font.color.rgb = TEXT_COLOR
    c0.width = Cm(4)
    c1.width = Cm(10)

# Documentbeheersing
doc.add_page_break()
doc.add_heading('Documentbeheersing', level=1)
beheer_headers = ['Versie', 'Datum', 'Auteur', 'Wijziging', 'Goedkeuring']
beheer_rows = [
    ['1.0', '29-04-2026', 'HQ_04 Technical Writer', 'Initiële opstelling', 'Jorick van Gemert'],
]
add_styled_table(doc, beheer_headers, beheer_rows)

# ── Section 2: Doel & Scope ──
doc.add_heading('1. Doel en Scope', level=1)
doc.add_paragraph(
    'Dit document beschrijft de organisatie en inzet van de Bedrijfshulpverlening (BHV) '
    'bij Phoenix Metals B.V., conform de Arbowet artikel 15 [1] en het BRZO 2015 artikel 11 [4]. '
    'De BHV fungeert als eerste lijn bij incidenten en waarborgt dat adequate eerste hulp, '
    'brandbestrijding en evacuatie direct beschikbaar zijn.'
)
doc.add_paragraph(
    'Scope: alle medewerkers, contractors en bezoekers van de Phoenix Metals-locatie te IJmuiden.'
)

# ── Section 3: Wettelijk Kader ──
doc.add_heading('2. Wettelijk Kader', level=1)
wet_headers = ['Bron', 'Relevantie']
wet_rows = [
    ['Arbowet art. 15 [1]', 'Verplichting BHV-organisatie'],
    ['Arbobesluit [2]', 'Uitvoeringsregels BHV, eerste hulp, evacuatie'],
    ['BRZO 2015 [4]', 'Interne noodplanverplichting voor Seveso-inrichtingen'],
    ['NEN 4000 / NEN 4000:2014 [3]', 'Norm voor BHV-opleiding en -certificering'],
    ['NTA 8620', 'Beheersing veiligheid procesinstallaties'],
]
add_styled_table(doc, wet_headers, wet_rows)

# ── Section 4: Definities ──
doc.add_heading('3. Definities', level=1)
def_headers = ['Term', 'Definitie']
def_rows = [
    ['BHV', 'Bedrijfshulpverlening — georganiseerde eerste hulp, brandbestrijding en evacuatie'],
    ['Eerste Hulp', 'Initiële medische hulp bij ongevallen, uitgevoerd door getraind personeel'],
    ['Brandbestrijding', 'Bestrijding van beginnende brand door BHV-ers met beschikbare middelen'],
    ['Evacuatie', 'Geordende ontruiming van (delen van) de locatie naar verzamelpunt'],
    ['Communicatie', 'Alarmering van hulpdiensten en interne doorgeleiding van informatie'],
    ['Triage', 'Sortering van slachtoffers naar ernst en prioriteit van behandeling'],
]
add_styled_table(doc, def_headers, def_rows)

# ── Section 5: BHV Organisatiestructuur ──
doc.add_heading('4. BHV Organisatiestructuur', level=1)
doc.add_paragraph(
    'De BHV-organisatie van Phoenix Metals kent vier functieniveaus. '
    'De BHV-coördinator stuurt het BHV-team aan en rapporteert aan de crisisleider (Operations Manager).'
)

doc.add_heading('4.1 BHV-Coördinator (HSEQ Manager)', level=2)
items = [
    'Coördinatie en aansturing van het BHV-team',
    'Onderhoud BHV-middelen en -procedures',
    'Organisatie oefeningen en trainingen (4x per jaar)',
    'Contactpersoon voor externe hulpdiensten',
    'Verplichte opleiding: BHV leidinggevende + NEN 4000',
    'Hercertificering: jaarlijks',
]
for item in items:
    doc.add_paragraph(item, style='List Bullet')

doc.add_heading('4.2 BHV-ers per Shift (minimaal 2 per shift)', level=2)
items = [
    'Eerste hulp bij ongevallen',
    'Beginnende brandbestrijding',
    'Begeleiding evacuatie',
    'Alarmering hulpdiensten',
    'Verplichte opleiding: BHV basis (2 dagen) + chemie-specifieke module (1 dag)',
    'Hercertificering: 2-jaarlijks, jaarlijkse refresher',
]
for item in items:
    doc.add_paragraph(item, style='List Bullet')

doc.add_heading('4.3 EHBO-ers', level=2)
items = [
    'Eerste hulp en levensreddend handelen (inclusief AED)',
    'Triagesupport bij meervoudige slachtoffers',
    'Verplichte opleiding: EHBO + reanimatie/AED',
    'Hercertificering: 2-jaarlijks, jaarlijkse refresher',
]
for item in items:
    doc.add_paragraph(item, style='List Bullet')

doc.add_heading('4.4 Brandwacht', level=2)
items = [
    'Brandpreventie en brandbestrijding (beginnende brand)',
    'Toezicht bij heet werk en brandgevaarlijke werkzaamheden',
    'Verplichte opleiding: Brandbestrijding + heet werk',
    'Hercertificering: jaarlijks, halfjaarlijkse refresher',
]
for item in items:
    doc.add_paragraph(item, style='List Bullet')

# ── Section 6: Team Samenstelling ──
doc.add_heading('5. BHV Team Samenstelling', level=1)
team_headers = ['Rol', 'Aantal', 'Training', 'Certificering', 'Herhaling']
team_rows = [
    ['BHV-coördinator', '1', 'BHV leidinggevende + NEN 4000', 'Jaarlijks', 'Jaarlijks'],
    ['BHV-er (basis)', '6 (2 per shift)', 'BHV basis + chemie specifiek', '2-jaarlijks', 'Jaarlijks refresher'],
    ['EHBO-er', '4', 'EHBO + reanimatie (AED)', '2-jaarlijks', 'Jaarlijks'],
    ['Brandwacht', '3', 'Brandbestrijding + heet werk', 'Jaarlijks', 'Halfjaarlijks'],
]
add_styled_table(doc, team_headers, team_rows)

# ── Section 7: Taken en Bevoegdheden ──
doc.add_heading('6. Taken en Bevoegdheden per BHV-rol', level=1)
doc.add_paragraph('BHV-ers zijn bevoegd en verplicht tot de volgende handelingen:')

taken = [
    'Eerste hulp bij ongevallen (EHBO, AED, stabilisatie)',
    'Brandbestrijding van beginnende brand met beschikbare middelen',
    'Evacuatie-begeleiding naar aangewezen verzamelpunt',
    'Alarmering van hulpdiensten (112) en interne communicatie',
    'Telling van personeel op verzamelpunt',
    'Communicatie naar crisisleider over situatie en slachtoffers',
]
for t in taken:
    doc.add_paragraph(t, style='List Bullet')

p = doc.add_paragraph()
run = p.add_run('Expliciete beperkingen — NIET toegestaan:')
run.bold = True
run.font.color.rgb = RGBColor(0xCC, 0x00, 0x00)
beperkingen = [
    'Heldenwerk of zelf opgezochte risico\'s',
    'Zware brandbestrijding (overlaten aan brandweer)',
    'Betrederen van onveilige zones zonder bescherming',
    'Medische handelingen buiten EHBO-competentie',
]
for b in beperkingen:
    doc.add_paragraph(b, style='List Bullet')

# ── Section 8: BHV Middelen ──
doc.add_heading('7. BHV Middelen — Inventaris', level=1)
mid_headers = ['Middel', 'Locatie', 'Aantal', 'Keuringsfrequentie']
mid_rows = [
    ['EHBO-kit type A+B', 'Kantoor + procesvloer', '3', 'Jaarlijks'],
    ['AED', 'Kantoor ingang', '1', 'Maandelijks check'],
    ['Brandblusser poeder 6 kg', 'Elke 20 m', '12', 'Jaarlijks'],
    ['Brandblusser CO₂ 5 kg', 'Elektrische ruimtes', '4', 'Jaarlijks'],
    ['Brandhaspel', 'Procesgebied', '4', 'Jaarlijks'],
    ['Ongevallendouche', 'Procesvloer (H₂SO₄)', '3', 'Wekelijks'],
    ['Oogdouche', 'Procesvloer + lab', '4', 'Wekelijks'],
    ['Draagbaar gasmeetapparaat', 'BHV-kast', '3', 'Maandelijks kalibratie'],
    ['BHV communication set (radio\'s)', 'BHV-kast', '6', 'Dagelijks check'],
]
add_styled_table(doc, mid_headers, mid_rows)

# ── Section 9: BHV Inzetprotocol ──
doc.add_heading('8. BHV Inzetprotocol', level=1)
doc.add_paragraph(
    'Bij een incident wordt het volgende fasenprotocol doorlopen. '
    'Elke fase kent vaste acties en verantwoordelijkheden.'
)

doc.add_heading('Fase 1 — Initieel (0–5 minuten)', level=2)
f1 = [
    'BHV-er ter plaatse — situatie-inschatting',
    'Eerste hulp verlenen aan slachtoffers',
    'Alarmering intern (BHV-coördinator) en extern (112 indien nodig)',
    'Afbakening incidentgebied',
]
for f in f1:
    doc.add_paragraph(f, style='List Bullet')

doc.add_heading('Fase 2 — Opbouw (5–15 minuten)', level=2)
f2 = [
    'Volledig BHV-team gemobiliseerd',
    'BHV-middelen ingezet (blusmiddelen, EHBO-materiaal)',
    'Evacuatie gestart indien nodig',
    'Communicatie naar crisisleider en omgeving',
]
for f in f2:
    doc.add_paragraph(f, style='List Bullet')

doc.add_heading('Fase 3 — Overdracht (15–30 minuten)', level=2)
f3 = [
    'Externe hulpdiensten arriveren — formele overdracht',
    'BHV-coördinator brieft brandweer/ambulance',
    'Telling op verzamelpunt voltooid',
    'Logboek bijgehouden',
]
for f in f3:
    doc.add_paragraph(f, style='List Bullet')

doc.add_heading('Fase 4 — Ondersteuning (>30 minuten)', level=2)
f4 = [
    'BHV-team ondersteunt hulpdiensten logistiek en informatief',
    'Verzorging ontruimden',
    'Bewaking periferie locatie',
    'Na-incident evaluatie voorbereiding',
]
for f in f4:
    doc.add_paragraph(f, style='List Bullet')

# ── Section 10: Chemie-Specifieke BHV Procedures ──
doc.add_heading('9. Chemie-Specifieke BHV Procedures', level=1)
doc.add_paragraph(
    'Gezien de aanwezigheid van H₂SO₄, NaOH en V₂O₅ gelden de volgende '
    'stofspecifieke eerste-hulpprocedures.'
)

chem_headers = ['Stof', 'Blootstelling', 'Eerste Hulp Actie']
chem_rows = [
    ['H₂SO₄ (96%)', 'Huid-/oogcontact', 'Minimaal 15 minuten spoelen met water, ontkleden, onmiddellijk arts raadplegen [5]'],
    ['V₂O₅ (poeder)', 'Inademing', 'Slachtoffer naar frisse lucht, bij symptomen (hoesten, benauwdheid) direct 112 bellen [5]'],
    ['NaOH (50%)', 'Huid-/oogcontact', 'Minimaal 15 minuten spoelen met water, ontkleden [5]'],
    ['Algemeen — chemische brandwond', 'Huidcontact', 'Niet wrijven, niet neutraliseren op de huid, spoelen met water, medische hulp'],
]
add_styled_table(doc, chem_headers, chem_rows)

# ── Section 11: Opleiding en Training ──
doc.add_heading('10. Opleiding en Training', level=1)
opl_headers = ['Onderdeel', 'Duur', 'Frequentie', 'Norm']
opl_rows = [
    ['BHV basis', '2 dagen + 1 dag chemie module', 'Eenmalig + hercertificering', 'NEN 4000 [3]'],
    ['Jaarlijkse refresher', '1 dag', 'Jaarlijks', 'NEN 4000 [3]'],
    ['Oefenscenario\'s', 'Halve dag per sessie', '4x per jaar', 'Koppeling Doc #07'],
    ['EHBO + AED', '1 dag', '2-jaarlijks', 'Rode Kruis / Oranje Kruis'],
    ['Brandwacht', '1 dag', 'Jaarlijks', 'NEN 4000 [3]'],
]
add_styled_table(doc, opl_headers, opl_rows)

# ── Section 12: Bronnenlijst ──
doc.add_heading('11. Bronnenlijst', level=1)
bronnen = [
    '[1] Arbeidsomstandighedenwet (Arbowet), artikel 15 — BHV-verplichting',
    '[2] Arbeidsomstandighedenbesluit (Arbobesluit) — Uitvoeringsregels BHV',
    '[3] NEN 4000:2014 — Certificering van BHV-opleidingen',
    '[4] Besluit risico\'s zware ongevallen 2015 (BRZO 2015), artikel 11 — Interne noodplannen',
    '[5] Meta-Dossier VBS Element 4, Phoenix Metals B.V., v1.0, 29 april 2026',
]
for b in bronnen:
    doc.add_paragraph(b, style='List Bullet')

# ── Section 13: TierVerify Log ──
doc.add_heading('12. TierVerify Log', level=1)
tv_headers = ['Check', 'Bron', 'Status']
tv_rows = [
    ['Wettelijke basis aanwezig', 'Arbowet art. 15, BRZO 2015 art. 11', '✅ Geverifieerd'],
    ['Chemie-specifieke procedures', 'Meta-Dossier §2 — H₂SO₄, NaOH, V₂O₅', '✅ Geverifieerd'],
    ['BHV-team samenstelling', 'Meta-Dossier §5 — Rollen en verantwoordelijkheden', '✅ Geverifieerd'],
    ['BHV-middelen inventaris', 'Meta-Dossier §7 — Interne hulpmiddelen', '✅ Geverifieerd'],
    ['Alarmniveaus', 'Meta-Dossier §4 — Alarmniveaus 0–4', '✅ Geverifieerd'],
    ['Opleidingsvereisten', 'NEN 4000:2014 [3]', '✅ Geverifieerd'],
    ['Bronverwijzingen compleet', '[1]–[5]', '✅ Geverifieerd'],
]
add_styled_table(doc, tv_headers, tv_rows)

p = doc.add_paragraph()
run = p.add_run('\nTierVerify afgerond — alle checks conform Meta-Dossier v1.0 en wettelijk kader.')
run.font.size = Pt(10)
run.font.italic = True
run.font.color.rgb = TEXT_COLOR

# ── Footer on all sections ──
for section in doc.sections:
    add_footer(section)

# ── Save ──
output_dir = '/root/projects/jg/2026-PM-VBS-Element4/deliverables/docx'
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, 'PM_VBS04_03_BHV_Organisatie_v1.0.docx')
doc.save(output_path)
print(f'Saved: {output_path}')
