#!/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.")
