#!/usr/bin/env python3
"""Generate DOC 5/12 Part A — Werkinstructie Gevaarlijke Stoffen (Voorblad + H1-H6)"""

from docx import Document
from docx.shared import Inches, Pt, Cm, 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 section in doc.sections:
    section.top_margin = Cm(2.54)
    section.bottom_margin = Cm(2.54)
    section.left_margin = Cm(2.54)
    section.right_margin = Cm(2.54)
    section.header_distance = Cm(0)
    section.footer_distance = Cm(0)

HEADER_BG = '003366'

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_header_row(table, texts, row_idx=0):
    for i, txt in enumerate(texts):
        cell = table.cell(row_idx, i)
        cell.text = ''
        p = cell.paragraphs[0]
        run = p.add_run(txt)
        run.bold = True
        run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
        run.font.name = 'Calibri'
        run.font.size = Pt(10)
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        set_cell_shading(cell, HEADER_BG)

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

def make_table(doc, headers, rows):
    ncols = len(headers)
    nrows = len(rows) + 1
    tbl = doc.add_table(rows=nrows, cols=ncols)
    tbl.style = 'Table Grid'
    tbl.alignment = WD_TABLE_ALIGNMENT.CENTER
    add_header_row(tbl, headers)
    for r, row_data in enumerate(rows):
        add_table_row(tbl, r + 1, row_data)
    return tbl

def add_warning_box(doc, text):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(6)
    p.paragraph_format.space_after = Pt(6)
    run = p.add_run('⛔ WAARSCHUWING: ')
    run.bold = True
    run.font.color.rgb = RGBColor(0xEF, 0x44, 0x44)
    run.font.name = 'Calibri'
    run.font.size = Pt(11)
    run2 = p.add_run(text)
    run2.bold = True
    run2.font.color.rgb = RGBColor(0xEF, 0x44, 0x44)
    run2.font.name = 'Calibri'
    run2.font.size = Pt(11)

def add_info_box(doc, text):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(6)
    p.paragraph_format.space_after = Pt(6)
    run = p.add_run('⚠️ ')
    run.font.size = Pt(11)
    run2 = p.add_run(text)
    run2.bold = True
    run2.font.color.rgb = RGBColor(0xFF, 0x6D, 0x00)
    run2.font.name = 'Calibri'
    run2.font.size = Pt(11)

def add_h(doc, level, text):
    h = doc.add_heading(text, level=level)
    for run in h.runs:
        run.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
        run.font.name = 'Calibri'
    return h

def add_body(doc, text):
    p = doc.add_paragraph(text)
    p.paragraph_format.space_after = Pt(6)
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(11)
    return p

# ══════════════════════════════════════════════════════════════════════
# VOORBLAD
# ══════════════════════════════════════════════════════════════════════

logo_path = '/root/projects/jg/2026-pgs15-phoenix-metals/assets/branding/jvg-consultancy-logo.jpg'
if os.path.exists(logo_path):
    doc.add_picture(logo_path, width=Inches(2.2))
    last = doc.paragraphs[-1]
    last.alignment = WD_ALIGN_PARAGRAPH.CENTER

doc.add_paragraph('')

title = doc.add_paragraph()
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = title.add_run('WERKINSTRUCTIE\nGEVAARLIJKE STOFFEN')
run.bold = True
run.font.size = Pt(28)
run.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
run.font.name = 'Calibri'

subtitle = doc.add_paragraph()
subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = subtitle.add_run('Phoenix Metals IJmuiden — Lab Medewerkers')
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(0x37, 0x41, 0x51)
run.font.name = 'Calibri'

doc.add_paragraph('')

# Meta-data tabel
make_table(doc,
    ['Parameter', 'Waarde'],
    [
        ['Documentnummer', 'PM-WI-GS-005'],
        ['Versie', '1.0'],
        ['Datum', '26 april 2026'],
        ['Auteur', 'JVG Consultancy'],
        ['Classificatie', 'Vertrouwelijk — Intern gebruik'],
        ['Geldigheidsduur', '1 jaar na publicatiedatum'],
    ])

doc.add_paragraph('')

