#!/usr/bin/env python3
"""Management Samenvatting — Contractor Management & Aansprakelijkheid v3.1
   Met updates: Omgevingswet/BARM, milieuaansprakelijkheid, EU Offshore Safety Directive, scenario's
   JvG Consultancy — 20 mei 2026"""
import os
from docx import Document
from docx.shared import Cm, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml

doc = Document()
doc.core_properties.title = "Management Samenvatting — Contractor Management & Aansprakelijkheid v3.1"
doc.core_properties.author = "JvG Consultancy"
doc.core_properties.keywords = "management samenvatting; contractor management; aansprakelijkheid; offshore; Wintershall; Koole; Omgevingswet; BARM; milieuaansprakelijkheid; EU Offshore Safety Directive"
doc.core_properties.category = "HSEQ Management Samenvatting"

PRIMARY = RGBColor(0x00, 0x33, 0x66); WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK = RGBColor(0x1F, 0x29, 0x37); GRAY = RGBColor(0x37, 0x41, 0x51)
LIGHT_GRAY = RGBColor(0x6B, 0x72, 0x80); SUCCESS = RGBColor(0x00, 0xA8, 0x59)
WARNING = RGBColor(0xF5, 0x9E, 0x0B); ERROR = RGBColor(0xEF, 0x44, 0x44)

style = doc.styles['Normal']; style.font.name = 'Calibri'; style.font.size = Pt(11); style.font.color.rgb = DARK
for lvl in ['Heading 1', 'Heading 2', 'Heading 3']:
    h = doc.styles[lvl]; h.font.name = 'Calibri'; h.font.color.rgb = PRIMARY; h.font.bold = True

def scs(cell, color):
    cell._tc.get_or_add_tcPr().append(parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color}"/>'))

def ast(doc, headers, rows, cw=None):
    t = doc.add_table(rows=1+len(rows), cols=len(headers)); t.style = 'Table Grid'; t.alignment = WD_TABLE_ALIGNMENT.CENTER
    bh = f"{PRIMARY[0]:02X}{PRIMARY[1]:02X}{PRIMARY[2]:02X}"
    for i,h in enumerate(headers):
        c = t.rows[0].cells[i]; c.text = ''; p = c.paragraphs[0]; r = p.add_run(h)
        r.bold = True; r.font.color.rgb = WHITE; r.font.size = Pt(10); scs(c, bh)
    for ri, rd in enumerate(rows):
        for ci, v in enumerate(rd):
            c = t.rows[ri+1].cells[ci]; c.text = ''; p = c.paragraphs[0]; r = p.add_run(str(v))
            r.font.size = Pt(9)
            if ri % 2 == 1: scs(c, "F8F9FA")
    if cw:
        for i,w in enumerate(cw):
            for row in t.rows: row.cells[i].width = Cm(w)
    return t

def bh(doc, text, level=1):
    h = doc.add_heading(text, level=level)
    for run in h.runs: run.font.color.rgb = PRIMARY; run.font.name = 'Calibri'
    return h

def afl(doc):
    for s in doc.sections:
        h = s.header; h.is_linked_to_previous = False
        ht = h.add_table(rows=1, cols=2, width=Cm(16)); ht.alignment = WD_TABLE_ALIGNMENT.CENTER
        lc = ht.rows[0].cells[0]; lc.text = ''
        p = lc.paragraphs[0]; r = p.add_run("Management Samenvatting — Contractor Management & Aansprakelijkheid v3.1")
        r.bold = True; r.font.color.rgb = PRIMARY; r.font.size = Pt(10)
        rc = ht.rows[0].cells[1]; rc.text = ''
        p = rc.paragraphs[0]; p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        lp = '/root/projects/jg/assets/branding/jvg-logo-white-medium.png'
        if os.path.exists(lp):
            r = p.add_run(); r.add_picture(lp, width=Cm(2.0), height=Cm(1.8))
        else:
            r = p.add_run("JvG Consultancy"); r.font.color.rgb = PRIMARY
        f = s.footer; f.is_linked_to_previous = False
        p = f.paragraphs[0]; p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        r = p.add_run("JvG Consultancy | Safety - Governance - Advisory | 2026 | Pagina ")
        r.font.size = Pt(8); r.font.color.rgb = LIGHT_GRAY
        f1 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="begin"/>')
        it = parse_xml(f'<w:instrText {nsdecls("w")} xml:space="preserve">PAGE</w:instrText>')
        f2 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="end"/>')
        r._r.append(f1); r._r.append(it); r._r.append(f2)

