#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Generatie script voor Overeenkomst van Opdracht - Phoenix Metals B.V.
Volgens MASTER_SOP.md §11 en MASTER_STYLEGUIDE.md
Auteur: EA_05 (Office Manager) via Kas (Director of Operations)
"""

from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from datetime import datetime

def setup_styles(doc):
    """Standaard opmaak conform MASTER_STYLEGUIDE.md"""
    # We gebruiken bestaande styles in plaats van nieuwe toe te voegen
    
    # Configure Heading 1 style
    if 'Heading 1' in doc.styles:
        style = doc.styles['Heading 1']
        font = style.font
        font.name = 'Calibri'
        font.size = Pt(14)
        font.bold = True
        font.color.rgb = RGBColor(0, 51, 102)  # #003366
    
    # Configure Heading 2 style
    if 'Heading 2' in doc.styles:
        style = doc.styles['Heading 2']
        font = style.font
        font.name = 'Calibri'
        font.size = Pt(12)
        font.bold = True
        font.color.rgb = RGBColor(0, 51, 102)  # #003366
    
    # Configure Normal style
    if 'Normal' in doc.styles:
        style = doc.styles['Normal']
        font = style.font
        font.name = 'Calibri'
        font.size = Pt(11)
        font.color.rgb = RGBColor(31, 41, 55)  # #1F2937
    
    return doc

def add_logo(doc):
    """Voeg JvG Consultancy logo toe conform STYLEGUIDE §8"""
    try:
        from docx.shared import Mm
        # Create a header paragraph if none exists
        if not doc.sections:
            doc.add_section()
        
        section = doc.sections[0]
        if not section.header:
            section._sectPr.headerReference = doc.element.xpath('.//w:header')[0]
        
        # Clear existing header content
        for p in section.header.paragraphs:
            p.clear()
        
        # Add logo
        try:
            logo_path = '/root/projects/jg/assets/branding/jvg-logo-white-medium.png'
            run = section.header.paragraphs[0].add_run()
            run.add_picture(logo_path, width=Mm(20), height=Mm(18))  # 2.0 cm × 1.8 cm
        except:
            pass  # Logo toevoegen mislukt, doorgaan zonder logo
    except:
        pass

def add_footer(doc):
    """Voeg footer toe conform STYLEGUIDE §8"""
    if not doc.sections:
        doc.add_section()
    
    section = doc.sections[0]
    if not section.footer:
        section._sectPr.footerReference = doc.element.xpath('.//w:footer')[0]
    
    # Clear existing footer content
    for p in section.footer.paragraphs:
        p.clear()
    
    footer_text = "JvG Consultancy | Safety • Governance • Advisory | © 2026"
    p = section.footer.paragraphs[0]
    p.text = footer_text
    p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    
    # Style footer text
    for run in p.runs:
        run.font.name = 'Calibri'
        run.font.size = Pt(9)
        run.font.color.rgb = RGBColor(255, 255, 255)  # White text

def create_overeenkomst():
    """Hoofdfunctie voor het genereren van de overeenkomst"""
    
    # Create new document
    doc = Document()
    
    # Apply styles
    setup_styles(doc)
    
    # Add logo to header
    add_logo(doc)
    
    # Document properties
    doc.core_properties.title = "Overeenkomst van Opdracht - Phoenix Metals B.V."
    doc.core_properties.author = "EA_05 (Office Manager) via Kas"
    doc.core_properties.subject = "Overeenkomst van Opdracht"
    doc.core_properties.category = "HSEQ Contracten"
    doc.core_properties.created = datetime.now()
    doc.core_properties.modified = datetime.now()
    
    # Add title
    title = doc.add_heading('Overeenkomst van Opdracht', level=1)
    
    # Project information header
    header_info = doc.add_paragraph()
    header_info.add_run('**Project**: Overeenkomst van Opdracht HSEQ Consultancy\n').bold = True
    header_info.add_run('**Type**: Overeenkomst van Opdracht\n').bold = True
    header_info.add_run('**Auteur**: EA_05 (Office Manager) via Kas\n').bold = True
    header_info.add_run('**Versie**: 1.0\n').bold = True
    header_info.add_run('**Datum**: ' + datetime.now().strftime('%Y-%m-%d') + '\n').bold = True
    header_info.add_run('**Status**: Final\n').bold = True
    header_info.space_after = Pt(12)
    
    # Partijen
    doc.add_heading('Partijen', level=2)
    
    # Opdrachtnemer
    p1 = doc.add_paragraph()
    p1.add_run('1. Opdrachtnemer: [MIJN VOLLEDIGE NAAM], handelend onder de naam [BEDRIJFSNAAM], ingeschreven bij de Kamer van Koophandel (KvK) onder nummer [KVK‑NUMMER], gevestigd te [PLAATS], Nederland (hierna te noemen: "Opdrachtnemer").')
    
    # Opdrachtgever
    p2 = doc.add_paragraph()
    p2.add_run('2. Opdrachtgever: Phoenix Metals B.V., statutair gevestigd te [PLAATS], KvK‑nummer [KVK‑NUMMER PHOENIX] (hierna te noemen: "Opdrachtgever").')
    
    # Artikel 1: Definities
    doc.add_heading('Artikel 1: Definities', level=2)
    
    p3 = doc.add_paragraph()
    p3.add_run('In deze overeenkomst wordt verstaan onder:')
    p3.space_after = Pt(6)
    
    definities = [
        ('a. "HSE/HSEQ": Health, Safety, Environment, Quality, omvattende de aspecten gezondheid, veiligheid, milieu en kwaliteit;'),
        ('b. "Overeenkomst van opdracht": een overeenkomst waarbij Opdrachtn zich tegen vergoeding verbindt tot het verrichten van werkzaamheden voor Opdrachtgever;'),
        ('c. "Werkzaamheden": de door Opdrachtnemer te verrichten HSEQ consultancy en adviesdiensten zoals omschreven in Artikel 2;'),
        ('d. "Rapportage": door Opdrachtnemer opgestelde documenten bevattende analyse, bevindingen en aanbevelingen;'),
        ('e. "Advies": door Opdrachtnemer verstrekte aanbevelingen, terinzagelegging van informatie en gezamenlijke besprekingen.')
    ]
    
    for defin in definities:
        p_defin = doc.add_paragraph()
        p_defin.add_run(defin)
        p_defin.paragraph_format.left_indent = Inches(0.5)
    
    # Artikel 2: Aard van de opdracht en werkzaamheden
    doc.add_heading('Artikel 2: Aard van de opdracht en werkzaamheden', level=2)
    
    p4 = doc.add_paragraph()
    p4.add_run('2.1. Opdrachtgever geeft Opdrachtnemer opdracht tot het verrichten van werkzaamheden als zelfstandig HSEQ senior advisor.')
    p4.space_after = Pt(6)
    
    p5 = doc.add_paragraph()
    p5.add_run('2.2. De werkzaamheden omvatten in elk geval de volgende activiteiten:')
    p5.space_after = Pt(6)
    
    werkzaamheden = [
        ('a. ontwikkelen, beoordelen en verbeteren van HSE/HSEQ-beleid, managementsystemen en procedures;'),
        ('b. uitvoeren en/of begeleiden van Risico-Inventarisatie en Evaluaties (RI&E), interne audits, inspecties en incidentonderzoeken;'),
        ('c. adviseren over wettelijke compliance (o.a. Arbowet, milieuwetgeving, relevante normen) en praktische verbetermaatregelen;'),
        ('d. begeleiden van verbetertrajecten, toolboxmeetings en trainingen voor medewerkers/management;'),
        ('e. rapportage, managementreviews en het opstellen van actie- en verbeterplannen.')
    ]
    
    for werk in werkzaamheden:
        p_werk = doc.add_paragraph()
        p_werk.add_run(werk)
        p_werk.paragraph_format.left_indent = Inches(0.5)
    
    # Artikel 3: Positie van Opdrachtnemer
    doc.add_heading('Artikel 3: Positie van Opdrachtnemer', level=2)
    
    p6 = doc.add_paragraph()
    t6 = p6.add_run('3.1. Tussen Opdrachtnemer en Opdrachtgever bestaat geen arbeidsovereenkomst, doch een overeenkomst van opdracht tussen twee zakelijke partijen. Opdrachtnemer is een zelfstandig ondernemer die werkzaamheden verricht voor meerdere opdrachtgevers.')
    p6.space_after = Pt(6)
    
    p7 = doc.add_paragraph()
    t7 = p7.add_run('3.2. Opdrachtnemer is niet in dienstbetrekking bij Opdrachtgever en komt derhalve niet in aanmerking voor loondoorbetaling bij ziekte, vakantiegeld, eindejaarsuitkering of enige andere vergoeding die verbonden is aan een dienstverband.')
    p7.space_after = Pt(6)
    
    p8 = doc.add_paragraph()
    t8 = p8.add_run('3.3. Opdrachtnemer verricht de werkzaamheden naar eigen inzicht en is niet hiërarchisch ondergeschikt aan Opdrachtgever. Opdrachtnemer gebruikt eigen werkwijze en (voor zover relevant) eigen hulpmiddelen.')
    p8.space_after = Pt(6)
    
    p9 = doc.add_paragraph()
    t9 = p9.add_run('3.4. Opdrachtnemer is vrij om werkzaamheden voor andere opdrachtgevers te verrichten, mits dit niet leidt tot belangenconflicten met Opdrachtgever.')
    
    # Artikel 4: Uitvoering van de opdracht
    doc.add_heading('Artikel 4: Uitvoering van de opdracht', level=2)
    
    p10 = doc.add_paragraph()
    t10 = p10.add_run('4.1. De werkzaamheden worden uitgevoerd als inspanningsverbintenis. Dit betekent dat Opdrachtnemer zich inzet voor het best realiseren van de resultaten, maar geen garantie geeft voor een specifiek resultaat.')
    p10.space_after = Pt(6)
    
    p11 = doc.add_paragraph()
    t11 = p11.add_run('4.2. Opdrachtnemer garandeert de zorgvuldigheid en professionaliteit van zijn advies op basis van de op dat moment bekende informatie, volgens de maatstaven van een redelijk bekwaam en redelijk handelend HSEQ-adviseur.')
    p11.space_after = Pt(6)
    
    p12 = doc.add_paragraph()
    t12 = p12.add_run('4.3. Opdrachtgever verleent Opdrachtnemer de medewerking die redelijkerwijs nodig is voor de uitvoering van de werkzaamheden.')
    
    # Artikel 5: Vergoeding, tarieven, declaraties en betaling
    doc.add_heading('Artikel 5: Vergoeding, tarieven, declaraties en betaling', level=2)
    
    p13 = doc.add_paragraph()
    t13 = p13.add_run('5.1. De vergoeding voor de werkzaamheden wordt vastgesteld op basis van door Opdrachtnemer verstrekte urenstaten tegen de overeengekomen uurtarieven.')
    p13.space_after = Pt(6)
    
    p14 = doc.add_paragraph()
    t14 = p14.add_run('5.2. Opdrachtnemer declareert de verrichte werkzaamheden maandelijks. De declaratie bevat een omschrijving van de verrichte werkzaamheden, de bestede uren en de datum waarop de werkzaamheden zijn verricht.')
    p14.space_after = Pt(6)
    
    p15 = doc.add_paragraph()
    t15 = p15.add_run('5.3. Betaling dient plaats te vinden binnen 30 dagen na factuurdatum, tenzij schriftelijk anders is overeengekomen.')
    
    # Artikel 6: Aansprakelijkheid en vrijwaring
    doc.add_heading('Artikel 6: Aansprakelijkheid en vrijwaring', level=2)
    
    p16 = doc.add_paragraph()
    t16 = p16.add_run('6.1. Opdrachtnemer is verantwoordelijk voor de zorgvuldigheid en professionaliteit van zijn advies op basis van de op dat moment bekende informatie, volgens de maatstaven van een redelijk bekwaam en redelijk handelend HSEQ-adviseur.')
    p16.space_after = Pt(6)
    
    p17 = doc.add_paragraph()
    t17 = p17.add_run('6.2. Opdrachtgever is en blijft altijd zelf verantwoordelijk voor:')
    p17.space_after = Pt(6)
    
    verantwoordingen = [
        ('a. de keuze om het advies al dan niet (geheel of gedeeltelijk) op te volgen;'),
        ('b. de wijze van implementatie van de adviezen in de organisatie;'),
        ('c. de naleving van alle relevante wet- en regelgeving, interne regels en voorschriften;'),
        ('d. eventuele sancties van toezichthouders, ongevallen, incidenten of overtredingen.')
    ]
    
    for verant in verantwoordingen:
        p_verant = doc.add_paragraph()
        p_verant.add_run(verant)
        p_verant.paragraph_format.left_indent = Inches(0.5)
    
    p18 = doc.add_paragraph()
    t18 = p18.add_run('6.3. Eventuele sancties van toezichthouders, ongevallen, incidenten of overtredingen die (mede) verband houden met de uitvoering of niet-uitvoering van adviezen komen voor rekening en risico van Opdrachtgever, tenzij er sprake is van opzet of bewuste roekeloosheid van Opdrachtnemer.')
    p18.space_after = Pt(6)
    
    p19 = doc.add_paragraph()
    t19 = p19.add_run('6.4. De aansprakelijkheid van Opdrachtnemer is in alle gevallen beperkt tot het bedrag van de door Opdrachtgever in het desbetreffende jaar betaalde vergoeding, exclusief BTW.')
    
    # Artikel 7: Verzekeringen
    doc.add_heading('Artikel 7: Verzekeringen', level=2)
    
    p20 = doc.add_paragraph()
    t20 = p20.add_run('7.1. Opdrachtnemer is verzekerd voor de beroepsaansprakelijkheid conform de wettelijke eisen en professionele standaarden.')
    p20.space_after = Pt(6)
    
    p21 = doc.add_paragraph()
    t21 = p21.add_run('7.2. Op verzoek verstrekt Opdrachtnemer een actuele polis of certificaat van verzekering.')
    
    # Artikel 8: Geheimhouding
    doc.add_heading('Artikel 8: Geheimhouding', level=2)
    
    p22 = doc.add_paragraph()
    t22 = p22.add_run('8.1. Opdrachtnemer is verplicht tot geheimhouding van alle vertrouwelijke informatie die hem in het kader van de opdracht bereikt.')
    p22.space_after = Pt(6)
    
    p23 = doc.add_paragraph()
    t23 = p23.add_run('8.2. De geheimhouding verplichting blijft ook na beëindiging van de overeenkomst bestaan.')
    
    # Artikel 9: Intellectuele eigendom
    doc.add_heading('Artikel 9: Intellectuele eigendom', level=2)
    
    p24 = doc.add_paragraph()
    t24 = p24.add_run('9.1. Alle intellectuele eigendomsrechten op door Opdrachtnemer ontwikkelde documenten, modellen en adviezen berusten bij Opdrachtnemer, tenzij schriftelijk anders is overeengekomen.')
    p24.space_after = Pt(6)
    
    p25 = doc.add_paragraph()
    t25 = p25.add_run('9.2. Opdrachtgever verkrijgt een niet-exclusief, beperkt gebruiksrecht voor de in het kader van de opdracht ontwikkelde documenten voor eigen intern gebruik.')
    
    # Artikel 10: Duur en beëindiging
    doc.add_heading('Artikel 10: Duur en beëindiging', level=2)
    
    p26 = doc.add_paragraph()
    t26 = t26.add_run('10.1. Deze overeenkomst wordt aangegaan voor de duur van één jaar en wordt automatisch verlengd voor periodes van één jaar, tenzij een van de partijen schriftelijk opzegt uiterlijk drie maanden voor het einde van de lopende periode.')
    p26.space_after = Pt(6)
    
    p27 = doc.add_paragraph()
    t27 = p27.add_run('10.2. Beide partijen kunnen de overeenkomst met onmiddellijke ingang opzeggen indien de andere partij een belangrijke verbintenis niet nakomt en na aanmaning binnen 14 dagen alsnog niet nakomt.')
    
    # Artikel 11: Overmacht
    doc.add_heading('Artikel 11: Overmacht', level=2)
    
    p28 = doc.add_paragraph()
    t28 = p28.add_run('11.1. Opdrachtnemer is niet gehouden tot nakoming van enige verbintenis indien hij daartoe gehinderd wordt als gevolg van overmacht.')
    p28.space_after = Pt(6)
    
    p29 = doc.add_paragraph()
    t29 = p29.add_run('11.2. Onder overmacht wordt in deze overeenkomst verstaan: omstandigheden die niet aan Opdrachtnemer zijn toe te rekenen, waardoor nakoming van de verbintenis geheel of gedeeltelijk wordt verhinderd.')
    
    # Artikel 12: Slotbepalingen
    doc.add_heading('Artikel 12: Slotbepalingen', level=2)
    
    p30 = doc.add_paragraph()
    t30 = p30.add_run('12.1. Deze overeenkomst wordt beheerst door het Nederlandse recht.')
    p30.space_after = Pt(6)
    
    p31 = doc.add_paragraph()
    t31 = p31.add_run('12.2. Voor geschillen uit deze overeenkomst is de rechter te Amsterdam bevoegd, tenzij de kantonrechter bevoegd zou zijn.')
    p31.space_after = Pt(6)
    
    p32 = doc.add_paragraph()
    t32 = p32.add_run('12.3. In geval van inconsistente bepalingen prevaleert de schriftelijke bevestiging boven de mondelinge afspraken.')
    
    # Add footer
    add_footer(doc)
    
    # Save document
    filename = "/root/projects/jg/2026-hseq-contract-opdracht/deliverables/docx/Overeenkomst_van_Opdracht_Phoenix_Metals_BV_v1.0.docx"
    doc.save(filename)
    
    return filename

if __name__ == "__main__":
    result = create_overeenkomst()
    print(f"Document gegenereerd: {result}")