# Goedkeuringstabel
add_body(doc, 'Goedkeuring').bold = True
make_table(doc,
    ['Rol', 'Naam', 'Datum', 'Handtekening'],
    [
        ['Opsteller', 'JVG Consultancy', '26-04-2026', ''],
        ['Lab Manager', '', '', ''],
        ['HSE Coördinator', '', '', ''],
        ['Directie', '', '', ''],
    ])

doc.add_paragraph('')
conf = doc.add_paragraph()
conf.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = conf.add_run('VERTROUWELIJKHEIDSCLAUSULE')
run.bold = True
run.font.size = Pt(10)
run.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
run.font.name = 'Calibri'
add_body(doc, 'Dit document bevat vertrouwelijke informatie van Phoenix Metals IJmuiden. Ongeautoriseerde verspreiding, reproductie of openbaarmaking is strikt verboden. Dit document is uitsluitend bestemd voor geautoriseerd personeel dat direct betrokken is bij de hantering van gevaarlijke stoffen in het laboratorium.')

doc.add_page_break()

# ══════════════════════════════════════════════════════════════════════
# H1 — DOEL EN TOEPASSING
# ══════════════════════════════════════════════════════════════════════

add_h(doc, 1, '1. Doel en Toepassing')

add_body(doc, 'Deze werkinstructie heeft tot doel labmedewerkers van Phoenix Metals IJmuiden te voorzien van eenduidige, bindende voorschriften voor het veilig hanteren, opslaan en verwerken van gevaarlijke stoffen. Het document is opgesteld conform de eisen van PGS 15:2025 (Publicatiereeks Gevaarlijke Stoffen) en de Nederlandse Arbowet (Arbobesluit artikel 4.1c), en fungeert als praktisch hulpmiddel voor het dagelijks werk in het laboratorium.')

add_body(doc, 'De werkinstructie is van toepassing op elke medewerker die gevaarlijke stoffen hanteert, transporteert, opslaat of afvoert binnen de Phoenix Metals faciliteit aan de IJmuiden locatie. Dit omvat vaste medewerkers, tijdelijke krachten, stagiaires en onderaannemers die toegang hebben tot het lab of de opslaglocatie. Naleving van deze instructie is verplicht; afwijkingen vereisen voorafgaande schriftelijke goedkeuring van de Lab Manager en de HSE Coördinator.')

add_body(doc, 'Het laboratorium van Phoenix Metals werkt met zes geregistreerde gevaarlijke stoffen, waarvan vier vallen onder ADR-klasse 8 (bijtende stoffen) en twee als niet-ADR-goederen met specifieke gevarenprofielen. Het totale opslagvolume bedraagt circa 300 liter vloeistof en 15 kg vaste stoffen. Hoewel dit volume onder de drempelwaarden van PGS 15 Tabel 6 valt, blijven de scheidingseisen (Tabel 9, Bijlage E) en de basisveiligheidsmaatregelen onverkort van kracht.')

add_body(doc, 'Deze werkinstructie is een levend document en wordt jaarlijks geëvalueerd, dan wel tussentijds bij wijzigingen in het stoffenbestand, de inrichting of de geldende regelgeving. Medewerkers zijn verplicht wijzigingen direct te implementeren en de meest recente versie te raadplegen via de documentatiehouder.')

# ══════════════════════════════════════════════════════════════════════
# H2 — STOFFENOVERZICHT
# ══════════════════════════════════════════════════════════════════════

add_h(doc, 1, '2. Stoffenoverzicht')

add_body(doc, 'Het chemisch register van Phoenix Metals omvat zes stoffen die in het laboratorium worden gebruikt voor metaalverwerking en chemische procesvoering. Het overzicht hieronder specificeert per stof de primaire gevaren, de vereiste persoonlijke beschermingsmiddelen en bijzondere aandachtspunten. Elke medewerker dient dit overzicht paraat te hebben vóórdat men met een van deze stoffen werkt.')

add_warning_box(doc, 'Natriumhydroxide (NaOH) en Zwavelzuur (H₂SO₄) mogen NOOIT in contact komen met elkaar. De reactie is sterk exotherm en kan leiden tot spatten, hitteontwikkeling en ernstige brandwonden. Scheiding in aparte opslagzones is wettelijk verplicht.')

