#!/usr/bin/env python3
"""Generate D5 v2.0: REACH Management Presentatie Phoenix Metals"""
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor

# Create presentation
prs = Presentation()
prs.slide_width = Inches(10)
prs.slide_height = Inches(7.5)

# Color scheme (JvG Consultancy)
COLOR_DARK = RGBColor(0, 51, 102)      # Dark blue
COLOR_LIGHT = RGBColor(79, 129, 189)   # Lighter blue
COLOR_ACCENT = RGBColor(198, 89, 17)   # Orange accent
COLOR_WHITE = RGBColor(255, 255, 255)
COLOR_BLACK = RGBColor(0, 0, 0)
COLOR_GRAY = RGBColor(128, 128, 128)

def add_title_slide(title, subtitle, bullets=None):
    """Add a title slide with optional bullets"""
    slide = prs.slide_layouts[0]  # Title slide
    slide = prs.slides.add_slide(slide)
    
    # Title
    title_shape = slide.shapes.title
    title_shape.text = title
    title_para = title_shape.text_frame.paragraphs[0]
    title_para.font.size = Pt(36)
    title_para.font.bold = True
    title_para.font.color.rgb = COLOR_DARK
    title_para.alignment = PP_ALIGN.CENTER
    
    # Subtitle
    subtitle_shape = slide.placeholders[1]
    subtitle_shape.text = subtitle
    for para in subtitle_shape.text_frame.paragraphs:
        para.font.size = Pt(20)
        para.font.color.rgb = COLOR_LIGHT
        para.alignment = PP_ALIGN.CENTER
    
    return slide

def add_content_slide(title, content, bulletpoints):
    """Add a content slide with title, content text, and bullet points"""
    slide = prs.slide_layouts[5]  # Blank
    slide = prs.slides.add_slide(slide)
    
    # Title
    left = Inches(0.5)
    top = Inches(0.3)
    width = Inches(9)
    height = Inches(0.8)
    title_box = slide.shapes.add_textbox(left, top, width, height)
    title_frame = title_box.text_frame
    title_frame.text = title
    title_para = title_frame.paragraphs[0]
    title_para.font.size = Pt(28)
    title_para.font.bold = True
    title_para.font.color.rgb = COLOR_DARK
    
    # Content
    if content:
        top = Inches(1.2)
        height = Inches(1.2)
        content_box = slide.shapes.add_textbox(left, top, width, height)
        content_frame = content_box.text_frame
        content_frame.text = content
        content_frame.word_wrap = True
        for para in content_frame.paragraphs:
            para.font.size = Pt(14)
            para.font.color.rgb = COLOR_BLACK
    
    # Bullets
    top = Inches(2.5)
    height = Inches(4)
    bullet_box = slide.shapes.add_textbox(left, top, width, height)
    bullet_frame = bullet_box.text_frame
    bullet_frame.word_wrap = True
    p = bullet_frame.paragraphs[0]
    p.font.size = Pt(16)
    p.space_after = Pt(12)
    for i, bullet in enumerate(bulletpoints):
        if i > 0:
            p = bullet_frame.add_paragraph()
        p.text = "• " + bullet
        p.font.size = Pt(16)
        p.font.color.rgb = COLOR_BLACK
    
    return slide

