#!/usr/bin/env python3
"""Contractor Management & Aansprakelijkheid — Deel 1: Juridisch Kader & Contractuele Verantwoordelijkheden
   Aanvulling op basis van HSEQ kennisbank, AI-40, Mijnbouwwet, OSPAR
   JvG Consultancy — 20 mei 2026 — v2.0"""
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 = "Contractor Management en Aansprakelijkheid bij Offshore Ontmanteling — Aanvulling v2.0"
doc.core_properties.author = "JvG Consultancy"
doc.core_properties.keywords = "contractor management; aansprakelijkheid; offshore; ontmanteling; Wintershall; Koole; small piece removal; Noordzee; VCA; PTW; ketenaansprakelijkheid; inlenersaansprakelijkheid"
doc.core_properties.category = "HSEQ Onderzoeksrapport"

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 set_cell_shading(cell, color):
    shading_elm = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color}"/>')
    cell._tc.get_or_add_tcPr().append(shading_elm)

def add_styled_table(doc, headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    bg_hex = f"{PRIMARY[0]:02X}{PRIMARY[1]:02X}{PRIMARY[2]:02X}"
    row = table.rows[0]
    for i, h in enumerate(headers):
        cell = row.cells[i]
        cell.text = ''
        p = cell.paragraphs[0]
        run = p.add_run(h)
        run.bold = True
        run.font.color.rgb = WHITE
        run.font.size = Pt(10)
        set_cell_shading(cell, bg_hex)
    for r_idx, row_data in enumerate(rows):
        for c_idx, val in enumerate(row_data):
            cell = table.rows[r_idx + 1].cells[c_idx]
            cell.text = ''
            p = cell.paragraphs[0]
            run = p.add_run(str(val))
            run.font.size = Pt(9)
            if r_idx % 2 == 1:
                set_cell_shading(cell, "F8F9FA")
    if col_widths:
        for i, w in enumerate(col_widths):
            for row in table.rows:
                row.cells[i].width = Cm(w)
    return table

def add_branded_heading(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 add_footer_with_logo(doc):
    for section in doc.sections:
        header = section.header
        header.is_linked_to_previous = False
        hdr_table = header.add_table(rows=1, cols=2, width=Cm(16))
        hdr_table.alignment = WD_TABLE_ALIGNMENT.CENTER
        left_cell = hdr_table.rows[0].cells[0]
        left_cell.text = ''
        p = left_cell.paragraphs[0]
        run = p.add_run("Contractor Management & Aansprakelijkheid — Offshore Ontmanteling v2.0")
        run.bold = True
        run.font.color.rgb = PRIMARY
        run.font.size = Pt(10)
        right_cell = hdr_table.rows[0].cells[1]
        right_cell.text = ''
        p = right_cell.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        logo_path = '/root/projects/jg/assets/branding/jvg-logo-white-medium.png'
        if os.path.exists(logo_path):
            run = p.add_run()
            run.add_picture(logo_path, width=Cm(2.0), height=Cm(1.8))
        else:
            run = p.add_run("JvG Consultancy")
            run.font.color.rgb = PRIMARY
        footer = section.footer
        footer.is_linked_to_previous = False
        p = footer.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run("JvG Consultancy | Safety - Governance - Advisory | 2026 | Pagina ")
        run.font.size = Pt(8)
        run.font.color.rgb = LIGHT_GRAY
        fld_char1 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="begin"/>')
        instr_text = parse_xml(f'<w:instrText {nsdecls("w")} xml:space="preserve">PAGE</w:instrText>')
        fld_char2 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="end"/>')
        run._r.append(fld_char1)
        run._r.append(instr_text)
        run._r.append(fld_char2)

# ═══════════════════════════════════════════════════════════════════════════════
# VOORBLAD
# ═══════════════════════════════════════════════════════════════════════════════
doc.add_paragraph()
doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("ONDERZOEKSRAPPORT v2.0")
run.bold = True
run.font.size = Pt(14)
run.font.color.rgb = LIGHT_GRAY

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Contractor Management en Aansprakelijkheid")
run.bold = True
run.font.size = Pt(26)
run.font.color.rgb = PRIMARY

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("bij Offshore Ontmanteling")
run.bold = True
run.font.size = Pt(20)
run.font.color.rgb = PRIMARY

doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Wintershall Noordzee B.V. als Opdrachtgever | Koole Contractors B.V. als Aannemer")
run.font.size = Pt(12)
run.font.color.rgb = GRAY

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Small Piece Removal en Decommissioning van Gasplatforms op de Noordzee")
run.font.size = Pt(11)
run.font.color.rgb = GRAY

doc.add_paragraph()
doc.add_paragraph()

info_table = doc.add_table(rows=7, cols=2)
info_table.alignment = WD_TABLE_ALIGNMENT.CENTER
info_data = [
    ("Project:", "Contractor Management & Aansprakelijkheid — Offshore Ontmanteling"),
    ("Opdrachtgever:", "Wintershall Noordzee B.V."),
    ("Aannemer:", "Koole Contractors B.V."),
    ("Type:", "Onderzoeksrapport / Juridisch-HSEQ Analyse"),
    ("Auteur:", "JvG Consultancy"),
    ("Versie:", "2.0"),
    ("Datum:", "20 mei 2026"),
]
for i, (label, val) in enumerate(info_data):
    row = info_table.rows[i]
    row.cells[0].text = ''
    p = row.cells[0].paragraphs[0]
    run = p.add_run(label)
    run.bold = True
    run.font.size = Pt(10)
    row.cells[1].text = ''
    p = row.cells[1].paragraphs[0]
    run = p.add_run(val)
    run.font.size = Pt(10)

doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Vertrouwelijk — Alleen voor intern gebruik")
run.italic = True
run.font.size = Pt(9)
run.font.color.rgb = LIGHT_GRAY

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# INHOUDSOPGAVE
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "Inhoudsopgave")
toc = [
    "1. Samenvatting en Leeswijzer",
    "2. Projectcontext: Wintershall en Koole",
    "3. Juridisch Kader — Publiekrechtelijk",
    "4. Juridisch Kader — Privaatrechtelijk en Contractueel",
    "5. Werkgeversaansprakelijkheid (Art. 7:658 BW)",
    "6. Ketenaansprakelijkheid en Inlenersaansprakelijkheid",
    "7. Contractuele Verantwoordelijkheidsverdeling",
    "8. SodM-Toezicht en Meldingsplichten",
    "9. OSPAR Decision 98/3 en Mijnbouwwet",
    "10. Conclusie en Aanbevelingen",
    "Bronnen",
    "TierVerify Log",
]
for item in toc:
    p = doc.add_paragraph()
    run = p.add_run(item)
    run.font.size = Pt(10)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 1 — SAMENVATTING EN LEESWIJZER
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "1. Samenvatting en Leeswijzer")