make_table(doc,
    ['Stof', 'Gevaar', 'GHS-pictogram', 'PBM-vereisten', 'Speciale aandacht'],
    [
        ['Natriumhydroxide 50%\n(NaOH)', 'Bijtend, ernstige\nhuid- en oogletsel', 'Corrosie\n(exclamatie)', 'Nitril handschoenen,\ngezichtsscherm,\nlabjas', 'Extreem bijtend.\nContact met zuur = exotherm.\nVerbrandingsgevaar.'],
        ['Zwavelzuur 75%\n(H₂SO₄)', 'Zeer bijtend,\nreactief met water', 'Corrosie\n(exclamatie)', 'Zuur-bestendige\nhandschoenen,\ngezichtsscherm,\nschort', 'Concentratieverhoging\nvia water = exotherm.\nNOOIT water op zuur.'],
        ['Zwavelzuur 50%\n(H₂SO₄)', 'Bijtend', 'Corrosie', 'Zuur-bestendige\nhandschoenen,\ngezichtsscherm', 'Minder gevaarlijk dan 75%,\nmaar nog steeds bijtend.\nZelfde voorzorgsmaatregelen.'],
        ['Zwavelzuur 25%\n(H₂SO₄)', 'Bijtend\n(verdund)', 'Corrosie', 'Zuur-bestendige\nhandschoenen,\nveiligheidsbril', 'Verdund zuur.\nBijtend bij langdurig\ncontact. Standaard PBM.'],
        ['Aluminiumsulfaat\noctadecahydraat', 'Irriterend,\nstofvorming', 'Exclamatie', 'Stofmasker P2\nbij stofvorming,\nveiligheidsbril', 'Voornamelijk stofgevaar.\nInademing irriterend.\nNiet ADR-geklasseerd.'],
        ['Calciumoxide\n(CaO)', 'Bijtend,\nreactief met water', 'Corrosie\n(exclamatie)', 'Stofmasker P2,\nnitril handschoenen,\nveiligheidsbril', 'Reageert exotherm met\nwater → Ca(OH)₂.\nStof irriteert luchtwegen.'],
    ])

add_body(doc, '')
add_body(doc, 'Sodium hydroxide 50% is een sterk basische oplossing die ernstige chemische brandwonden veroorzaakt bij huid- en oogcontact. De stof is uiterst reactief met zuren — zelfs kleine hoeveelheden zwavelzuur leiden tot een gewelddadige exotherme reactie met spatten als gevolg. NaOH is de meest gebruikte base in het lab en wordt opgeslagen in vier jerrycans van 25 liter elk.')

add_body(doc, 'Zwavelzuur is aanwezig in drie concentraties: 75%, 50% en 25%. De hoogste concentratie (75%) vereist de strengste veiligheidsmaatregelen: bijverdunning met water komt veel warmte vrij. De gouden regel luidt: voeg altijd zuur aan water toe, nooit omgekeerd. De totale zwavelzuurvoorraad bedraagt 200 liter verdeeld over jerrycans van 10 en 25 liter.')

add_body(doc, 'Aluminiumsulfaat en calciumoxide zijn vaste stoffen die niet onder ADR vallen, maar wel specifieke gevaren kennen. Aluminiumsulfaat is voornamelijk een stof- en irriteringsgevaar. Calciumoxide (gebluste kalk) reageert exotherm met water en vormt bijtende calciumhydroxide; stofinzinking is irriterend voor de luchtwegen.')

# ══════════════════════════════════════════════════════════════════════
# H3 — PERSOONLIJKE BESCHERMINGSMIDDELEN
# ══════════════════════════════════════════════════════════════════════

add_h(doc, 1, '3. Persoonlijke Beschermingsmiddelen')

add_h(doc, 2, '3.1 Standaard PBM (Altijd Verplicht)')

add_body(doc, 'Bij het betreden van het laboratorium en bij elke handeling met gevaarlijke stoffen zijn de volgende standaard beschermingsmiddelen verplicht. Deze vormen het absolute minimum en gelden onverkort, ongeacht de aard van de werkzaamheden. Het niet dragen van standaard PBM resulteert in een directe werkvergunning intrekking.')