def add_two_column_slide(title, col1_title, col1_bullets, col2_title, col2_bullets):
    """Add a two-column slide"""
    slide = prs.slide_layouts[5]  # Blank
    slide = prs.slides.add_slide(slide)
    
    # Title
    left = Inches(0.5)
    top = Inches(0.3)
    width = Inches(9)
    height = Inches(0.8)
    title_box = slide.shapes.add_textbox(left, top, width, height)
    title_frame = title_box.text_frame
    title_frame.text = title
    title_para = title_frame.paragraphs[0]
    title_para.font.size = Pt(28)
    title_para.font.bold = True
    title_para.font.color.rgb = COLOR_DARK
    
    # Column 1
    left = Inches(0.5)
    top = Inches(1.3)
    width = Inches(4.2)
    height = Inches(5.5)
    col1_box = slide.shapes.add_textbox(left, top, width, height)
    col1_frame = col1_box.text_frame
    col1_frame.text = col1_title
    col1_title_para = col1_frame.paragraphs[0]
    col1_title_para.font.size = Pt(18)
    col1_title_para.font.bold = True
    col1_title_para.font.color.rgb = COLOR_ACCENT
    col1_title_para.space_after = Pt(10)
    
    for bullet in col1_bullets:
        p = col1_frame.add_paragraph()
        p.text = "• " + bullet
        p.font.size = Pt(14)
        p.font.color.rgb = COLOR_BLACK
        p.space_after = Pt(8)
    
    # Column 2
    left = Inches(4.8)
    top = Inches(1.3)
    width = Inches(4.2)
    height = Inches(5.5)
    col2_box = slide.shapes.add_textbox(left, top, width, height)
    col2_frame = col2_box.text_frame
    col2_frame.text = col2_title
    col2_title_para = col2_frame.paragraphs[0]
    col2_title_para.font.size = Pt(18)
    col2_title_para.font.bold = True
    col2_title_para.font.color.rgb = COLOR_ACCENT
    col2_title_para.space_after = Pt(10)
    
    for bullet in col2_bullets:
        p = col2_frame.add_paragraph()
        p.text = "• " + bullet
        p.font.size = Pt(14)
        p.font.color.rgb = COLOR_BLACK
        p.space_after = Pt(8)
    
    return slide

def add_table_slide(title, headers, rows):
    """Add a table slide"""
    slide = prs.slide_layouts[5]  # Blank
    slide = prs.slides.add_slide(slide)
    
    # Title
    left = Inches(0.5)
    top = Inches(0.3)
    width = Inches(9)
    height = Inches(0.8)
    title_box = slide.shapes.add_textbox(left, top, width, height)
    title_frame = title_box.text_frame
    title_frame.text = title
    title_para = title_frame.paragraphs[0]
    title_para.font.size = Pt(28)
    title_para.font.bold = True
    title_para.font.color.rgb = COLOR_DARK
    
    # Table
    num_rows = len(rows) + 1
    num_cols = len(headers)
    table_width = Inches(9)
    table_height = Inches(5.5)
    left = Inches(0.5)
    top = Inches(1.2)
    
    table = slide.shapes.add_table(num_rows, num_cols, left, top, table_width, table_height).table
    
    # Apply table style
    for row in table.rows:
        for cell in row.cells:
            cell.fill.solid()
            cell.fill.fore_color.rgb = COLOR_WHITE
    
    # Headers
    for i, header in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = header
        cell.fill.solid()
        cell.fill.fore_color.rgb = COLOR_DARK
        for para in cell.text_frame.paragraphs:
            para.font.size = Pt(11)
            para.font.bold = True
            para.font.color.rgb = COLOR_WHITE
            para.alignment = PP_ALIGN.CENTER
    
    # Data rows
    for r, row_data in enumerate(rows):
        for c, cell_data in enumerate(row_data):
            cell = table.rows[r+1].cells[c]
            cell.text = str(cell_data)
            for para in cell.text_frame.paragraphs:
                para.font.size = Pt(10)
                para.font.color.rgb = COLOR_BLACK
                para.alignment = PP_ALIGN.CENTER
            # Alternate row color
            if r % 2 == 0:
                cell.fill.solid()
                cell.fill.fore_color.rgb = RGBColor(230, 235, 240)
    
    return slide

# ============= SLIDES =============

# Slide 1: Title
add_title_slide(
    "REACH Management Presentatie",
    "Phoenix Metals IJmuiden — Pilot Plant Vanadiumextractie uit Staalslakken\n16 april 2026 | Versie 2.0",
    ["JvG Consultancy", "Adviseur: Jorick van Gemert"]
)

# Slide 2: Agenda
add_content_slide(
    "Agenda",
    "",
    [
        "Bedrijfsprofiel & Procesbeschrijving",
        "REACH-kader & Applicatie",
        "Vergunningen & Milieuregelgeving",
        "HSEQ-framework & Veiligheid",
        "Chemische stoffen & SDS-strategie",
        "Planning & Budget",
        "Risico's & Mitigatiemaatregelen"
    ]
)

