#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Kwik Handling Kennisdossier v1.0 - JvG Consultancy branding (deel 1/2)."""
import os
from docx import Document
from docx.shared import Pt, Cm, 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

NAVY = RGBColor(0x00, 0x33, 0x66)
LOGO = "/root/projects/jg/2026-audit-koole-mercury-003057/working/assets/jvg-logo.png"
OUT = "/root/projects/jg/2026-audit-koole-mercury-003057/deliverables/docx/Kwik_Handling_Kennisdossier_v1.0.docx"

doc = Document()

style = doc.styles["Normal"]
style.font.name = "Calibri"
style.font.size = Pt(11)
style.element.rPr.rFonts.set(qn("w:eastAsia"), "Calibri")

for name, size in [("Heading 1", 16), ("Heading 2", 13), ("Heading 3", 11)]:
    st = doc.styles[name]
    st.font.name = "Calibri"
    st.font.size = Pt(size)
    st.font.color.rgb = NAVY
    st.font.bold = True

for s_ in doc.sections:
    s_.top_margin, s_.bottom_margin = Cm(2.2), Cm(2.0)
    s_.left_margin, s_.right_margin = Cm(2.5), Cm(2.5)

def p(text, bold=False, size=11, color=None, align=None, space_after=6):
    par = doc.add_paragraph()
    run = par.add_run(text)
    run.bold = bold
    run.font.size = Pt(size)
    run.font.name = "Calibri"
    if color:
        run.font.color.rgb = color
    if align:
        par.alignment = align
    par.paragraph_format.space_after = Pt(space_after)
    return par

def bullet(text):
    par = doc.add_paragraph(text, style="List Bullet")
    par.paragraph_format.space_after = Pt(3)
    for r in par.runs:
        r.font.size = Pt(11)
        r.font.name = "Calibri"
    return par

def h1(t):
    doc.add_heading(t, level=1)

def h2(t):
    doc.add_heading(t, level=2)

def table(headers, rows):
    t = doc.add_table(rows=1, cols=len(headers))
    t.style = "Table Grid"
    t.alignment = WD_TABLE_ALIGNMENT.CENTER
    for i, htxt in enumerate(headers):
        cell = t.rows[0].cells[i]
        cell.text = htxt
        for r in cell.paragraphs[0].runs:
            r.bold = True
            r.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
            r.font.size = Pt(10)
            r.font.name = "Calibri"
        shd = OxmlElement("w:shd")
        shd.set(qn("w:fill"), "003366")
        cell._tc.get_or_add_tcPr().append(shd)
    for row in rows:
        cells = t.add_row().cells
        for i, val in enumerate(row):
            cells[i].text = str(val)
            for r in cells[i].paragraphs[0].runs:
                r.font.size = Pt(10)
                r.font.name = "Calibri"
    doc.add_paragraph().paragraph_format.space_after = Pt(2)
    return t

# Header met logo (2,0 cm breed) of tekstfallback
sec = doc.sections[0]
hdr = sec.header.paragraphs[0]
hdr.alignment = WD_ALIGN_PARAGRAPH.RIGHT
if os.path.exists(LOGO):
    hdr.add_run().add_picture(LOGO, width=Cm(2.0))
else:
    r = hdr.add_run("JvG Consultancy")
    r.bold = True
    r.font.color.rgb = NAVY
    r.font.size = Pt(12)

ftr = sec.footer.paragraphs[0]
ftr.text = "JvG Consultancy - Kwik Handling Kennisdossier v1.0 - 24-08-2026 - Vertrouwelijk"
ftr.alignment = WD_ALIGN_PARAGRAPH.CENTER
for r in ftr.runs:
    r.font.size = Pt(8)
    r.font.color.rgb = NAVY