bullets_standard = [
    'Veiligheidsbril (EN 166) — beschermt tegen spatten en deeltjes. verplicht bij het betreden van het lab. Gewone brillen zijn geen vervanging.',
    'Labjas (100% katoen of polyester-katoen mix) — beschermt kleding en huid tegen spatten. De jas moet altijd gesloten worden gedragen. Controleer op gaten of slijtage vooraf.',
    'Gesloten schoenen (geen sandalen, geen open neus) — beschermt tegen morsen en vallende voorwerpen. Schoenen moeten de volledige voet bedekken. Het dragen van veiligheidsschoenen (EN ISO 20345) wordt sterk aanbevolen.',
]
for b in bullets_standard:
    p = doc.add_paragraph(b, style='List Bullet')
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(11)

add_h(doc, 2, '3.2 Specifieke PBM per Stof')

add_body(doc, 'Naast de standaard PBM gelden per stof aanvullende beschermingsmaatregelen. De onderstaande tabel toont de minimale aanvullende PBM-eisen per stof. Bij twijfel altijd het zwaarste beschermingsniveau kiezen.')

make_table(doc,
    ['Stof', 'Handen', 'Ogen/Gezicht', 'Lichaam', 'Ademhalingsbescherming'],
    [
        ['NaOH 50%', 'Nitril handschoenen\n(EN 374)', 'Gezichtsscherm\n(EN 166)', 'Labjas (standaard)', 'Niet vereist\n(vloeistof)'],
        ['H₂SO₄ 75%', 'Zuur-bestendige handschoenen\n(EN 374, type A)', 'Gezichtsscherm\n(EN 166)', 'Zuur-bestendig schort\nover labjas', 'Niet vereist\n(vloeistof)'],
        ['H₂SO₄ 50%', 'Zuur-bestendige handschoenen\n(EN 374)', 'Gezichtsscherm\n(EN 166)', 'Labjas (standaard)', 'Niet vereist'],
        ['H₂SO₄ 25%', 'Zuur-bestendige handschoenen\n(EN 374)', 'Veiligheidsbril\n(standaard)', 'Labjas (standaard)', 'Niet vereist'],
        ['Al-sulfaat', 'Nitril handschoenen', 'Veiligheidsbril\n(standaard)', 'Labjas (standaard)', 'Stofmasker P2\nbij stofvorming'],
        ['CaO', 'Nitril handschoenen', 'Veiligheidsbril', 'Labjas (standaard)', 'Stofmasker P2\n(altijd bij hanteren)'],
    ])

add_h(doc, 2, '3.3 PBM Controle Checklist (Vooraf)')

add_body(doc, 'Voordat u begint met het hanteren van gevaarlijke stoffen, doorloopt u de volgende vijf controlepunten. Elk punt moet positief worden afgevinkt. Bij een negatieve uitslag op één of meer punten wordt het werk NIET gestart.')

checklist = [
    'Veiligheidsbril: glazen schoon en krasvrij, goede pasvorm, geen scheuren in het montuur.',
    'Handschoenen: juist type voor de betreffende stof (nitril voor base, zuur-bestendig voor zuren), geen perforaties of scheuren, juiste maat.',
    'Labjas: schoon, droog, alle knopen aanwezig, geen gaten of gerafelde naden. Jas volledig gesloten.',
    'Gesloten schoenen: schoon, droge zolen, geen chemische residu van eerdere werkzaamheden.',
    'Aanvullende PBM: gezichtsscherm, schort of stofmasker gereed en in goede staat, indien vereist per stof (zie tabel §3.2).',
]
for i, item in enumerate(checklist, 1):
    p = doc.add_paragraph(f'{i}. {item}')
    p.paragraph_format.left_indent = Cm(0.5)
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(11)

add_h(doc, 2, '3.4 PBM Onderhoud en Vervanging')

add_body(doc, 'Persoonlijke beschermingsmiddelen zijn geen eenmalige investering. Regelmatig onderhoud en tijdige vervanging zijn essentieel om de beschermingsfunctie te garanderen. De volgende richtlijnen gelden voor alle PBM in het laboratorium.')

add_body(doc, 'Handschoenen worden na elk gebruik geïnspecteerd op scheuren, perforaties en verkleuring. Bij twijfel over de integriteit worden handschoenen direct vervangen — hergebruik van beschadigde handschoenen is verboden. Wegwerp-handschoenen worden na één gebruik afgevoerd als chemisch afval. Herbruikbare zuur-bestendige handschoenen worden na gebruik gespoeld met water en opgehangen te drogen.')