# Slide 3: Bedrijfsprofiel
add_content_slide(
    "Bedrijfsprofiel Phoenix Metals",
    "Phoenix Metals ontwikkelt een hydrometallurgisch proces voor de extractie van vanadium, ijzer, calcium en magnesium uit staalslakken van Tata Steel Netherlands. Focus op duurzaamheid en circulariteit.",
    [
        "Locatie: Westerduinweg 3, IJmuiden (Pilot Plant)",
        "Huidige demo: Plant One Rotterdam (20L batch)",
        "Directeur: Stijn van Zelst | HSE Manager: Jorick van Gemert",
        "Vergunningadviseur: Arcadis",
        "Grondstof: Staalslakken (Tata Steel) / SARU-ash",
        "Hoofdproduct: Vanadium-elektrolyten voor batterijopslag (VRFB)",
        "Procestype: Waterig, atmosferisch, max. 80°C, geen ammoniak"
    ]
)

# Slide 4: Procesontwikkeling
add_two_column_slide(
    "Procesontwikkeling — Van R&D naar Pilot",
    "Voltooide Fases",
    [
        "R&D: 4L batch (voltooid)",
        "Pre-pilot (Demo): 20L batch (voltooid)",
        "Locatie: Plant One Rotterdam",
        "Validatie chemische extractie",
        "Opbrengsten getest",
        "Processtability bevestigd"
    ],
    "Geplande Fases",
    [
        "Pilot Plant: 3.000L batch (H1 2026)",
        "Locatie: IJmuiden (Westerduinweg 3)",
        "Operationeel: H2 2026",
        "Doel: Consistente kwaliteit + schaalbaarheid",
        "Volume: 7.200 kg staalslak/jaar",
        "Commercieel: Toekomstig (schalen)"
    ]
)

# Slide 5: Procesbeschrijving
add_content_slide(
    "Hydrometallurgisch Extractieproces",
    "Het proces bestaat uit loging, kristallisatie, zuur-basis neutralisatie, ionenwisseling en electroreductie.",
    [
        "Stap 1-2: Ash afwegen en overbrengen naar reactor (flow cabinet)",
        "Stap 3-4: Toevoegen NaOH + verwarmen tot 80°C (loging)",
        "Stap 5-12: Filtratie en kristallisatiecycli",
        "Stap 13-16: H₂SO₄-toevoeging en pH-aanpassing → gipsvorming",
        "Stap 17-20: Opnieuw H₂SO₄ + NaOH → oplossen en koelen",
        "Stap 21-23: Ionenwisseling over column (regeneratie 2,5M H₂SO₄)",
        "Stap 24-25: H₂SO₄-additie + electroreductie → V(IV) sulfaat",
        "Stap 26-28: V3.5+ elektrolyt productie voor VRFB"
    ]
)

# Slide 6: REACH-kader
add_content_slide(
    "REACH-verordening — Applicatie",
    "REACH (EG 1907/2006) verplicht registratie van chemische stoffen bij ECHA bij productie/import ≥1 ton/jaar.",
    [
        "Pilot fase: 7.200 kg staalslak/jaar → vanadiumoutput <1 ton/jaar (naar verwachting)",
        "Resultaat: REACH-registratie mogelijk niet verplicht in pilot fase",
        "Commerciele schaalvergroting: REACH-registratie verplicht (>1 t/j)",
        "Phoenix Metals als downstream gebruiker: H₂SO₄ en NaOH zijn geregistreerd",
        "Consortium-aansluiting: Vanadium REACH Consortium (aanbevolen)",
        "Projectplan: 15 maanden van voorbereiding tot implementatie",
        "Kosten: € 50.000 — 150.000 (afhankelijk van testen)"
    ]
)

# Slide 7: REACH-projectfasering
add_table_slide(
    "REACH-Registratie Projectplan",
    ["Fase", "Periode", "Mijlpaal", "Deliverables"],
    [
        ["1. Voorbereiding", "Maand 1-2", "Inventarisatie gereed", "Stoffenlijst + CAS, Consortiumonderzoek"],
        ["2. Data-verzameling", "Maand 3-6", "Alle data beschikbaar", "Dataset per stof, LoA's, SIEF-deelname"],
        ["3. Risicobeoordeling", "Maand 7-10", "CSR gereed", "CSR, Blootstellingsscenario's"],
        ["4. Dossier indiening", "Maand 11-12", "ECHA registratie", "Registratiedossier, ECHA-nummer"],
        ["5. Implementatie", "Maand 13-15", "REACH-compliant", "SDS's, training, labeling"]
    ]
)