# ---------- Titelpagina ----------
doc.add_paragraph()
p("KENNISDOSSIER", bold=True, size=26, color=NAVY, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=2)
p("Veilig Omgaan met Kwik", bold=True, size=20, color=NAVY, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=2)
p("(Mercury Safe Handling)", size=14, color=NAVY, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=18)
p("Training offshore decommissioning - small piece removal", size=12, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=4)
p("Documentreferentie: JvG-KD-KWK-2026-001 - Versie 1.0 - 24 augustus 2026", size=10, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=4)
p('Gebaseerd op HSEQ Compliance Audit: Koole Procedure 003.057 "Safe Handling of Mercury Rev 1"', size=10, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=24)

h2("Documentbeheer")
table(["Kenmerk", "Waarde"],
      [["Titel", "Kwik Handling Kennisdossier"],
       ["Versie", "1.0"],
       ["Datum", "24-08-2026"],
       ["Auteur", "JvG Consultancy"],
       ["Status", "Definitief (training)"],
       ["Classificatie", "Vertrouwelijk"]])

doc.add_page_break()

# ================= DEEL 1 =================
h1("Deel 1 - Theoretische achtergrond")

h2("1.1 Wat is kwik?")
p("Kwik (CAS-nummer 7439-97-6) is het enige metaal dat bij kamertemperatuur vloeibaar is. Het verdampt al bij kamertemperatuur; kwikdamp is kleurloos en geurloos, waardoor blootstelling onopgemerkt plaatsvindt. Belangrijke eigenschappen zijn de hoge dichtheid (13,5 g/cm3), de sterke oppervlaktespanning (kwik vormt bolletjes die in scheuren en voegen kruipen) en de goede elektrische geleiding. Juist deze eigenschappen maakten kwik decennialang geschikt voor industriële toepassingen in de olie- en gasindustrie - en verklaren waarom oudere offshore-installaties daar nog steeds kwik bevatten [2, 15].")

h2("1.2 Gezondheidsrisico's")
p("Blootstelling aan kwikdamp vindt vooral plaats via inhalatie; daarnaast zijn huidcontact en inslikken blootstellingsroutes. Kwik hoopt zich op in het lichaam en wordt zeer langzaam uitgescheiden. Elementair kwik heeft volgens de CLP-Verordening (EG) 1272/2008 onder andere de volgende gevarenindelingen [7]:")
bullet("H360 - Kan de vruchtbaarheid of het ongeboren kind schaden (reprotoxisch).")
bullet("H373 - Kan de organen schaden bij langdurige of herhaalde blootstelling (vooral nieren en centraal zenuwstelsel).")
bullet("H410 - Zeer giftig voor waterorganismen, met langetermijneffecten.")
p("Symptomen van chronische blootstelling zijn onder andere tremor, geheugen- en concentratiestoornissen, prikkelbaarheid en nierschade. Acute hoge blootstelling kan longschade veroorzaken [7, 14].")

h2("1.3 Wettelijk kader")
p("De omgang met kwik in Nederland en de EU wordt bepaald door meerdere kaders:")
bullet("Arbeidsomstandighedenwet (Arbowet) en Arbobesluit Hoofdstuk 4 (Gevaarlijke stoffen) - kern van de arboverplichtingen: RI&E, plan van aanpak, voorlichting, PBM, medische surveillance, grenswaarden en metingen [1, 2].")
bullet("Europese Kwikverordening (EU) 2017/852 - fasering van kwik; opslag-, transport- en afvalvereisten [3].")
bullet("Besluit kwik en kwikhoudende producten - nationale implementatie van productbeperkingen [4].")
bullet("Besluit activiteiten leefomgeving (Bal) - milieuvereisten voor opslag en activiteiten met gevaarlijke stoffen [5].")
bullet("REACH Verordening (EG) 1907/2006 - registratie en verstrekken van veiligheidsinformatiebladen (SDS) [6].")
bullet("CLP Verordening (EG) 1272/2008 - indeling, etikettering en verpakking (H- en P-zinnen) [7].")
bullet("Ondersteunend kader: AI-bladen 31, 18 en 64, SER-grenswaarden, PGS 6 en PGS 12, RIVM/ZZS-richtlijnen en NOGEPA-brancherichtlijnen [8-15].")

