#!/usr/bin/env python3
"""Infographic — Verantwoordelijkheden Wintershall vs Koole
   Small Piece Removal Project — Noordzee
   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 = "Infographic — Verantwoordelijkheden Wintershall vs Koole"
doc.core_properties.author = "JvG Consultancy"

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)
WINTERSHALL = RGBColor(0x00, 0x33, 0x66)  # Donkerblauw
KOOLE = RGBColor(0x00, 0x66, 0xCC)  # Lichtblauw
SHARED = RGBColor(0x6B, 0x72, 0x80)  # Grijs

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 add_colored_table(doc, headers, rows, col_colors, cw=None):
    """Tabel met gekleurde kolomheaders"""
    t = doc.add_table(rows=1+len(rows), cols=len(headers)); t.style = 'Table Grid'; t.alignment = WD_TABLE_ALIGNMENT.CENTER
    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)
        color = col_colors[i] if i < len(col_colors) else PRIMARY
        scs(c, f"{color[0]:02X}{color[1]:02X}{color[2]:02X}")
    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("Infographic — Verantwoordelijkheden Wintershall vs Koole")
        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)

# ═══ PAGINA 1 — OVERZICHT ═══
doc.add_paragraph(); doc.add_paragraph()
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("INFOGRAPHIC"); 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("Verantwoordelijkheden bij Small Piece Removal"); r.bold = True; r.font.size = Pt(22); r.font.color.rgb = PRIMARY
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Wintershall Noordzee B.V. vs Koole Contractors B.V."); r.bold = True; r.font.size = Pt(16); r.font.color.rgb = PRIMARY
doc.add_paragraph()
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Noordzee | Decommissioning van Gasplatforms"); r.font.size = Pt(12); r.font.color.rgb = GRAY
doc.add_paragraph(); doc.add_paragraph()

# ── Legenda ──
p = doc.add_paragraph(); r = p.add_run("Legenda:"); r.bold = True; r.font.size = Pt(11)
legenda = doc.add_table(rows=3, cols=3); legenda.alignment = WD_TABLE_ALIGNMENT.CENTER
legenda_data = [
    (WINTERSHALL, "Wintershall — Opdrachtgever / Eindverantwoordelijke"),
    (KOOLE, "Koole — Aannemer / Uitvoerder"),
    (SHARED, "Gedeelde verantwoordelijkheid"),
]
for i,(color,text) in enumerate(legenda_data):
    c = legenda.rows[i].cells[0]; c.text = ''; p = c.paragraphs[0]; r = p.add_run("  ")
    scs(c, f"{color[0]:02X}{color[1]:02X}{color[2]:02X}")
    c.width = Cm(1)
    c = legenda.rows[i].cells[1]; c.text = ''; p = c.paragraphs[0]; r = p.add_run(text)
    r.font.size = Pt(10)

doc.add_paragraph(); doc.add_paragraph()

# ── Hoofdverantwoordelijkheden overzicht ──
bh(doc,"Hoofdverantwoordelijkheden")
add_colored_table(doc,
    ["Verantwoordelijkheid","Wintershall","Koole"],
    [
        ["Eindverantwoordelijkheid veiligheid","PRIMAIR","Ondersteunend"],
        ["RI&E opstellen","Verifieert","PRIMAIR (eigen werk)"],
        ["PTW vergunningverlening","PRIMAIR","Aanvrager"],
        ["Personeelskeuring","Stelt eisen","PRIMAIR (selectie)"],
        ["PBM verstrekking","Stelt eisen","PRIMAIR"],
        ["Incidenten melding SodM","PRIMAIR","Rapporteert"],
        ["Ontmantelingsplan","PRIMAIR (opsteller)","Voert uit"],
        ["OSPAR-compliance","PRIMAIR","Uitvoering"],
        ["Verzekeringen","Stelt eisen","PRIMAIR (afsluiten)"],
        ["SodM-contact","PRIMAIR","Via Wintershall"],
    ],
    [WINTERSHALL, KOOLE],
    cw=[4,3,3]
)

doc.add_page_break()

# ═══ PAGINA 2 — JURIDISCH KADER ═══
bh(doc,"Juridisch Kader — Aansprakelijkheid")
doc.add_paragraph("De wettelijke aansprakelijkheid is het meest kritieke risico voor Wintershall. De volgende bepalingen zijn van toepassing:")

add_colored_table(doc,
    ["Wetsartikel","Inhoud","Risico voor Wintershall"],
    [
        ["Art. 7:658 BW","Werkgever aansprakelijk voor schade werknemer","Koole-personeel kan Wintershall aanspreken"],
        ["Art. 7:658 lid 4 BW","Aansprakelijkheid strekt uit tot ingeschakelde derden","Directe aansprakelijkheid voor contractor-personeel"],
        ["Art. 7:659 BW","Bewijslast op werkgever","Wintershall moet aantonen dat het aan zorgplicht voldoet"],
        ["Art. 7:661 BW","Inlenersaansprakelijkheid","Wintershall aansprakelijk alsof Koole-personeel eigen personeel is"],
        ["Art. 6:162 BW","Onrechtmatige daad","Aansprakelijkheid voor schade aan derden"],
        ["Arbowet Art. 9","Meldingsplicht ongevallen","Directe melding bij SodM verplicht"],
        ["Mijnbouwwet Art. 35-36","Ontmantelingsplan","Wintershall als vergunninghouder verantwoordelijk"],
        ["OSPAR 98/3","Volledige verwijdering","Geen delen achterlaten; sancties bij overtreding"],
    ],
    [ERROR, WARNING],
    cw=[3,5,6]
)

doc.add_paragraph()
p = doc.add_paragraph()
r = p.add_run("Kernbevinding: "); r.bold = True
r = p.add_run("Wintershall kan zich niet onttrekken aan aansprakelijkheid door het uitbesteden van werk aan Koole. De wettelijke aansprakelijkheid is 'doorgeslagen' naar de hele keten.")

doc.add_page_break()

# ═══ PAGINA 3 — RISICO'S EN MITIGATIE ═══
bh(doc,"Risico's en Mitigatiemaatregelen")
add_colored_table(doc,
    ["Risico","Waarschijnlijkheid","Impact","Mitigatiemaatregel"],
    [
        ["Arbeidsongeval Koole-personeel","Middel","Hoog","Actief toezien; inspecties; toolboxmeetings"],
        ["SodM-boete bij niet-naleving","Laag","Hoog","Meldingsprocedures; oefeningen; compliance monitoring"],
        ["OSPAR-niet-naleving","Laag","Middel","Ontmantelingsplan; toezicht op verwijdering"],
        ["Contractbreuk Koole","Laag","Middel","Juridische review; duidelijke HSEQ-eisen"],
        ["Aansprakelijkheidsclaim werknemer","Middel","Hoog","Documentatie; verzekering; zorgplicht naleving"],
        ["Reputatieschade bij incident","Laag","Hoog","Crisiscommunicatie; transparantie; SodM-relatie"],
    ],
    [WARNING, ERROR, SUCCESS],
    cw=[3.5,2,2,5.5]
)

doc.add_paragraph()
bh(doc,"Aanbevelingen op een rij", level=2)
for i, rec in enumerate([
    "Contract met Koole voorzien van duidelijke HSEQ-allocatie en verzekeringseisen",
    "Actief toezicht op naleving door Koole (inspecties, audits, toolboxmeetings)",
    "Meldingsprocedures met Koole afspreken en oefenen",
    "Verzekeringsdekking controleren (Wintershall + Koole)",
    "Documentatie bijhouden (RI&E, trainingen, inspecties, incidenten)",
    "Ontmantelingsplan bij Minister indien nog niet gebeurd",
    "Periodieke juridische review van contract en procedures",
], start=1):
    doc.add_paragraph(f"{i}. {rec}", style='List Number')

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, 'Infographic_Verantwoordelijkheden_Wintershall_Koole_v1.0.docx')
doc.save(out_path)
print(f"Infographic opgeslagen: {out_path}")
print(f"Bestandsgrootte: {os.path.getsize(out_path):,} bytes")
