#!/usr/bin/env python3
"""Management Samenvatting — Contractor Management & Aansprakelijkheid
   Wintershall Noordzee B.V. | Koole Contractors B.V.
   JvG Consultancy — 20 mei 2026"""
import os
from docx import Document
from docx.shared import Cm, Pt, RGBColor, Emu
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"
doc.core_properties.author = "JvG Consultancy"
doc.core_properties.keywords = "management samenvatting; contractor management; aansprakelijkheid; offshore; Wintershall; Koole"
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)
BG_CARD = RGBColor(0xF8, 0xF9, 0xFA); BORDER = RGBColor(0xE5, 0xE7, 0xEB)

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")
        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"); 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:","1.0"),("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 Wintershall vs Koole",
    "4. Juridische Risico's en Aansprakelijkheid",
    "5. Aanbevelingen",
    "6. 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.0). 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 en decommissioning van gasplatforms op de Noordzee. [1][2]"
)
doc.add_paragraph(
    "De centrale conclusie is dat Wintershall als opdrachtgever en vergunninghouder de eindverantwoordelijkheid "
    "draagt voor de veiligheid van alle werkzaamheden op haar installaties. Deze verantwoordelijkheid kan niet "
    "worden 'uitbesteed' aan Koole, ongeacht de contractuele afspraken. De wettelijke aansprakelijkheid op "
    "grond van artikel 7:658 BW (inclusief lid 4) en artikel 7:661 BW vormt een fundamenteel risico dat "
    "actief moet worden beheerst. [1][3]"
)

# ═══ HOOFDSTUK 2 ═══
bh(doc,"2. Kernbevindingen")
ast(doc,["#","Kernbevinding","Impact"],[
    ["1","Wintershall behoudt eindverantwoordelijkheid voor veiligheid, ook bij inkoop van Koole","Hoog — wettelijk onvermijdelijk"],
    ["2","Art. 7:658 lid 4 BW strekt aansprakelijkheid uit tot ingeschakelder derden","Hoog — Wintershall aansprakelijk voor Koole-personeel"],
    ["3","Art. 7:661 BW (inlenersaansprakelijkheid) versterkt dit risico","Hoog — ketenaansprakelijkheid"],
    ["4","Bewijslast rust op werkgever (Art. 7:659 BW)","Hoog — Wintershall moet aantonen dat het aan zorgplicht voldoet"],
    ["5","SodM heeft brede handhavensbevoegdheden","Middel — inspecties, boetes, werkverbod"],
    ["6","OSPAR 98/3 vereist volledige verwijdering","Middel — geen delen achterlaten"],
    ["7","80+ objecten op Nederlandse Noordzee wachten op ontmanteling","Middel — groeiende markt, campagne-aanpak"],
    ["8","Koole is gespecialiseerd in offshore decommissioning","Laag — expertise beschikbaar"],
],cw=[1,6,3])

# ═══ HOOFDSTUK 3 ═══
bh(doc,"3. Verantwoordelijkheidsmatrix Wintershall vs Koole")
ast(doc,["Onderwerp","Wintershall (Opdrachtgever)","Koole (Aannemer)","Wettelijke Basis"],[
    ["Veiligheidsbeleid","Stelt beleid vast; eisen in contract","Voert beleid uit; eigen HSEQ-procedures","Arbowet Art. 3, 14"],
    ["RI&E","Verifieert kwaliteit RI&E van Koole","Stelt RI&E op voor eigen werk","Arbobesluit Art. 5.2-5.5"],
    ["PTW Systeem","Stelt systeem vast; vergunningverlening","Vraagt PTW aan; voert conform vergunning","Arbowet Art. 3"],
    ["Personeelskeuring","Stelt eisen aan competentie","Selecteert en traint eigen personeel","VCA-eisen; Arbowet Art. 13"],
    ["PBM","Stelt eisen in contract","Verstrekt en bewaakt gebruik","Arbobesluit"],
    ["Incidentenonderzoek","Neemt deel; eist rapportage","Voert uit; rapporteert","Arbowet Art. 9"],
    ["Melden bij SodM","Eindverantwoordelijk","Directe melding; informeert Wintershall","Arbowet Art. 9"],
    ["Verzekeringen","Stelt eisen aan dekkingen","Sluit verzekeringen af","Contractueel"],
    ["Ontmantelingsplan","Stelt op; indient bij Minister","Voert werk conform plan","Mijnbouwwet Art. 35-36"],
    ["OSPAR-compliance","Eindverantwoordelijk","Voert verwijdering uit","OSPAR 98/3"],
],cw=[2,4,4,3])