h2("1.4 Etikettering en voorzorgsmaatregelen (CLP)")
p("De bijbehorende P-zinnen (voorzorgsmaatregelen) voor elementair kwik luiden [7]:")
bullet("P201 - Verkrijg speciale instructies voor gebruik.")
bullet("P260 - Stof/rook/gas/nevel/damp/aerosol niet inademen.")
bullet("P281 - Draag vereiste persoonlijke beschermingsmiddelen.")
bullet("P301+P310+P330 - NA INSLIKKEN: onmiddellijk een ANTIGIFCENTRUM/arts raadplegen; mond spoelen.")
bullet("P304+P340+P312 - NA INADEMEN: de persoon naar frisse lucht brengen en in een comfortabele houding laten rusten; bij onwel voelen een ANTIGIFCENTRUM/arts raadplegen.")
bullet("P405 - Afgesloten bewaren.")
bullet("P501 - Inhoud/verpakking afvoeren naar een erkende afvalverwerkingsinstallatie.")

# ================= DEEL 2 =================
doc.add_page_break()
h1("Deel 2 - Praktische procedures")

h2("2.1 Risico-Inventarisatie en -Evaluatie (RI&E)")
p("Artikel 4.1 Arbobesluit verplicht een specifieke RI&E voor kwik. Voor offshore decommissioning betekent dit [2, 8]:")
bullet("Identificatie van potentiële kwikbronnen: manometers, kleppen, separatoren, leidingen en andere procesapparatuur.")
bullet("Risicoschatting per activiteit: inspectie, verwijdering (small piece removal), opslag en transport.")
bullet("Beoordeling van blootstellingsroutes: inhalatie (damp), huidcontact en inslikken.")
bullet("Een plan van aanpak (Art. 4.2) met stapsgewijze procedures per fase: pre-removal, removal en post-removal.")

h2("2.2 Grenswaarden")
p("De wettelijke SER-grenswaarden voor kwik en anorganische kwikverbindingen [2, 11]:")
table(["Parameter", "Waarde (mg/m3)", "Basis"],
      [["8-uur TWA (tijdgewogen gemiddelde)", "0,025", "Arbobesluit Art. 4.7"],
       ["STEL (15 minuten)", "0,075", "Arbobesluit Art. 4.7"]])
p("Bij (dreigende) overschrijding volgen direct aanvullende maatregelen: werk stilleggen, oorzaak onderzoeken, blootgestelde werknemers informeren en medische surveillance aanbieden.")

h2("2.3 Persoonlijke beschermingsmiddelen (PBM)")
p("Volgens Art. 4.5 Arbobesluit en AI-blad 18 [2, 9] moet de procedure expliciet specificeren:")
bullet("Ademhalingsbescherming: minimaal FFP3-stofmasker (beschermingsfactor 50); bij kwikdamp aangeraden P3-filter met volgelaatsmasker (beschermingsfactor tot 1000).")
bullet("Handbescherming: nitriele handschoenen (chemisch bestendig; latex is niet geschikt).")
bullet("Lichaamsbescherming: disposable beschermende kleding (Type 5/6) met capuchon.")
bullet("Oogbescherming: gesloten goggles (geen veiligheidsbril met openingen).")
bullet("Voetbescherming: chemisch bestendige laarzen of overschoenen.")

h2("2.4 Metingen en monitoring")
p("Artikel 4.10 Arbobesluit verplicht luchtmetingen [2, 8]. Het meetprotocol moet vastleggen:")
bullet("Hoe: persoonsgebonden en statische metingen, gericht op kwikdamp.")
bullet("Wanneer: voor aanvang (nulmeting), tijdens de werkzaamheden en bij vermoeden van blootstelling.")
bullet("Door wie: een gekwalificeerd meetlaboratorium; resultaten worden geregistreerd en gerapporteerd.")
p("Daarnaast horen detectiemethoden zoals XRF-analyse (op locatie) en laboratoriumanalyse van monsters bij het protocol.")