# ═══ VOORBLAD ═══
doc.add_paragraph(); doc.add_paragraph()
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("MANAGEMENT SAMENVATTING v3.1"); r.bold = True; r.font.size = Pt(14); r.font.color.rgb = LIGHT_GRAY
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Contractor Management en Aansprakelijkheid"); r.bold = True; r.font.size = Pt(24); r.font.color.rgb = PRIMARY
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("bij Offshore Ontmanteling"); r.bold = True; r.font.size = Pt(18); r.font.color.rgb = PRIMARY
doc.add_paragraph()
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Wintershall Noordzee B.V. | Koole Contractors B.V.")
r.font.size = Pt(12); r.font.color.rgb = GRAY
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Small Piece Removal & Decommissioning — Noordzee")
r.font.size = Pt(11); r.font.color.rgb = GRAY
doc.add_paragraph(); doc.add_paragraph()
it = doc.add_table(rows=6, cols=2); it.alignment = WD_TABLE_ALIGNMENT.CENTER
for i,(l,v) in enumerate([
    ("Project:","Contractor Management & Aansprakelijkheid — Offshore Ontmanteling"),
    ("Type:","Management Samenvatting"),("Auteur:","JvG Consultancy"),
    ("Versie:","3.1"),("Datum:","20 mei 2026"),("Status:","Definitief"),
]):
    it.rows[i].cells[0].text = ''; p = it.rows[i].cells[0].paragraphs[0]; r = p.add_run(l); r.bold = True; r.font.size = Pt(10)
    it.rows[i].cells[1].text = ''; p = it.rows[i].cells[1].paragraphs[0]; r = p.add_run(v); r.font.size = Pt(10)
doc.add_paragraph()
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Vertrouwelijk — Voor directie en management"); r.italic = True; r.font.size = Pt(9); r.font.color.rgb = LIGHT_GRAY
doc.add_page_break()

# ═══ INHOUD ═══
bh(doc,"Inhoud")
for item in [
    "1. Samenvatting",
    "2. Kernbevindingen",
    "3. Verantwoordelijkheidsmatrix",
    "4. Juridische Risico's (incl. milieu)",
    "5. Scenario's",
    "6. Aanbevelingen",
    "7. Bronnen",
]:
    p = doc.add_paragraph(); r = p.add_run(item); r.font.size = Pt(10)
doc.add_page_break()

# ═══ HOOFDSTUK 1 ═══
bh(doc,"1. Samenvatting")
doc.add_paragraph("Dit document is de management samenvatting van het onderzoeksrapport 'Contractor Management en Aansprakelijkheid bij Offshore Ontmanteling' (v3.1). Het richt zich op de contractuele en wettelijke verantwoordelijkheidsverdeling tussen Wintershall Noordzee B.V. (opdrachtgever) en Koole Contractors B.V. (aannemer) voor het 'Small Piece Removal' project. [1][2]")
doc.add_paragraph("Versie 3.1 voegt de volgende onderwerpen toe ten opzichte van v3.0: Omgevingswet/BARM en ongewoon voorval, milieuaansprakelijkheid (ELD/Titel 17.2 Wm), EU Offshore Safety Directive 2013/30/EU, en drie praktijkscenario's. [11][13][18][23]")
doc.add_paragraph("De centrale conclusie is dat Wintershall als opdrachtgever en vergunninghouder de eindverantwoordelijkheid draagt voor zowel veiligheid als milieu. Deze verantwoordelijkheid kan niet worden 'uitbesteed' aan Koole. [1][3][11]")