# Slide 8: Vergunningen
add_two_column_slide(
    "Vergunningen & Milieuregelgeving",
    "Vergunningplichten",
    [
        "Omgevingsvergunning milieu (Bal): Ja — Provincie Noord-Holland",
        "Procedure: Uitgebreid, 6 maanden (+6 weken)",
        "Bestemmingsplan: Havengebied IJmuiden (cat. 4.2)",
        "Bevestiging gemeente Velsen noodzakelijk",
        "Bopa-back-up mogelijk",
        "AERIUS-berekening uitgevoerd (stikstof)"
    ],
    "Vrijstellingen / Uitgezonderd",
    [
        "Rie (Industriële emissies): Nee (pilot = onderzoek/ontwikkeling)",
        "Rie-categorie 2.5 (Basismetaal): Nee (geen industriële schaal)",
        "Rie-categorie 4.2 (Basischemie): Nee (pilot schaal)",
        "Stralingsbescherming art. 3.17: Vrijstelling ≤1.000 kg SARU-ash",
        "Notificatie afvoer radioactief afval: Ja (U-238 >1 kBq/kg)"
    ]
)

# Slide 9: Chemische stoffen
add_table_slide(
    "Chemische Stoffen — Classificatie & Status",
    ["Stof", "Functie", "CLP-Classificatie", "REACH-status"],
    [
        ["H₂SO₄ 25-75%", "Reactant/pH-regeling", "Corrosief (H314)", "Geregistreerd"],
        ["NaOH 50%", "Reactant/loging", "Corrosief (H314)", "Geregistreerd"],
        ["Vanadiumconcentraat", "Grondstof/output", "Toxisch, H341, Carc. 2 (H351)", "Te registreren bij >1 t/j"],
        ["Aluminiumsulfaat", "Hulpstof", "Irritant (Eye Irrit. 2)", "Geregistreerd"],
        ["V(IV) sulfaat", "Tussenproduct", "Acuut toxisch (H302)", "Te registreren bij >1 t/j"],
        ["V3.5+ elektrolyt", "Eindproduct", "Te bepalen (CSR)", "Te registreren bij >1 t/j"]
    ]
)

# Slide 10: HSEQ-framework
add_content_slide(
    "HSEQ-framework — Structuur",
    "Phoenix Metals heeft een robuust HSE-managementsysteem vastgelegd in een reeks procedures en documenten.",
    [
        "HSE Policy V1 (01-01-2025): Commitment, compliance, continue improvement",
        "Bedrijfsnoodplan BNP-V1: Calamiteitenorganisatie, procedures (aligned met Plant One Rotterdam)",
        "PBM-beleid PS-201-NL V1.0: Arbeidshygiënische strategie, PBM-matrix",
        "RI&E-inventarisatie: Procesrisico's, chemische gevaren, ergonomie",
        "Management of Change PE-202-01 V1: Wijzigingenbeheer (organisatie, installaties, procedures)",
        "Gevaarlijke stoffen PE-240-01 V1: Aanvraag, beoordeling, goedkeuring"
    ]
)

# Slide 11: Gevaarsprofiel
add_content_slide(
    "Gevaarsprofiel — Pilot Plant",
    "Het proces bevat diverse risico's die zijn geïdentificeerd in de RI&E.",
    [
        "Chemische gevaren: H₂SO₄ (corrosief), NaOH (corrosief), Vanadiumconcentraat (toxisch, carcinogeen)",
        "Thermische gevaren: Reactoren op 80°C, exotherme reacties (H₂SO₄ + CaO)",
        "Mechanische gevaren: Pompen, leidingen onder druk, filtratie-eenheden",
        "Elektrische gevaren: Electroreductie-unit",
        "Radiologische gevaren: SARU-ash bevat U-238 serie (natuurlijke radionucliden)",
        "Stofexplosie: Fijne as-stof (beperkt door flow cabinet)",
        "Ergonomische gevaren: Tillen (emmers, filters), repetitieve handelingen"
    ]
)