h2("2.5 Voorlichting, training en medische surveillance")
bullet("Voorlichting en training: Art. 4.3 Arbobesluit en Art. 5 EU 2017/852 verplichten voorlichting over risico's en veilige werkwijzen [2, 3]. Dit Kennisdossier ondersteunt die training.")
bullet("Medische surveillance: Art. 4.6 verplicht arbeidshygiënisch onderzoek voor werknemers met mogelijke blootstelling; een aanbod wordt gedaan voor aanvang, periodiek en bij beëindiging.")
bullet("SDS: een veiligheidsinformatieblad moet op de werkplek beschikbaar en actueel zijn (REACH Art. 31) [6].")

h2("2.6 Noodsituaties (EMVI) en decontaminatie")
p("De Emergency Medische Instructie (EMVI) beschrijft het handelen bij calamiteiten [2, 10]:")
bullet("Lekkage/morsen: werk stilleggen, gebied afzetten, geen stofzuiger of bezem gebruiken (verspreidt druppels en damp), kwik-bindend materiaal (bijv. zwavelpoeder of mercapto-bindmiddel) aanbrengen en gestolde resten verzamelen in een gesloten container.")
bullet("Blootstelling: persoon uit het gebied halen, frisse lucht; bij onwel voelen antigifcentrum/arts inschakelen (zie P-zinnen P301+P310+P330 en P304+P340+P312).")
bullet("Decontaminatie: besmette kleding direct uittrekken en afvoeren als kwikhoudend afval; huid grondig wassen met water en zeep; PBM nooit hergebruiken na besmetting.")
bullet("Escalatie: interne noodprocedure volgen, HSE-officer informeren, incident registreren en rapporteren.")

# ================= DEEL 3 =================
doc.add_page_break()
h1("Deel 3 - Casus: offshore decommissioning (small piece removal)")

h2("3.1 Context")
p('Deze casus is gebaseerd op de HSEQ-compliance-audit van Koole-procedure 003.057 "Safe Handling of Mercury Rev 1" bij de decommissioning van een offshore platform in de Nederlandse Noordzee (opdrachtgever Wintershall, uitvoerder Koole). Bij "small piece removal" worden losse apparatuuronderdelen verwijderd voor de grote lifts. Oudere olie- en gasinstallaties kunnen historische kwikvervuiling bevatten, waardoor kwik bij het openen van apparatuur vrij kan komen [2, 15].')

h2("3.2 Kwikbronnen op het platform")
bullet("Manometers en drukmeters (kwikkolommen).")
bullet("Kleppen, regel- en veiligheidskleppen (kwik in afdichtingen en schakelaars).")
bullet("Separatoren en vaten: gecondenseerd elementair kwik in slib, vloeistof- en gasfasen.")
bullet("Leidinginterieurs: afzettingen van kwikverbindingen bij lage punten en dode einden.")

h2("3.3 Werkwijze small piece removal")
bullet("Stap 1 - Pre-removal survey: identificatie van potentiële kwikbronnen voor verwijdering; verdachte onderdelen markeren.")
bullet('Stap 2 - Testing: XRF-screening op locatie en/of laboratoriumanalyse van monsters; onderscheid maken tussen "verdacht materiaal" en "bevestigd besmet".')
bullet("Stap 3 - Opening en verwijdering: PBM dragen, onderdeel waar mogelijk gesloten houden, drukloos maken, vrijkomend kwik en residu direct opvangen in afgesloten containers.")
bullet("Stap 4 - Registratie: elke vondst en besmetting registreren (bron, locatie, hoeveelheid) ten behoeve van rapportage (Art. 4.10 Arbobesluit en Art. 9 EU 2017/852) [2, 3].")

h2("3.4 Containment en opslag offshore")
p("Tijdelijke opslag op het platform conform PGS 6/12-principes en Art. 4.15 Arbobesluit [2, 12, 13]:")
bullet("Lekdichte, gemarkeerde containers met CLP-etikettering (H360/H373/H410).")
bullet("Gescheiden opslag van kwik en kwikhoudend afval; beperkte hoeveelheden.")
bullet("Geventileerde, afgesloten opslagruimte; temperatuur laag houden (minder verdamping).")
bullet("Toegang beperkt tot getraind en geautoriseerd personeel.")