# ═══ HOOFDSTUK 4 ═══
bh(doc,"4. Juridische Risico's en Aansprakelijkheid")
doc.add_paragraph("De belangrijkste juridische risico's voor Wintershall zijn:")
ast(doc,["Risico","Oorzaak","Gevolg","Mitigatie"],[
    ["Werkgeversaansprakelijkheid","Art. 7:658 BW — schade aan Koole-personeel","Wintershall aansprakelijk; bewijslast op Wintershall","Actief toezien; documentatie bijhouden"],
    ["Inlenersaansprakelijkheid","Art. 7:661 BW — inlening via Koole","Wintershall aansprakelijk alsof het eigen personeel is","Contractuele afspraken; verzekering"],
    ["Ketenaansprakelijkheid","Art. 7:658 lid 4 BW — ingeschakelde derden","Uitstrekking aansprakelijkheid naar Koole-personeel","Risico-analyse; verzekeringsdekking"],
    ["SodM-handhaving","Arbowet Art. 9 — meldingsplicht","Boetes, werkverbod, aansprakelijkheidsnastreving","Meldingsprocedures; oefeningen"],
    ["OSPAR-niet-naleving","OSPAR 98/3 — volledige verwijdering","Sancties, reputatieschade","Ontmantelingsplan; toezicht op uitvoering"],
    ["Contractuele aansprakelijkheid","Contract met Koole — HSEQ-eisen","Schadeclaims, contractbreuk","Juridische review contract"],
],cw=[2.5,3.5,3.5,3.5])

# ═══ HOOFDSTUK 5 ═══
bh(doc,"5. Aanbevelingen")
doc.add_paragraph("Op basis van de bevindingen worden de volgende aanbevelingen gedaan:")
ast(doc,["#","Aanbeveling","Prioriteit","Termijn"],[
    ["1","Contract met Koole voorzien van duidelijke HSEQ-allocatie en verzekeringseisen","Hoog","Voor projectstart"],
    ["2","Actief toezicht op naleving door Koole (inspecties, audits, toolboxmeetings)","Hoog","Continu"],
    ["3","Meldingsprocedures met Koole afspreken en oefenen","Hoog","Voor projectstart"],
    ["4","Verzekeringsdekking controleren (Wintershall + Koole)","Hoog","Voor projectstart"],
    ["5","Documentatie bijhouden (RI&E, trainingen, inspecties, incidenten)","Middel","Continu"],
    ["6","Ontmantelingsplan bij Minister indien nog niet gebeurd","Middel","Voor werkzaamheden"],
    ["7","Campaign-gewijze aanpak overwegen met andere Wintershall-faciliteiten","Laag","Planning"],
    ["8","Periodieke juridische review van contract en procedures","Laag","Jaarlijks"],
],cw=[1,5,2,2])

# ═══ HOOFDSTUK 6 ═══
bh(doc,"6. Bronnen")
for b in [
    "[1] AI-40: Werkgeversaansprakelijkheid. Sdu HSE, mr. ing. R.O.B. Poort.",
    "[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] NEXSTEP Re-use & Decommissioning Report 2024.",
    "[8] Koole Contractors — www.koole.eu",
    "[9] Wingate Decommissioning Programme — GOV.UK.",
    "[10] HR 20 september 1996, Pollemans/Hoondert.",
]:
    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_v1.0.docx')
doc.save(out_path)
print(f"Management Samenvatting opgeslagen: {out_path}")
print(f"Bestandsgrootte: {os.path.getsize(out_path):,} bytes")