# Slide 12: PBM-strategie
add_table_slide(
    "Persoonlijke Beschermingsmiddelen — Matrix",
    ["PBM", "Toepassing", "Normering", "Werkgebied"],
    [
        ["Veiligheidshelm", "Algemeen", "EN 397", "Pilot plant"],
        ["Veiligheidsschoenen (antistatisch)", "Algemeen", "EN ISO 20345 S3", "Pilot plant"],
        ["Veiligheidsbril", "Chemische hantering", "EN 166", "Reactoren, filtratie"],
        ["Gezichtsscherm", "Grote volumes H₂SO₄/NaOH", "EN 166", "Tankwagen lossen"],
        ["Vlamdovende kleding (antistatisch)", "Algemeen", "EN ISO 11612/1149", "Pilot plant"],
        ["Zuurbestendige handschoenen", "H₂SO₄/NaOH hantering", "EN 374", "Reactoren, filtratie"],
        ["Adembescherming (P3)", "Ash-handeling, stof", "EN 14387", "Flow cabinet"],
        ["Gehoorbescherming", ">80 dB(A)", "EN 352", "Pompen, compressoren"]
    ]
)

# Slide 13: SDS-strategie
add_two_column_slide(
    "VIB/MSDS Strategie — Overzicht",
    "Existing SDS (Leverancier)",
    [
        "H₂SO₄ 25-75%: Leverancier-SDS (Versie 1)",
        "NaOH 50%: Leverancier-SDS (Versie 1)",
        "Vanadium concentrate: Leverancier-SDS (Versie 1)",
        "Aluminiumsulfaat: Leverancier-SDS",
        "Verificatie van USEs (blootstellingsscenario's)"
    ],
    "New SDS (Phoenix Metals)",
    [
        "Vanadium-elektrolyt V3.5+: Te ontwikkelen (CSR → SDS)",
        "V(IV) sulfaat oplossing: Te ontwikkelen",
        "Filtercake (residu): Te ontwikkelen",
        "Gips (CaSO₄): Eventueel",
        "16 secties conform REACH Annex II"
    ]
)

# Slide 14: Onzuiverheden
add_content_slide(
    "Onzuiverheden uit Staalslak — Relevantie voor SDS",
    "De staalslakken bevatten diverse elementen die in SDS-sectie 3 en het CSR moeten worden verwerkt.",
    [
        "Hoofdbestanddeel: Vanadium (V) — Primaire focus REACH/CSR",
        "Bijproducten: IJzer (Fe), Calcium (Ca), Magnesium (Mg), Aluminium (Al)",
        "Onzuiverheden: Silicium (Si), Mangaan (Mn), Chroom (Cr), Nikkel (Ni), Titanium (Ti)",
        "Specifieke aandacht: Cr(VI) — Carcinogeen (Carc. 1A), monitoring vereist",
        "Specifieke aandacht: Nikkel — Carc. 2, sensibiliserend",
        "Radionucliden: U-238 serie (SARU-ash) — stralingsrisico",
        "Analyse: Eindproduct gehalten moeten worden bepaald"
    ]
)

# Slide 15: Planning
add_table_slide(
    "Planning & Mijlpalen — 2026-2027",
    ["Mijlpaal", "Doeldatum", "Status"],
    [
        ["Vooroverleg ODIJ", "23-09-2025", "✓ Voltooid"],
        ["Haalbaarheidsstudie afgerond", "12-12-2025", "✓ Voltooid"],
        ["Vergunningaanvraag indienen", "Q1 2026", "In voorbereiding"],
        ["Pilot plant inrichten", "Januari 2026", "Gepland"],
        ["Pilot plant operationeel", "H2 2026", "Gepland"],
        ["HSE-trainingen", "Q1 2026", "Gepland"],
        ["REACH-voorbereiding (indien nodig)", "2026-2027", "Planning fase"],
        ["Commercialisatie (schaalvergroting)", "2027+", "Toekomstig"]
    ]
)