doc.add_paragraph(
    "Dit rapport (v2.0) is een aanvulling op het originele onderzoeksrapport 'Contractor Management en "
    "Aansprakelijkheid bij Offshore Ontmanteling' (v1.0). Waar v1.0 de algemene kaders behandelde, "
    "gaat v2.0 diep in op de specifieke contractuele verantwoordelijkheidsverdeling tussen "
    "Wintershall Noordzee B.V. (opdrachtgever) en Koole Contractors B.V. (aannemer) voor het project "
    "'Small Piece Removal' en decommissioning van gasplatforms op de Noordzee. [1][2][3]"
)
doc.add_paragraph(
    "De centrale vraag van dit onderzoek is:"
)
p = doc.add_paragraph()
run = p.add_run("Hoe zijn de contractuele verantwoordelijkheden en aansprakelijkheden verdeeld tussen Wintershall als opdrachtgever en Koole als contractor voor het 'Small Piece Removal' project, en welke juridische en HSEQ-risico's zijn hierbij van toepassing?")
run.bold = True
run.font.size = Pt(11)
run.font.color.rgb = PRIMARY

doc.add_paragraph(
    "Dit rapport is als volgt opgebouwd:"
)
add_styled_table(doc,
    ["Hoofdstuk", "Onderwerp"],
    [
        ("2", "Projectcontext: Wintershall en Koole"),
        ("3", "Juridisch kader — Publiekrechtelijk (Arbowet, Mijnbouwwet, SodM)"),
        ("4", "Juridisch kader — Privaatrechtelijk en Contractueel (BW, contracten)"),
        ("5", "Werkgeversaansprakelijkheid (Art. 7:658 BW)"),
        ("6", "Ketenaansprakelijkheid en Inlenersaansprakelijkheid"),
        ("7", "Contractuele verantwoordelijkheidsverdeling Wintershall vs Koole"),
        ("8", "SodM-toezicht en meldingsplichten"),
        ("9", "OSPAR Decision 98/3 en Mijnbouwwet"),
        ("10", "Conclusie en aanbevelingen"),
    ],
    col_widths=[2, 11]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 2 — PROJECTCONTEXT
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "2. Projectcontext: Wintershall en Koole")

add_branded_heading(doc, "2.1 Wintershall Noordzee B.V. — Opdrachtgever", level=2)
doc.add_paragraph(
    "Wintershall Noordzee B.V. is een van de grootste olie- en gasproducerende bedrijven op de Nederlandse "
    "Noordzee. Het bedrijf is verantwoordelijk voor de productie, het onderhoud en uiteindelijk de "
    "decommissioning van offshore installaties. In de rol van opdrachtgever draagt Wintershall de "
    "eindverantwoordelijkheid voor de veiligheid van alle werkzaamheden op haar installaties, ook wanneer "
    "deze worden uitgevoerd door contractors. [1][3]"
)
doc.add_paragraph(
    "Voor het 'Small Piece Removal' project heeft Wintershall Koole Contractors B.V. ingeschakeld als "
    "aannemer. Dit project omvat het handmatig demonteren en verwijderen van kleinere onderdelen van "
    "offshore platforms, een activiteit die een hoog risicoprofiel heeft vanwege de combinatie van "
    "fysieke belasting, werken op hoogte, explosiegevaar en de aanwezigheid van gevaarlijke stoffen. [2]"
)