add_body(doc, 'Veiligheidsbrillen en gezichtsschermen worden wekelijks gereinigd met een zachte doek en milde zeep. Krassen in het vizier verminderen de zichtbaarheid en moeten leiden tot vervanging. De labjas wordt minimaal wekelijks gewassen; bij zichtbare verontreiniging met chemicaliën direct wisselen en de besmette jas apart houden voor speciale reiniging. Stofmaskers (P2) worden na maximaal acht uur gebruik of bij zichtbare vervuiling vervangen. Filters nooit hergebruiken na blootstelling aan vocht.')

# ══════════════════════════════════════════════════════════════════════
# H4 — OPSLAGREGELS
# ══════════════════════════════════════════════════════════════════════

add_h(doc, 1, '4. Opslagregels')

add_info_box(doc, 'ZUREN EN BASEN WORDEN IN APARTE ZONES OPGESLAGEN. DIT IS WETTELIJK VERPLICHT OP GROND VAN PGS 15:2025, BIJLAGE E, TABEL 9. NIET-NALEVING IS EEN OVERTREDING VAN DE ARBOWET.')

add_h(doc, 2, '4.1 Opslaglocatie en Zone-indeling')

add_body(doc, 'Het laboratorium van Phoenix Metals hanteert een strikte zone-indeling voor de opslag van gevaarlijke stoffen. Het opslagrack (storage rack in front of lab) is fysiek verdeeld in twee gemarkeerde zones met een minimum afstand van 2 meter.')

bullets_zones = [
    'Zuur-zone: Alle zwavelzuurconcentraties (75%, 50%, 25%) worden uitsluitend in deze zone opgeslagen. De zone is gemarkeerd met gele vloertape en een bord "ZUREN — GEEN BASEN".',
    'Base-zone: Natriumhydroxide 50% wordt uitsluitend in deze zone opgeslagen. De zone is gemarkeerd met blauwe vloertape en een bord "BASEN — GEEN ZUREN".',
    'Scheidingsafstand: Minimaal 2 meter vrije afstand tussen de zuur-zone en de base-zone, conform PGS 15 Bijlage E, paragraaf E.3 (uitzondering bij opslag <10.000 kg).',
    'Calciumoxide wordt apart opgeslagen van alle zuren (A-scheiding conform Tabel 9) vanwege het sterk basische karakter en exotherme reactierisico met zuren.',
]
for b in bullets_zones:
    p = doc.add_paragraph(b, style='List Bullet')
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(11)

add_h(doc, 2, '4.2 Opslagmethode')

add_body(doc, 'Alle gevaarlijke vloeistoffen worden rechtop staand opgeslagen in goedgekeurde lekbakken. Verpakkingen blijven ten alle tijden gesloten wanneer ze niet direct in gebruik zijn. Jerrycans worden na gebruik direct afgesloten met de originele dop. Het is verboden verpakkingen op de zijde of ondersteboven te plaatsen. Vaste stoffen (aluminiumsulfaat, calciumoxide) worden opgeslagen in gesloten canisters op een droge, verhoogde plaats ter voorkoming van vochtinname.')

add_h(doc, 2, '4.3 Lekbak-eisen')

add_body(doc, 'Elke lekbak moet een opvangcapaciteit hebben van minimaal 110% van het volume van de grootste enkele verpakking in die bak. Voor de 25-liter jerrycans (NaOH 50% en H₂SO₄ 25%) betekent dit een minimale lekbakcapaciteit van 27,5 liter per bak. Voor de 10-liter jerrycans (H₂SO₄ 75% en 50%) geldt een minimum van 11 liter per bak. Lekbakken moeten vervaardigd zijn van materiaal dat bestand is tegen de opgeslagen stof (HDPE of gelakt staal voor zuren en base). Lekbakken worden wekelijks geïnspecteerd op scheuren, corrosie en vloeistofophoping.')

add_h(doc, 2, '4.4 Verboden Handelingen')

add_body(doc, 'De volgende handelingen zijn ten strengste verboden in en rondom de opslaglocatie. Overtreding leidt tot een formele waarschuwing en bij herhaling tot werkvergunning intrekking.')