h2("3.5 Transport en afvoer naar land")
p("Voor vervoer over de weg geldt het ADR. Kwik wordt vervoerd als [2, 3]:")
table(["Parameter", "Vereiste"],
      [["UN-nummer", "UN 2809"],
       ["Naam", "KWIK (MERCURY)"],
       ["ADR-klasse", "Klasse 6.1 (giftige stoffen)"],
       ["Verpakkingsgroep", "III"],
       ["Documenten", "Vervoersdocument ADR + erkenning vervoerder"]])
bullet("Overdracht offshore-naar-land alleen met goedgekeurde, gecertificeerde containers en beveiligd tegen verschuiven (hoge dichtheid).")
bullet("Afvoer uitsluitend naar een erkende verwerker met afvaldocumentatie (begeleidingsbrief) en acceptatiecriteria [2, 3, 5].")

h2("3.6 Lessen uit de audit")
p("De audit van procedure 003.057 toonde aan dat een kwikprocedure minimaal moet bevatten: een concrete RI&E-sectie, een stapsgewijs plan van aanpak, expliciete PBM-specificatie, gedocumenteerde grenswaarden (TWA 0,025 / STEL 0,075 mg/m3), een luchtmeetprotocol, SDS-beschikbaarheid, opslag- en transportvereisten (UN 2809, ADR klasse 6.1), een afvoerprocedure naar een erkende verwerker, een EMVI/decontaminatieprocedure en gedocumenteerde training. Deze elementen vormen de checklist voor de praktijk [2, 3, 7, 11].")

# ================= DEEL 4 =================
doc.add_page_break()
h1("Deel 4 - Bronnenlijst")
refs = [
    "[1] Arbeidsomstandighedenwet (Arbowet) - versie 01-01-2025 t/m heden.",
    "[2] Arbeidsomstandighedenbesluit (Arbobesluit) - Hoofdstuk 4 - versie 26-05-2025.",
    "[3] Europese Kwikverordening (EU) 2017/852.",
    "[4] Besluit kwik en kwikhoudende producten.",
    "[5] Besluit activiteiten leefomgeving (Bal).",
    "[6] REACH Verordening (EG) 1907/2006.",
    "[7] CLP Verordening (EG) 1272/2008.",
    "[8] AI-blad 31: Gevaarlijke stoffen (2025).",
    "[9] AI-blad 18: Persoonlijke beschermingsmiddelen (2025).",
    "[10] AI-blad 64: Laboratoria (2025).",
    "[11] SER-Grenswaarden (wettelijke grenswaarden).",
    "[12] PGS 6: Publicatiereeks Gevaarlijke Stoffen - Opslag en handling.",
    "[13] PGS 12: PGS-12 richtlijnen voor gevaarlijke stoffen.",
    "[14] RIVM / ZZS-richtlijnen voor kwik.",
    "[15] NOGEPA / Offshore brancherichtlijnen.",
    "[16] KNMT richtlijnen voor kwik.",
]
for ref in refs:
    par = p(ref, size=10, space_after=3)
    par.paragraph_format.left_indent = Cm(0.6)
    par.paragraph_format.first_line_indent = Cm(-0.6)

doc.add_paragraph()
p("EINDE DOCUMENT", bold=True, size=10, color=NAVY, align=WD_ALIGN_PARAGRAPH.CENTER)

# ---------- Opslaan ----------
os.makedirs(os.path.dirname(OUT), exist_ok=True)
doc.save(OUT)
print("Opgeslagen:", OUT)

# ---------- Verificatie ----------
from docx import Document as D2
d = D2(OUT)
words = sum(len(par.text.split()) for par in d.paragraphs)
for t in d.tables:
    for row in t.rows:
        for c in row.cells:
            words += len(c.text.split())
print("Verificatie OK - paragrafen:", len(d.paragraphs), "| tabellen:", len(d.tables), "| woorden (incl. tabellen):", words)