add_branded_heading(doc, "2.2 Koole Contractors B.V. — Aannemer", level=2)
doc.add_paragraph(
    "Koole Contractors B.V. is een gespecialiseerd bedrijf in offshore ontmanteling en decommissioning. "
    "Als aannemer is Koole verantwoordelijk voor de daadwerkelijke uitvoering van het werk, inclusief "
    "het inrichten van de werkplek, het aanstellen van gekwalificeerd personeel, het vaststellen van "
    "werkmethoden en het borgen van de veiligheid van het eigen personeel. [2][4]"
)
doc.add_paragraph(
    "Koole is verplicht om te voldoen aan de VCA-eisen (Veiligheid, Gezondheid en Milieu Checklist "
    "Aannemers) en moet beschikken over een geldig VCA-certificaat. Daarnaast moet Koole beschikken "
    "over een actuele RI&E, een Plan van Aanpak en getraind personeel conform de eisen van de "
    "Arbocatalogus. [2][4]"
)

add_branded_heading(doc, "2.3 Relatie Opdrachtgever-Aannemer", level=2)
doc.add_paragraph(
    "De relatie tussen Wintershall en Koole is geregeld in een overeenkomst (contract) waarin de "
    "rechten en verplichtingen van beide partijen zijn vastgelegd. In de offshore sector wordt veelal "
    "gebruik gemaakt van gestandaardiseerde contractvormen zoals de LOGIC (Leading Oil and Gas Industry "
    "Contracts) of eigen contractmodellen. [3]"
)
doc.add_paragraph(
    "Belangrijk is dat de contractuele verantwoordelijkheid niet losstaat van de wettelijke "
    "verantwoordelijkheid. Zelfs als het contract bepaalt dat Koole verantwoordelijk is voor de "
    "uitvoering van het werk, blijft Wintershall als opdrachtgever een eigen zorgplicht op grond van "
    "de Arbowet en het Burgerlijk Wetboek. [1][3]"
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 3 — JURIDISCH KADER PUBLIEKRECHTELIJK
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "3. Juridisch Kader — Publiekrechtelijk")

add_branded_heading(doc, "3.1 Arbowet en Arbobesluit", level=2)
doc.add_paragraph(
    "De Arbowet vormt het primaire wettelijke kader voor arbeidsomstandigheden in Nederland. Voor de "
    "offshore sector zijn de volgende artikelen van bijzonder belang: [1]"
)
add_styled_table(doc,
    ["Artikel", "Inhoud", "Toepassing"],
    [
        ("Art. 3", "Algemene zorgplicht werkgever", "Wintershall en Koole moeten alles redelijkerwijs doen om ongevallen te voorkomen"),
        ("Art. 4", "Beleid arbeidsomstandigheden", "RI&E verplicht, afgestemd op de risico's van small piece removal"),
        ("Art. 5", "Risico-inventarisatie en -evaluatie", "Specifieke RI&E voor offshore ontmanteling"),
        ("Art. 9", "Meldingsplicht ongevallen", "Ernstige ongevallen direct melden bij SodM"),
        ("Art. 10", "Deskundige dienst", "Arbodienst of externe deskundige verplicht"),
        ("Art. 13", "Tewerkstelling door derden", "Werkgever blijft verantwoordelijk bij inlening van personeel"),
        ("Art. 14", "Tewerkstelling in onderneming van derde", "Opdrachtgever moet toezien op naleving door contractor"),
    ],
    col_widths=[2, 5, 7]
)

add_branded_heading(doc, "3.2 Mijnbouwwet en Mijnbouwregeling", level=2)
doc.add_paragraph(
    "De Mijnbouwwet regelt de opsporing en winning van delfstoffen, inclusief de veiligheid van "
    "offshore installaties. Voor decommissioning zijn de volgende bepalingen relevant: [9]"
)
doc.add_paragraph(
    "Art. 35 Mijnbouwwet: De vergunninghouder (Wintershall) is verantwoordelijk voor het veilig "
    "ontmantelen van installaties.", style='List Bullet'
)
doc.add_paragraph(
    "Art. 36 Mijnbouwwet: Bij decommissioning dient een Ontmantelingsplan te worden opgesteld en "
    "goedgekeurd door de Minister van Economische Zaken.", style='List Bullet'
)
doc.add_paragraph(
    "Mijnbouwregeling: Nadere regels voor de uitvoering van werkzaamheden op offshore installaties, "
    "inclusief eisen aan personeel, materialen en procedures.", style='List Bullet'
)

add_branded_heading(doc, "3.3 Staatstoezicht op de Mijnen