verboden = [
    'Gevaarlijke stoffen mengen of overgieten in de opslagzone. Mengen gebeurt uitsluitend in de afzuigkap op het lab.',
    'Verpakkingen stapelen. Elke jerrycan en canister staat los in de lekbak — geen stapeling.',
    'Stoffen hanteren zonder volledige PBM (zie §3). Dit geldt ook voor het verplaatsen van verpakkingen binnen het rack.',
    'Etiketten verwijderen, overschilderen of onleesbaar maken. Originele etiketten moeten ten alle tijden zichtbaar en leesbaar blijven.',
    'Voedsel, dranken of persoonlijke spullen opslaan in of nabij de opslagzone.',
    'Roken, eten of drinken in het laboratorium en de opslaglocatie.',
]
for b in verboden:
    p = doc.add_paragraph(b, style='List Bullet')
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(11)

add_h(doc, 2, '4.5 Etikettering')

add_body(doc, 'Alle verpakkingen dragen het originele fabrikantetiket met GHS-pictogrammen, H- en P-zinnen, en de CAS-nummers conform de CLP-Verordening (EG 1272/2008). Naast het originele etiket worden alle opslageenheden voorzien van een NEN-EN-ISO 20560 etiket (GHS-gevarensymbool + stofnaam) op de buitenzijde van de lekbak of het vak. Bij het overgieten van stoffen naar kleinere verpakkingen ontvangt de nieuwe verpakking direct een volledig etiket met dezelfde gevareninformatie. Onetiketteerde verpakkingen worden direct uit omloop genomen en gemeld bij de Lab Manager.')

# ══════════════════════════════════════════════════════════════════════
# H5 — HANTERINGSPROCEDURE
# ══════════════════════════════════════════════════════════════════════

add_h(doc, 1, '5. Hanteringsprocedure')

add_h(doc, 2, '5.1 Voorbereiding')

add_body(doc, 'Elke hantering van gevaarlijke stoffen begint met een gestructureerde voorbereiding. Het doel is om risico\'s te identificeren en te mitigeren voordat de daadwerkelijke blootstelling plaatsvindt. Doorloop altijd de volgende stappen in de aangegeven volgorde:')

vooraf = [
    'PBM-check: Volledig §3.3 checklist afwerken. Bij negatieve uitslag op één punt: werk niet starten.',
    'Werkplekinspectie: Controleer of de afzuigkap functioneert (indien van toepassing), de werkplek schoon en droog is, en voldoende absorptiemateriaal en een nooddouche bereikbaar zijn.',
    'Materialen klaarzetten: Plaats de benodigde stof(fen), een schone trechter, een maatbeker of maatcilinder, en een afvalcontainer binnen handbereik voordat u de verpakking opent.',
    'Werkvergunning: Controleer of een geldige werkvergunning van toepassing is (bij grote volumes of nieuwe stoffen).',
]
for i, item in enumerate(vooraf, 1):
    p = doc.add_paragraph(f'{i}. {item}')
    p.paragraph_format.left_indent = Cm(0.5)
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(11)

add_h(doc, 2, '5.2 Tijdens het Werk')

add_body(doc, 'Tijdens het hanteren van gevaarlijke stoffen gelden de volgende gedragsregels. Afwijken van deze regels is alleen toegestaan na schriftelijke toestemming van de Lab Manager.')

tijdens = [
    'Gebruik altijd de juiste gietechniek: langzaam schenken, de trechter gebruiken, en de ontvangstcontainer niet meer dan 80% vullen om spatten te voorkomen.',
    'Open verpakkingen nooit onnodig lang. Giet de benodigde hoeveelheid af en sluit de verpakking direct.',
    'Werk indien mogelijk in de afzuigkap, zeker bij stoffen die dampen of nevels kunnen vormen (zwavelzuur, calciumoxide).',
    'Houd altijd een oog op de werkplek: bij onverwachte reacties, kleurveranderingen, warmteontwikkeling of gasvorming direct stoppen en de Lab Manager informeren.',
]
for b in tijdens:
    p = doc.add_paragraph(b, style='List Bullet')
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(11)

add_h(doc, 2, '5.3 Na Afloop')

add_body(doc, 'Na afronding van het werk worden de volgende stappen uitgevoerd. Het lab wordt niet verlaten voordat deze afsluitprocedure volledig is doorlopen.')