# ═══ HOOFDSTUK 2 ═══
bh(doc,"2. Kernbevindingen")
ast(doc,["#","Kernbevinding","Impact"],[
    ["1","Wintershall behoudt eindverantwoordelijkheid voor veiligheid én milieu","Hoog — wettelijk onvermijdelijk"],
    ["2","Art. 7:658 lid 4 BW strekt aansprakelijkheid uit tot ingeschakelde derden","Hoog — Wintershall aansprakelijk voor Koole-personeel"],
    ["3","Milieuaansprakelijkheid (ELD): polluter pays","Hoog — Wintershall primair aansprakelijk voor milieuschade"],
    ["4","Omgevingswet/BARM: nieuw regime ongewoon voorval","Middel — nieuwe meldingsplichten Wintershall/RWS"],
    ["5","EU Offshore Safety Directive: operator eindverantwoordelijk","Middel — major hazards, noodplannen, onafhankelijke verificatie"],
    ["6","SodM heeft brede handhavingsbevoegdheden","Middel — inspecties, boetes, werkverbod"],
    ["7","OSPAR 98/3 vereist volledige verwijdering","Middel — geen delen achterlaten"],
    ["8","80+ objecten op Nederlandse Noordzee wachten op ontmanteling","Laag — groeiende markt"],
],cw=[1,6,3])

# ═══ HOOFDSTUK 3 ═══
bh(doc,"3. Verantwoordelijkheidsmatrix")
ast(doc,["Onderwerp","Wintershall","Koole","Wettelijke Basis"],[
    ["Veiligheidsbeleid","PRIMAIR","Uitvoerend","Arbowet Art. 3, 14"],
    ["RI&E","Verifieert","PRIMAIR","Arbobesluit Art. 5.2-5.5"],
    ["PTW Systeem","PRIMAIR","Aanvrager","Arbowet Art. 3"],
    ["Personeelskeuring","Stelt eisen","PRIMAIR","VCA; Arbowet Art. 13"],
    ["PBM","Stelt eisen","PRIMAIR","Arbobesluit"],
    ["Incidenten SodM","PRIMAIR","Rapporteert","Arbowet Art. 9"],
    ["Milieu-incidenten","PRIMAIR (melding SodM/RWS)","Direct meldt aan Wintershall","Omgevingswet/BARM"],
    ["Ontmantelingsplan","PRIMAIR","Voert uit","Mijnbouwwet Art. 35-36"],
    ["OSPAR-compliance","PRIMAIR","Uitvoering","OSPAR 98/3"],
    ["EU Offshore Safety","PRIMAIR (operator)","Afstemming noodprocedures","Directive 2013/30/EU"],
    ["Verzekeringen","Stelt eisen","PRIMAIR","Contractueel"],
],cw=[2.5,3.5,3,3])

# ═══ HOOFDSTUK 4 ═══
bh(doc,"4. Juridische Risico's (incl. milieu)")
ast(doc,["Risico","Oorzaak","Gevolg","Mitigatie"],[
    ["Werkgeversaansprakelijkheid","Art. 7:658 BW","Wintershall aansprakelijk voor Koole-personeel","Actief toezien; documentatie"],
    ["Milieuaansprakelijkheid","ELD/Titel 17.2 Wm","Wintershall primair aansprakelijk voor spill/herstel","Contractuele borging; verzekering"],
    ["SodM-handhaving","Arbowet Art. 9","Boetes, werkverbod","Meldingsprocedures; compliance"],
    ["Omgevingswet/BARM","Ongewoon voorval","Meldingsplicht SodM/RWS; sancties","Procedures afstemmen; oefenen"],
    ["EU Directive-niet-naleving","Major hazard rapport","Sancties; reputatieschade","Contractueel verplichten; verificatie"],
    ["OSPAR-niet-naleving","OSPAR 98/3","Sancties; reputatieschade","Ontmantelingsplan; toezicht"],
],cw=[2.5,3.5,2.5,3.5])