# Slide 16: Budget
add_table_slide(
    "Budgetraming — Indicatief",
    ["Kostenpost", "Indicatie", "Opmerking"],
    [
        ["Vergunningprocedure (Arcadis)", "€ 25.000 — 50.000", "Incl. quick scan + aanvraag"],
        ["REACH-registratie", "€ 50.000 — 150.000", "Consortium + testen (indien nodig)"],
        ["Pilot plant investering", "TBD", "Project Execution Plan"],
        ["HSE-inrichting", "€ 10.000 — 20.000", "PBM, BNP, RI&E, training"],
        ["Stralingsbescherming SARU-ash", "€ 5.000 — 10.000", "Gammaspectrometrie + notificatie"],
        ["SDS-ontwikkeling", "€ 5.000 — 10.000", "CSR + 2-3 SDS'"],
        ["Operationeel (jaarlijks)", "€ 10.000 — 20.000", "Onderhoud, trainingen, audits"]
    ]
)

# Slide 17: Risico's
add_table_slide(
    "Risico's & Mitigatiemaatregelen",
    ["Risico", "Impact", "Waarschijnlijkheid", "Mitigatie"],
    [
        ["Bestemmingsplan strijdig", "Hoog", "Laag", "Bevestiging gemeente; bopa back-up"],
        ["REACH-datatekort", "Middel", "Middel", "Consortium, read-across methoden"],
        ["Kostenoverschrijding registratie", "Middel", "Middel", "Gefaseerde aanpak"],
        ["Stralingsvergunning SARU-ash", "Laag", "Laag", "Vrijstelling art. 3.17; notificatie"],
        ["Vertraging vergunning", "Hoog", "Middel", "Tijdig indienen, Arcadis"],
        ["Gevaarlijke stoffen opslag", "Middel", "Middel", "Locatie bepalen, brandwerende kast"],
        ["Chemische lekkage", "Hoog", "Laag", "Neutralisatieprocedure, absorptie"]
    ]
)

# Slide 18: Conclusies
add_content_slide(
    "Conclusies & Aanbevelingen",
    "Phoenix Metals heeft een robuust kader voor REACH-compliance en HSE. De pilot plant kan tijdig operationeel worden met minimale vergunningrisico's.",
    [
        "✓ REACH: Niet verplicht in pilot fase (<1 t/jaar), maar voorbereidingen treffen voor toekomstige schaalvergroting",
        "✓ Vergunningen: Omgevingsvergunning vereist; Rie niet van toepassing (pilot = onderzoek)",
        "✓ Bestemmingsplan: Waarschijnlijk conform, maar bevestiging gemeente Velsen noodzakelijk",
        "✓ HSEQ: Volledig kader (Policy, BNP, RI&E, MoC, PBM, procedures) beschikbaar en geïmplementeerbaar",
        "✓ Veiligheid: Alle risico's geïdentificeerd; PBM-matrix volledig; procedures operationeel",
        "⚠ Actie: Direct starten met vergunningaanvraag en bevestiging bestemmingsplan",
        "⚠ Actie: REACH-consortiumlidmaatschap aanbevolen voor data-sharing en kostenbesparing"
    ]
)

# Slide 19: Volgende stappen
add_two_column_slide(
    "Volgende Stappen — Korte Termijn",
    "Q1 2026",
    [
        "Vergunningaanvraag indienen (Arcadis)",
        "Bevestiging bestemmingsplan (gemeente Velsen)",
        "HSE-trainingen (basisveiligheid, PBM, chemical)",
        "PBM-aanschaf en distributie",
        "BHV/EHBO training",
        "RI&E definitief afronden",
        "Pilot plant inrichting starten"
    ],
    "Q2 2026",
    [
        "Pilot plant operationeel",
        "Eerste productie batches (3.000L)",
        "Process validation",
        "Gevaarlijke stoffen opslaglocatie bepalen",
        "Lozingsvergunning aanvragen",
        "Geluid- en emissieberekeningen",
        "REACH-voorbereiding starten (indien relevant)"
    ]
)

# Slide 20: Vragen
add_title_slide(
    "Vragen?",
    "Bedankt voor de aandacht",
    ["Contact: Jorick van Gemert | JvG Consultancy", "E-mail: info@jvg-consultancy.nl (hypothetisch)", "Datum: 16 april 2026"]
)

# Save
prs.save('/root/projects/jg/2026-reach-phoenix-metals/deliverables/pptx/REACH_Management_Presentatie_Phoenix_Metals_D5_v2.0.pptx')
print('D5 v2.0 generated successfully')