na = [
    'Afvalafvoer: Chemisch afval wordt verzameld in de daartoe bestemde afvalcontainers (gescheiden naar zuur, base en vast). Containers worden gesloten en voorzien van een afvallabel.',
    'Werkplek opruimen: Alle materialen worden schoongespoeld en teruggeplaatst. Gemorste druppels worden direct verwijderd met absorptiemateriaal.',
    'Handen wassen: Uitgebreid handen wassen met water en zeep, minimaal 30 seconden, ook als handschoenen zijn gedragen.',
    'Logboek bijwerken: Noteer de gebruikte stof, hoeveelheid, datum en eventuele bijzonderheden in het lablogboek.',
]
for i, item in enumerate(na, 1):
    p = doc.add_paragraph(f'{i}. {item}')
    p.paragraph_format.left_indent = Cm(0.5)
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(11)

add_h(doc, 2, '5.4 Verboden Handelingen')

add_body(doc, 'De volgende handelingen zijn te allen tijde verboden in het laboratorium. Overtreding ervan vormt een direct gevaar voor de gezondheid en veiligheid van uzelf en uw collega\'s en zal leiden tot disciplinaire maatregelen.')

verboden2 = [
    'Overgieten zonder trechter — verhoogt het risico op spatten aanzienlijk.',
    'Stoffen mengen zonder voorafgaande compatibiliteitscontrole (raadpleeg §2 en de VIB/SDS).',
    'Roken, eten of drinken in het laboratorium.',
    'Werken met gevaarlijke stoffen als u alleen bent — altijd minimaal twee personen aanwezig.',
    'Het lab verlaten met openstaande verpakkingen of actieve werkzaamheden.',
]
for b in verboden2:
    p = doc.add_paragraph(b, style='List Bullet')
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(11)

# ══════════════════════════════════════════════════════════════════════
# H6 — MORSPROCEDURE
# ══════════════════════════════════════════════════════════════════════

add_h(doc, 1, '6. Morsprocedure')

add_body(doc, 'Een morsincident vereist onmiddellijk en adequaat handelen. De juiste reactie is afhankelijk van het type stof en de omvang van het morsincident. Onderstaande procedures zijn bindend en worden jaarlijks geoefend in een praktijksessie. Elk morsincident — hoe klein ook — wordt gerapporteerd in het incidentenregister.')

add_h(doc, 2, '6.1 Klein Morsincident (< 100 ml)')

add_body(doc, 'Bij een klein morsincident (minder dan 100 milliliter) wordt de volgende procedure gevolgd. De medewerker handelt zelfstandig mits volledig PBM gedragen.')

klein = [
    'Isolatie: Markeer de gemorste zone direct. Voorkom dat anderen door de gemorste stof lopen.',
    'PBM aantrekken: Controleer of u volledig PBM draagt conform §3. Indien niet: eerst PBM aantrekken.',
    'Absorberen: Strooi absorptiemateriaal (chemisorb, universeldeppen of zand) rondom en op de gemorste stof. Werk van buiten naar binnen om verspreiding te voorkomen.',
    'Opruimen: Laat het absorptiemateriaal de stof volledig opnemen. Schep het verzadigde materiaal op in een afvalcontainer. Reinig de ondergrond met water en een geschikt reinigingsmiddel.',
    'Rapporteren: Meld het incident in het incidentenregister met datum, tijd, stof, hoeveelheid en genomen maatregelen.',
]
for i, item in enumerate(klein, 1):
    p = doc.add_paragraph(f'{i}. {item}')
    p.paragraph_format.left_indent = Cm(0.5)
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(11)

add_h(doc, 2, '6.2 Groot Morsincident (> 100 ml)')

add_body(doc, 'Bij een groot morsincident (meer dan 100 milliliter) of bij twijfel over de veiligheid wordt de volgende noodprocedure geactiveerd. De prioriteit ligt op evacuatie en alarmering — niet op zelfstandige opruiming.')

groot = [
    'Evacueren: Verlaat direct het laboratorium via de dichtstbijzijnde uitgang. Neem het gastenregister mee als dit direct beschikbaar is.',
    'Deuren sluiten: Sluit de deuren van het lab achter u om verspreiding van dampen tegen te gaan. Sluit deuren NIET op slot — hulpdiensten moeten toegang hebben.',
    'Lab Manager bellen: Informeer de Lab Manager via intercom of mobiele telefoon. Geef door: welke stof, geschat volume, en of er personen gewond zijn.',
    '112 bellen: Bel 112 indien er gewonden zijn, indien de stof in het riool of oppervlaktewater dreigt te stromen, of bij brand of rookontwikkeling.',
    'Wacht buiten: Blijf op een veilige afstand (minimaal 10 meter) en ontvang de hulpdiensten. Geef de VIB/SDS van de betrokken stof aan de hulpverleners.',
]
for i, item in enumerate(groot, 1):
    p = doc.add_paragraph(f'{i}. {item}')
    p.paragraph_format.left_indent = Cm(0.5)
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(11)