# ═══ HOOFDSTUK 5 ═══
bh(doc,"5. Scenario's")
doc.add_paragraph("Drie praktijkscenario's illustreren de aansprakelijkheidsverdeling:")
ast(doc,["Scenario","Primaire aansprakelijkheid","Secundaire","Les voor Wintershall"],[
    ["Arbeidsongeval Koole-medewerker","Koole (Art. 7:658 BW)","Wintershall (Art. 7:658 lid 4, 7:661 BW)","Actief toezien op operationeel niveau"],
    ["Grote spill/emissie","Wintershall (ELD, Omgevingswet)","Koole (fout handelen)","Contractuele borging; verzekering; procedures"],
    ["Overschrijding vergunning","Wintershall (vergunninghouder)","Koole (contractueel)","Expliciete contractuele verplichtingen"],
],cw=[3,3.5,3.5,3])

# ═══ HOOFDSTUK 6 ═══
bh(doc,"6. Aanbevelingen")
ast(doc,["#","Aanbeveling","Prioriteit","Termijn"],[
    ["1","Contract HSEQ-allocatie (incl. milieu)","Hoog","Voor projectstart"],
    ["2","Meldingsprocedures ongewoon voorval afstemmen (SodM/RWS)","Hoog","Voor projectstart"],
    ["3","Actief toezicht op Koole (inspecties, audits, toolbox)","Hoog","Continu"],
    ["4","Verzekeringsdekking controleren (veiligheid + milieu)","Hoog","Voor projectstart"],
    ["5","Gezamenlijke noodprocedures oefenen (EU Directive)","Hoog","Voor projectstart"],
    ["6","Documentatie bijhouden (RI&E, trainingen, incidenten)","Middel","Continu"],
    ["7","Ontmantelingsplan bij Minister indien nog niet gebeurd","Middel","Voor werkzaamheden"],
    ["8","Juridische review contract (incl. ELD, EU Directive)","Middel","Voor projectstart"],
    ["9","Campaign-gewijze aanpak overwegen","Laag","Planning"],
    ["10","Periodieke juridische review procedures","Laag","Jaarlijks"],
],cw=[1,5,2,2])

# ═══ HOOFDSTUK 7 ═══
bh(doc,"7. Bronnen")
for b in [
    "[1] AI-40: Werkgeversaansprakelijkheid. Sdu HSE.",
    "[2] AI-43: Ongevallenonderzoek. Sdu HSE.",
    "[3] AI-40: Arbowetgeving en handhaving. Sdu HSE.",
    "[4] VCA-eisen (AI-43 hfst 2).",
    "[5] Mijnbouwwet en Mijnbouwregeling.",
    "[6] OSPAR Decision 98/3.",
    "[7] LOGIC Contracts.",
    "[8] NEXSTEP Re-use & Decommissioning Report 2024.",
    "[9] Koole Contractors — www.koole.eu",
    "[10] Wingate Decommissioning Programme — GOV.UK.",
    "[11] Omgevingswet, BAL, BARM. Staatsblad.",
    "[12] NEXSTEP Re-use & Decommissioning Report 2024.",
    "[13] EU Offshore Safety Directive 2013/30/EU.",
    "[14] Koole Contractors — www.koole.eu",
    "[15] Waterland Private Equity — Koole.",
    "[16] Wingate DP — GOV.UK.",
    "[17] Wijzigingswet Mijnbouwwet.",
    "[18] EU Milieuaansprakelijkheidsrichtlijn 2004/35/CE / Titel 17.2 Wm.",
    "[19] HR 20 september 1996, Pollemans/Hoondert.",
    "[20] OSPAR Commission — Offshore Installations.",
    "[21] Frontiers in Marine Science — OSPAR 98/3.",
    "[22] Offshore Norge — WBS Handbook.",
    "[23] Besluit externe veiligheid en veiligheid offshore.",
]:
    p = doc.add_paragraph(); r = p.add_run(b); r.font.size = Pt(9); r.font.color.rgb = GRAY

afl(doc)

out_dir = '/root/projects/jg/2026-contractor-management-offshore/deliverables/docx'
os.makedirs(out_dir, exist_ok=True)
out_path = os.path.join(out_dir, 'Management_Samenvatting_Contractor_Management_v3.1.docx')
doc.save(out_path)
print(f"Management Samenvatting v3.1 opgeslagen: {out_path}")
print(f"Bestandsgrootte: {os.path.getsize(out_path):,} bytes")