add_h(doc, 2, '6.3 Specifieke Procedure: NaOH-morsing')

add_warning_box(doc, 'Natriumhydroxide NOOIT neutraliseren met een zuur. De neutralisatiereactie is sterk exotherm en veroorzaakt spatten en hitte-ontwikkeling.')

add_body(doc, 'Bij morsing van natriumhydroxide 50% wordt de gemorste stof geabsorbeerd met inert absorptiemateriaal (chemisorb of universeldeppen). Het gemorste gebied wordt daarna voorzichtig nagespoeld met een kleine hoeveelheid water terwijl de afvoer wordt opgevangen in een lekbak. Het spoelwater wordt als chemisch afval afgevoerd. Dragen altijd nitril handschoenen en gezichtsscherm tijdens de opruiming.')

add_h(doc, 2, '6.4 Specifieke Procedure: H₂SO₄-morsing')

add_warning_box(doc, 'Zwavelzuur NOOIT direct met grote hoeveelheden water verdunnen — de reactie is exotherm en kan leiden tot kokend water en spatten.')

add_body(doc, 'Bij morsing van zwavelzuur wordt de gemorste stof geabsorbeerd met zand, chemisorb of een geschikte universele absorbent. Na absorptie wordt het materiaal voorzichtig opgeschept in een afvalcontainer. De ondergrond wordt daarna neutraliserend nagespoeld met een natriumbicarbonaat-oplossing (bakpoeder), gevolgd door water. Draag altijd zuur-bestendige handschoenen, gezichtsscherm en schort tijdens de opruiming.')

add_h(doc, 2, '6.5 Eerste Hulp')

add_body(doc, 'De volgende eerste-hulpmaatregelen zijn specifiek voor blootstelling aan de in dit lab gebruikte gevaarlijke stoffen. Bij twijfel altijd direct een arts raadplegen en de VIB/SDS meenemen.')

make_table(doc,
    ['Blootstelling', 'Maatregel', 'Vervolgactie'],
    [
        ['Huidcontact', 'Direct spoelen met veel water,\nminimaal 15 minuten.\nBesmette kleding uittrekken.', 'Arts raadplegen bij\nroodheid, blaren of pijn.\nBlijven spoelen tot arts arriveert.'],
        ['Oogcontact', 'Direct spoelen met veel water\nof oogdouchespiraal,\nminimaal 15 minuten.\nOogleden openhouden.', 'Direct arts raadplegen.\nOogarts inschakelen.\nNOOIT neutraliseren.'],
        ['Inslikken', 'Mond spoelen met water.\nNIET braken opwekken.\nGeen Zuiveringszout geven.', 'Direct arts raadplegen.\n112 bellen.\nVIB/SDS meenemen.'],
        ['Inademing', 'Slachtoffer naar frisse lucht\nbrengen.\nZitpositie bij benauwdheid.', 'Arts raadplegen bij\nademhalingsklachten.\n112 bij bewusteloosheid.'],
    ])

add_body(doc, '')
add_body(doc, 'Na elk eerste-hulp incident wordt het gebeuren vastgelegd in het ongevallenregister van Phoenix Metals. De HSE Coördinator wordt altijd geïnformeerd, ook bij ogenschijnlijk kleine incidenten. Preventie begint bij registratie.')

# ── Save ────────────────────────────────────────────────────────────
out = '/root/projects/jg/2026-pgs15-phoenix-metals/working/map/doc05_partA.docx'
doc.save(out)
print(f'Saved: {out}')

# Word count
import re
text = []
for p in doc.paragraphs:
    text.append(p.text)
for t in doc.tables:
    for row in t.rows:
        for cell in row.cells:
            text.append(cell.text)
full = ' '.join(text)
words = len(re.findall(r'\b\w+\b', full))
print(f'Word count: {words}')
