#!/usr/bin/env python3
"""REACH Compliance Scan Phoenix Metals v1.0 — DOCX Generator"""

from docx import Document
from docx.shared import Inches, Pt, Cm, RGBColor, Emu
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
import os
from datetime import datetime

PRIMARY = RGBColor(0x00, 0x33, 0x66)
DARK = RGBColor(0x1F, 0x29, 0x37)
SECONDARY = RGBColor(0x37, 0x41, 0x51)
SUCCESS = RGBColor(0x00, 0xA8, 0x59)
WARNING = RGBColor(0xF5, 0x9E, 0x0B)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
ACCENT_BLUE = RGBColor(0x3B, 0x82, 0xF6)

BG_PRIMARY = "003366"
BG_HEADER = "F8F9FA"
BG_ALT = "F0F4F8"
BG_WHITE = "FFFFFF"
BORDER = "E5E7EB"

LOGO_PATH = "/root/projects/jg/assets/branding/jvg-consultancy-logo.png"
OUTPUT_PATH = "/root/projects/jg/2026-reach-phoenix-metals/deliverables/docx/REACH_Compliance_Scan_Phoenix_Metals_v1.0.docx"

doc = Document()

# ── Page setup ──
for section in doc.sections:
    section.top_margin = Cm(2.5)
    section.bottom_margin = Cm(2.5)
    section.left_margin = Cm(2.5)
    section.right_margin = Cm(2.5)

style = doc.styles['Normal']
font = style.font
font.name = 'Segoe UI'
font.size = Pt(11)
font.color.rgb = DARK
style.paragraph_format.space_after = Pt(6)
style.paragraph_format.line_spacing = 1.15

# ── Helper functions ──
def set_cell_shading(cell, color):
    shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color}"/>')
    cell._tc.get_or_add_tcPr().append(shading)

def set_cell_border(cell, **kwargs):
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    tcBorders = parse_xml(f'<w:tcBorders {nsdecls("w")}></w:tcBorders>')
    for edge, val in kwargs.items():
        element = parse_xml(
            f'<w:{edge} {nsdecls("w")} w:val="{val.get("val","single")}" '
            f'w:sz="{val.get("sz","4")}" w:space="0" '
            f'w:color="{val.get("color",BORDER)}"/>'
        )
        tcBorders.append(element)
    tcPr.append(tcBorders)

def add_styled_table(doc, headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    table.style = 'Table Grid'
    
    # Header row
    for i, h in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = ''
        p = cell.paragraphs[0]
        run = p.add_run(h)
        run.bold = True
        run.font.size = Pt(10)
        run.font.color.rgb = WHITE
        run.font.name = 'Segoe UI'
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        set_cell_shading(cell, BG_PRIMARY)
    
    # Data rows
    for r_idx, row in enumerate(rows):
        for c_idx, val in enumerate(row):
            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)
            run.font.name = 'Segoe UI'
            run.font.color.rgb = DARK
            if r_idx % 2 == 1:
                set_cell_shading(cell, BG_ALT)
    
    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_heading_styled(doc, text, level=1):
    h = doc.add_heading(text, level=level)
    for run in h.runs:
        run.font.name = 'Segoe UI'
        if level == 1:
            run.font.size = Pt(20)
            run.font.color.rgb = PRIMARY
        elif level == 2:
            run.font.size = Pt(16)
            run.font.color.rgb = PRIMARY
        elif level == 3:
            run.font.size = Pt(13)
            run.font.color.rgb = DARK
    return h

def add_body(doc, text, bold=False, italic=False):
    p = doc.add_paragraph()
    run = p.add_run(text)
    run.font.name = 'Segoe UI'
    run.font.size = Pt(11)
    run.font.color.rgb = DARK
    run.bold = bold
    run.italic = italic
    return p

def add_bullet(doc, text, level=0):
    p = doc.add_paragraph(text, style='List Bullet')
    p.paragraph_format.left_indent = Cm(1.5 + level * 1.0)
    for run in p.runs:
        run.font.name = 'Segoe UI'
        run.font.size = Pt(10)
    return p

def add_callout(doc, text, type="info"):
    colors = {"info": "3B82F6", "warning": "F59E0B", "critical": "FF6D00", "success": "00A859"}
    bg_colors = {"info": "EFF6FF", "warning": "FFFEBA", "critical": "FFF7ED", "success": "ECFDF5"}
    color = colors.get(type, "3B82F6")
    bg = bg_colors.get(type, "EFF6FF")
    
    p = doc.add_paragraph()
    p.paragraph_format.left_indent = Cm(1.0)
    p.paragraph_format.space_before = Pt(8)
    p.paragraph_format.space_after = Pt(8)
    
    # Add shading to paragraph
    pPr = p._p.get_or_add_pPr()
    shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{bg}" w:val="clear"/>')
    pPr.append(shading)
    
    # Add left border via XML
    pBdr = parse_xml(
        f'<w:pBdr {nsdecls("w")}>'
        f'<w:left w:val="single" w:sz="24" w:space="8" w:color="{color}"/>'
        f'</w:pBdr>'
    )
    pPr.append(pBdr)
    
    run = p.add_run(text)
    run.font.name = 'Segoe UI'
    run.font.size = Pt(10)
    run.font.color.rgb = DARK
    return p

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 1: VOORBLAD
# ══════════════════════════════════════════════════════════════

# Add spacing before logo
for _ in range(6):
    doc.add_paragraph()

# Logo
if os.path.exists(LOGO_PATH):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run()
    run.add_picture(LOGO_PATH, width=Cm(4.0))

doc.add_paragraph()

# Title block
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("REACH COMPLIANCE SCAN")
run.font.size = Pt(28)
run.font.color.rgb = PRIMARY
run.font.name = 'Segoe UI'
run.bold = True

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Phoenix Metals B.V.")
run.font.size = Pt(18)
run.font.color.rgb = SECONDARY
run.font.name = 'Segoe UI'

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Pilotfase IJmuiden — Hydrometallurgische Vanadiumextractie")
run.font.size = Pt(12)
run.font.color.rgb = SECONDARY
run.font.name = 'Segoe UI'
run.italic = True

for _ in range(4):
    doc.add_paragraph()

# Meta table on cover
meta_table = doc.add_table(rows=6, cols=2)
meta_table.alignment = WD_TABLE_ALIGNMENT.CENTER
meta_data = [
    ("Opdrachtgever", "Phoenix Metals B.V."),
    ("Uitgevoerd door", "JvG Consultancy"),
    ("Projectnummer", "JvG-2026-REACH-001"),
    ("Versie", "1.0"),
    ("Datum", "20 april 2026"),
    ("Classificatie", "VERTROUWELIJK"),
]
for i, (label, value) in enumerate(meta_data):
    c0 = meta_table.rows[i].cells[0]
    c1 = meta_table.rows[i].cells[1]
    c0.width = Cm(5)
    c1.width = Cm(9)
    c0.text = ''
    c1.text = ''
    r0 = c0.paragraphs[0].add_run(label)
    r0.bold = True
    r0.font.size = Pt(10)
    r0.font.name = 'Segoe UI'
    r0.font.color.rgb = PRIMARY
    r1 = c1.paragraphs[0].add_run(value)
    r1.font.size = Pt(10)
    r1.font.name = 'Segoe UI'
    r1.font.color.rgb = DARK
    if label == "Classificatie":
        r1.bold = True
        r1.font.color.rgb = RGBColor(0xEF, 0x44, 0x44)

# Page break
doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 2: MANAGEMENT SAMENVATTING
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Management Samenvatting", 1)

add_body(doc, "Deze REACH Compliance Scan identificeert de wettelijke verplichtingen van Phoenix Metals B.V. onder de EU REACH-verordening (EG 1907/2006) voor de pilotfase te IJmuiden en de toekomstige FOAK-productiefabriek.")

add_heading_styled(doc, "Kernbevindingen", 2)

add_bullet(doc, "Grondstofstromen (SARU ash en staalslakken) kwalificeren als afvalstoffen en zijn derhalve REACH-vrijgesteld zolang de afvalstatus gehandhaafd blijft.")
add_bullet(doc, "Alle vier invoerchemicaliën (NaOH, H₂SO₄, Al₂(SO₄)₃, CaO) zijn reeds geregistreerd door leveranciers. Phoenix Metals is downstream user — geen eigen registratie vereist.")
add_bullet(doc, "Vanadium(V) oxide (V₂O₅) is reeds geregistreerd via het Vanadium Consortium. Een Letter of Access (LoA) volstaat voor commercialisatie.")
add_bullet(doc, "De pilotfase valt onder de PPORD-uitsondering (Artikel 9 REACH), mits tijdig genotificeerd bij ECHA. Volume: < 1 ton/jaar per stof.")
add_bullet(doc, "Het vanadium-elektrolyt (VRFB-mengsel) vertoont kenmerken van een nieuwe stofidentiteit. Nader onderzoek naar bestaande SVHC-registraties is aanbevolen.")
add_bullet(doc, "Geschatte totale compliancekosten: €15.000 – €45.000 (pilot + FOAK-voorbereiding), exclusief volledige REACH-registratie (€120.000 – €290.000 bij FOAK).")

add_heading_styled(doc, "Advies", 2)

add_body(doc, "Phoenix Metals dient uiterlijk Q3 2026 een PPORD-notificatie bij ECHA in te dienen en gelijktijdig een Letter of Access bij het Vanadium Consortium aan te vragen. De end-of-wipe status van staalslakken vereist juridische beoordeling vóórafgaand aan commercialisatie.")

add_callout(doc, "⚠ CRITIEK: De overgang van afvalstof naar product (end-of-wipe) is de belangrijkste REACH-trigger. Zonder tijdige voorbereiding ontstaat een compliance gap bij commercialisatie.", "critical")

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 3: SCOPE & DEFINITIES
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Scope & Definities", 1)

add_heading_styled(doc, "Scope", 2)

add_body(doc, "Deze scan omvat alle chemische stoffen en mengsels die door Phoenix Metals worden ingevoerd, verwerkt of geproduceerd in het kader van:")

add_bullet(doc, "Pilot plant te IJmuiden (Westerduinweg 3) — 3.000L batch, 7.200 kg staalslakken/jaar")
add_bullet(doc, "Demo-plant te Plant One Rotterdam — SARU ash verwerking, ≤60 kg, ≤3 maanden")
add_bullet(doc, "FOAK-productiefabriek (conceptueel) — toekomstige commerciële schaal")

add_heading_styled(doc, "Uitsluitingen", 2)

add_bullet(doc, "Arbeidsomstandigheden (ARBO-wetgeving) — apart traject")
add_bullet(doc, "Milieupermitting (Omgevingsvergunning) — apart traject via Arcadis")
add_bullet(doc, "Stralingsbescherming (SARU ash NORM) — apart traject, parallel aan REACH")
add_bullet(doc, "Transport en opslag (ADR/ADR-klasse) — buiten scope")

add_heading_styled(doc, "Definities", 2)

defs = [
    ("REACH", "Registration, Evaluation, Authorisation and Restriction of Chemicals (EG 1907/2006)"),
    ("ECHA", "European Chemicals Agency — toezichthouder REACH"),
    ("PPORD", "Product and Process Oriented Research and Development (Art. 9 REACH)"),
    ("FOAK", "First-of-a-Kind — eerste commerciële productiefabriek"),
    ("End-of-Waste", "Het moment waarop een afvalstof voldoet aan de criteria om als product te gelden (Richtlijn 2008/98/EG)"),
    ("SVHC", "Substance of Very High Concern"),
    ("LoA", "Letter of Access — recht op gebruik van bestaande REACH-registratie"),
    ("SR&D", "Scientific Research and Development (Art. 3(23) REACH)"),
    ("Downstream User", "Gebruiker van een stof in de toeleveringsketen, niet de registrant"),
]

add_styled_table(doc, ["Term", "Definitie"], defs, [3.5, 13])

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 4: WETTELIJK KADER
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Wettelijk Kader", 1)

add_heading_styled(doc, "REACH-verordening (EG 1907/2006)", 2)

add_body(doc, "REACH verplicht fabrikanten, importeurs en downstream users om de veiligheid van chemische stoffen te waarborgen. De verordening geldt voor alle stoffen die in of naar de EU/EER worden vervaardigd of ingevoerd in volumes ≥ 1 ton/jaar, tenzij een uitzondering van toepassing is.")

add_heading_styled(doc, "Relevante artikelen voor Phoenix Metals", 2)

articles = [
    ("Art. 2(1)", "Toepassingsgebied — stoffen als zodanig, in mengsels of in artikelen"),
    ("Art. 2(2)(a)", "Uitzondering: radioactieve stoffen (gewaarborgd door EURATOM-verdrag)"),
    ("Art. 3(23)", "Definitie SR&D — stoffen voor wetenschappelijk onderzoek, < 1 ton/jaar"),
    ("Art. 9", "PPORD — R&D gericht op product- en procesontwikkeling, geen tonnage-limiet"),
    ("Art. 6", "Registratieplicht — ≥ 1 ton/jaar, algemene of specifieke registratie"),
    ("Art. 7", "Registratieplicht stoffen in artikelen — ≥ 1 ton/jaar en ≥ 0,1% gewicht"),
    ("Art. 31-32", "Veiligheidsinformatieblad (SDS) verplichtingen downstream users"),
    ("Art. 33", "Informatieplicht SVHC in artikelen aan afnemers"),
    ("Art. 56", "Autorisatieplicht — stoffen op de Autorisatielijst (Annex XIV)"),
]

add_styled_table(doc, ["Artikel", "Relevantie"], articles, [2.5, 14])

add_heading_styled(doc, "Afvalwetgeving & End-of-Waste", 2)

add_body(doc, "Richtlijn 2008/98/EG (Kaderrichtlijn Afvalstoffen) bepaalt wanneer een afvalstof ophoudt afval te zijn. Een stof is 'end-of-waste' wanneer:")

add_bullet(doc, "De stof algemeen wordt gebruikt voor specifieke doeleinden")
add_bullet(doc, "Er een markt of vraag bestaat voor de stof")
add_bullet(doc, "De stof voldoet aan de technische eisen voor het beoogde gebruik")
add_bullet(doc, "Het gebruik geen negatieve milieu- of gezondheidseffecten teweegbrengt")

add_callout(doc, "ℹ Informatief: De haalbaarheidsstudie van Arcadis (december 2025) bevestigt dat zowel SARU ash als staalslakken momenteel kwalificeren als afvalstoffen. Echter, de producten die Phoenix Metals hieruit extrageert zijn géén afvalstoffen — zij zijn nieuwe stoffen geproduceerd door een chemisch proces.", "info")

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 5: STOFFENINVENTARISATIE
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Stoffeninventarisatie", 1)

add_body(doc, "Overzicht van alle stoffen in de Phoenix Metals waardeketen, inclusief REACH-status en benodigde acties.")

add_heading_styled(doc, "Compleet Stoffenregister", 2)

substances = [
    ("Invoer", "Sodium hydroxide 50%", "1310-73-2", "Ja", "Downstream user", "Geen — leveranciersregistratie volstaat"),
    ("Invoer", "Sulfuric acid 25-75%", "7664-93-9", "Ja", "Downstream user", "Geen — leveranciersregistratie volstaat"),
    ("Invoer", "Aluminum sulfate octadecahydrate", "7784-31-8", "Ja", "Downstream user", "Geen — leveranciersregistratie volstaat"),
    ("Invoer", "Calcium oxide", "1305-78-8", "Ja", "Downstream user", "Geen — leveranciersregistratie volstaat"),
    ("Grondstof", "SARU Ash (Shell)", "N.v.t.", "Nee", "Afvalstof (REACH vrijgesteld)", "Monitor end-of-wipe criteria"),
    ("Grondstof", "Staalslakken (Tata Steel)", "N.v.t.", "Nee", "Afvalstof (REACH vrijgesteld)", "Monitor end-of-wipe criteria"),
    ("Product", "Vanadium(V) oxide", "1314-62-1", "Ja (Vanadium Consortium)", "Registratie via LoA", "LoA aanvragen vóór commercialisatie"),
    ("Product", "Vanadium-elektrolyt (VRFB)", "Nieuw mengsel", "Niet geregistreerd", "Nieuwe stofidentiteit?", "Onderzoek bestaande registraties + PPORD"),
    ("Product", "Magnesiumhydroxide", "1309-42-8", "Ja", "Reeds geregistreerd door anderen", "SDS ontvangen van leverancier"),
    ("Product", "IJzeroxide", "1309-37-1", "Ja", "Reeds geregistreerd door anderen", "SDS ontvangen van leverancier"),
    ("Product", "Calciumhydroxide", "1305-62-0", "Ja", "Reeds geregistreerd door anderen", "SDS ontvangen van leverancier"),
    ("Product", "Gips (calciumsulfaat)", "7778-18-9", "Ja", "Reeds geregistreerd door anderen", "SDS ontvangen van leverancier"),
]

add_styled_table(doc,
    ["Categorie", "Stof", "CAS", "REACH Geregistreerd", "Status Phoenix Metals", "Actie"],
    substances,
    [1.8, 3.2, 2.2, 2.5, 3.5, 3.8]
)

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 6: GRONDSTOFSTROMEN ANALYSE
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Grondstofstromen Analyse", 1)

add_heading_styled(doc, "Stroom 1: SARU Ash (Shell)", 2)

add_body(doc, "SARU ash is een reststroom uit crude oil refining bij Shell. De stof bevat natriummetavanadaat, trinatriumorthovanadaat en nikkeloxide, alsmede natuurlijke radionucliden (U-238 serie, Pb-210, Ra-228).")

ash_data = [
    ("Locatie", "Plant One Rotterdam"),
    ("Schaal", "Demo: ≤60 kg ash (3,5 kg/batch), ≤3 maanden campagne"),
    ("REACH-status", "Afvalstof — REACH vrijgesteld (Art. 2(2)(d))"),
    ("Overige wetgeving", "Besluit basisveiligheidsnormen stralingsbescherming (NORM)"),
    ("Risico", "Laag — beperkte hoeveelheid, korte duur, afvalstatus"),
]

add_styled_table(doc, ["Parameter", "Detail"], ash_data, [3, 14])

add_heading_styled(doc, "Stroom 2: Staalslakken (Tata Steel)", 2)

add_body(doc, "Staalslakken zijn een reststroom uit de staalproductie van Tata Steel te IJmuiden. De slakken bevatten vanadium, ijzer, calcium en magnesium. De haalbaarheidsstudie van Arcadis (december 2025) bevestigt de afvalstatus.")

slag_data = [
    ("Locatie", "Westerduinweg 3, IJmuiden"),
    ("Schaal", "Pilot: 7.200 kg/jaar (100 kg/batch × 3.000L reactor)"),
    ("REACH-status", "Afvalstof — REACH vrijgesteld"),
    ("End-of-wipe risico", "MATIG — producten zijn géén afval, maar afgeleide stoffen uit hydrometallurgisch proces"),
    ("Arcadis advies", "Afvalstatus bevestigd (dec 2025); product-status vereist juridische beoordeling"),
]

add_styled_table(doc, ["Parameter", "Detail"], slag_data, [3, 14])

add_callout(doc, "⚠ BELANGRIJK ONDERSCHEID: De grondstofstromen zijn afvalstoffen (REACH-vrijgesteld), maar de EXTRACTIEPRODUCTEN zijn dat NIET. Het hydrometallurgisch proces creëert nieuwe stoffen die onder REACH vallen bij volumes ≥ 1 ton/jaar of bij commercialisatie.", "warning")

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 7: INVOERCHEMICALIËN ASSESSMENT
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Invoerchemicaliën Assessment", 1)

add_body(doc, "Alle invoerchemicaliën zijn reeds geregistreerd bij ECHA door de desbetreffende leveranciers. Phoenix Metals fungeert als downstream user. De wettelijke verplichtingen zijn beperkt tot het naleven van de voorwaarden in het Veiligheidsinformatieblad (SDS).")

chem_data = [
    ("Sodium hydroxide 50%", "1310-73-2", "ADR 8 PG II", "060204", "Ja", "SDS naleven, CORAP-check", "Laag"),
    ("Sulfuric acid 25-75%", "7664-93-9", "ADR 8 PG II", "060101", "Ja", "SDS naleven, CORAP-check", "Laag"),
    ("Aluminum sulfate octadecahydrate", "7784-31-8", "Niet ADR-geclassificeerd", "—", "Ja", "SDS naleven", "Laag"),
    ("Calcium oxide", "1305-78-8", "ADR 8 PG III", "—", "Ja", "SDS naleven", "Laag"),
]

add_styled_table(doc,
    ["Stof", "CAS", "ADR", "EURAL", "REACH", "Actie Phoenix Metals", "Risico"],
    chem_data,
    [3, 1.8, 1.8, 1.2, 1, 2.8, 1]
)

add_heading_styled(doc, "Downstream User Verplichtingen", 2)

add_bullet(doc, "Veiligheidsinformatiebladen (SDS) opvragen en actueel houden bij alle leveranciers")
add_bullet(doc, "Blootstellingsscenario's uit SDS implementeren in de werkprocedures")
add_bullet(doc, "CORAP-status (Community Rolling Action Plan) controleren op ECHA-website voor NaOH en H₂SO₄")
add_bullet(doc, "Bij afwijking van blootstellingsscenario's: eigen chemische veiligheidsbeoordeling (CSR) opstellen")

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 8: PRODUCTEN ASSESSMENT
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Producten Assessment", 1)

add_heading_styled(doc, "Vanadium(V) oxide (V₂O₅)", 2)

add_body(doc, "CAS 1314-62-1 — Het primaire product van Phoenix Metals. V₂O₅ is reeds geregistreerd bij ECHA via het Vanadium Consortium (REEDS-registratie). Phoenix Metals hoeft geen eigen registratie te verrichten, maar heeft een Letter of Access (LoA) nodig om deze registratie te mogen gebruiken.")

add_body(doc, "Toepassingen: katalysatorproductie, metallurgie, vanadiumredoxbatterijen (VRFB). Potentiële SVHC-kandidaat — monitoring van ECHA-intentielijst aanbevolen.")

add_heading_styled(doc, "Vanadium-elektrolyt (VRFB-mengsel)", 2)

add_body(doc, "Het VRFB-elektrolyt is een mengsel van vanadium in meerdere oxidatietoestanden (V(II)/V(III)/V(IV)/V(V)) in zwavelzuuroplossing. Dit is mogelijk een nieuwe stofidentiteit — er is geen bestaande REACH-registratie bekend voor dit specifieke mengsel.")

add_callout(doc, "⚠ RISICO: Het vanadium-elektrolyt vertoont kenmerken van een nieuwe stofidentiteit. Bij commercialisatie > 1 ton/jaar is een volledige REACH-registratie vereist. Onderzoek naar bestaande SVHC-registraties bij ECHA is urgent.", "critical")

add_heading_styled(doc, "Nebijproducten", 2)

byproducts = [
    ("Magnesiumhydroxide", "1309-42-8", "Ja", "Commercieel verkrijgbaar", "Laag"),
    ("IJzeroxide", "1309-37-1", "Ja", "Commercieel verkrijgbaar", "Laag"),
    ("Calciumhydroxide", "1305-62-0", "Ja", "Commercieel verkrijgbaar", "Laag"),
    ("Gips (calciumsulfaat dihydraat)", "7778-18-9", "Ja", "Commercieel verkrijgbaar", "Laag"),
]

add_styled_table(doc, ["Nebijproduct", "CAS", "REACH", "Marktstatus", "Risico"], byproducts, [3.5, 2, 1.5, 3.5, 1.5])

add_body(doc, "Nebijproducten zijn reeds geregistreerd door andere partijen. Bij verkoop ≥ 1 ton/jaar is Phoenix Metals downstream user. Bij eigen productie en verkoop is een LoA of eigen registratie vereist — afhankelijk van de schaal.")

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 9: VANADIUM CONSORTIUM ASSESSMENT
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Vanadium Consortium Assessment", 1)

add_body(doc, "Het Vanadium Consortium (vanadiumconsortium.com) beheert REACH-registraties voor 19 vanadiumhoudende stoffen. Voor Phoenix Metals zijn de volgende registraties relevant:")

consortium_subs = [
    ("Divanadium pentaoxide (V₂O₅)", "1314-62-1", "PRIMAIR PRODUCT", "Relevant"),
    ("Sodium metavanadate", "13718-26-8", "SARU ash component", "Relevant"),
    ("Slags, steelmaking, vanadium", "60912-34-6", "STAALSLAKKEN — direct relevant", "Zeer relevant"),
    ("Vanadium", "7440-62-2", "Elementair vanadium", "Mogelijk relevant"),
    ("Vanadium oxide sulphate", "27774-13-6", "Elektrolyt-component", "Relevant"),
    ("Divanadium tris(sulphate)", "13701-70-7", "Elektrolyt-component", "Relevant"),
]

add_styled_table(doc, ["Stof", "CAS", "Relatie Phoenix Metals", "Relevantie"], consortium_subs, [3.5, 2, 4, 2.5])

add_heading_styled(doc, "Opties Analyse", 2)

options = [
    ("Full Membership", "Volledig lidmaatschap consortium", "Volledige toegang alle 19 registraties, stemrecht", "~€50.000 – €100.000/jaar", "Alleen bij FOAK met brede vanadiumproductie"),
    ("Letter of Access (LoA)", "Toegang tot specifieke registratie(s)", "Beperkt tot gekozen stof(en), geen stemrecht", "~€5.000 – €20.000 per stof per band", "AANBEVOLEN: V₂O₅ LoA voor pilot/FOAK-start"),
]

add_styled_table(doc, ["Optie", "Beschrijving", "Voordelen", "Kostenindicatie", "Advies"], options, [2, 2.5, 3, 2.5, 4])

add_callout(doc, "✅ ADVIES: Start met een LoA voor V₂O₅ (CAS 1314-62-1). Dit dekt de primaire registratiebehoefte voor de pilot- en vroege FOAK-fase. Full membership is pas relevant bij commerciële productie van meerdere vanadiumverbindingen.", "success")

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 10: REACH COMPLIANCE ROUTES
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "REACH Compliance Routes", 1)

add_body(doc, "Per bedrijfsfase gelden verschillende REACH-routes. De onderstaande analyse koppelt elke route aan de specifieke situatie van Phoenix Metals.")

add_heading_styled(doc, "Route A: Scientific R&D (Artikel 3(23))", 2)

srd_data = [
    ("Volume limiet", "< 1 ton/jaar per stof"),
    ("Voorwaarden", "Gecontroleerde omstandigheden, niet voor commerciële doeleinden"),
    ("Notificatie", "Niet vereist — automatische uitzondering"),
    ("Toepasbaarheid Phoenix Metals", "JA — SARU ash demo (<60 kg, <3 maanden) kwalificeert volledig"),
    ("Beperking", "Niet toepasbaar bij verkoop van producten"),
]

add_styled_table(doc, ["Parameter", "Detail"], srd_data, [3, 14])

add_heading_styled(doc, "Route B: PPORD (Artikel 9) — MEEST RELEVANT", 2)

ppord_data = [
    ("Volume limiet", "Geen — elke tonnage toegestaan"),
    ("Duur", "5 jaar per notificatie, eenmalig verlengbaar met 5 jaar"),
    ("Notificatie", "Vereist bij ECHA — PPORD-notificatieformulier"),
    ("Voorwaarden", "R&D gericht op product- of procesontwikkeling"),
    ("Toepasbaarheid Phoenix Metals", "JA — Pilot plant (7.200 kg/jaar) en FOAK-ontwikkeling"),
    ("Vervalroute", "Na PPORD-periode: volledige REACH-registratie of beëindiging productie"),
]

add_styled_table(doc, ["Parameter", "Detail"], ppord_data, [3, 14])

add_heading_styled(doc, "Route C: Volledige REACH-registratie (Artikel 6)", 2)

add_body(doc, "Volledige registratie is vereist wanneer Phoenix Metals commercieel stoffen produceert/invoert ≥ 1 ton/jaar buiten een PPORD-context. Dit geldt voor de FOAK-productiefabriek.")

reg_data = [
    ("1 – 10 ton/jaar", "€120.000 – €160.000", "Toxicologisch dossier, chemische veiligheidsbeoordeling"),
    ("10 – 100 ton/jaar", "€160.000 – €220.000", "Uitgebreid toxicologisch dossier + eco-toxicologie"),
    ("100 – 1.000 ton/jaar", "€220.000 – €290.000", "Volledig dossier + exposure assessment + CSR"),
]

add_styled_table(doc, ["Tonnage Band", "Kostenindicatie", "Dossiervereisten"], reg_data, [3, 3, 10])

add_heading_styled(doc, "Route-overzicht per Fase", 2)

phase_routes = [
    ("SARU Ash Demo (Rotterdam)", "Route A (SR&D)", "Automatisch — < 1 ton/jaar, < 3 maanden, R&D"),
    ("Pilot Plant (IJmuiden)", "Route B (PPORD)", "ECHA-notificatie vereist vóór start — Q3 2026"),
    ("FOAK Start", "Route B (PPORD) + LoA", "PPORD-verlenging + Vanadium Consortium LoA"),
    ("FOAK Commercialisatie", "Route C (Volledig)", "REACH-registratie + LoA voor bestaande stoffen"),
]

add_styled_table(doc, ["Fase", "REACH Route", "Toelichting"], phase_routes, [3.5, 3, 10])

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 11: RISICOANALYSE
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Risicoanalyse", 1)

risks = [
    ("End-of-Wipe transitie", "HIGH", "CRITIEK", "De overgang van afvalstof naar product is niet automatisch geregeld. Zonder expliciete end-of-wipe beoordeling ontstaat een compliance gap.", "Juridische beoordeling end-of-wipe criteria door Arcadis/JvG vóór FOAK-start. Definitie van 'point of no return' in het productieproces."),
    ("Nieuwe stofidentiteit elektrolyt", "HIGH", "CRITIEK", "Het VRFB-elektrolyt is mogelijk een niet-geregistreerde nieuwe stof. Volledige registratie kost €120.000+.", "Onderzoek bestaande SVHC-registraties bij ECHA. Overweeg consortium-deelname voor elektrolyt-registratie. PPORD als tijdelijke dekking."),
    ("PPORD-notificatie timing", "MEDIUM", "WAARSCHUWING", "PPORD moet genotificeerd worden vóór start pilot. Vertraging heeft geen terugwerkende kracht.", "Indienen uiterlijk Q3 2026. Buffer van 3 maanden inplannen."),
    ("Vanadium SVHC-listing", "MEDIUM", "WAARSCHUWING", "V₂O₅ staat op de ECHA-intentielijst voor SVHC. Autorisatie kan verplicht worden.", "Monitor ECHA SVHC-intentielijst kwartaalsgewijs. Autorisatie-strategie opstellen als SVHC-status bevestigd."),
    ("Downstream user non-compliance", "LOW", "INFO", "Niet-naleving SDS-blootstellingsscenario's bij invoerchemicaliën.", "SDS-opvolging systeem implementeren. Jaarlijkse audit leveranciersdocumentatie."),
    ("Leveranciersregistratie vervalt", "LOW", "INFO", "Registratie leverancier kan vervallen (bijv. faillissement, terugtrekking).", "Back-up leveranciers identificeren. Eigen registratie als fallback bij FOAK."),
]

add_styled_table(doc,
    ["Risico", "Waarschijnlijkheid", "Impact", "Beschrijving", "Mitigatie"],
    risks,
    [2.5, 1.5, 1.5, 4.5, 6.5]
)

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 12: ACTIEPLAN & TIJDLIJN
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Actieplan & Tijdlijn", 1)

actions = [
    ("Q2 2026", "PPORD-notificatie voorbereiden", "Collecteren van procesgegevens, stofinventarisatie, blootstellingsscenario's voor ECHA-formulier", "JvG Consultancy / Phoenix Metals", "HIGH"),
    ("Q2 2026", "LoA Vanadium Consortium aanvragen", "Offerte opvragen bij Vanadium Consortium voor V₂O₅ LoA (CAS 1314-62-1)", "Phoenix Metals", "HIGH"),
    ("Q2 2026", "SDS-verzameling invoerchemicaliën", "Actuele SDS opvragen bij alle 4 leveranciers + CORAP-status check", "Phoenix Metals", "MEDIUM"),
    ("Q3 2026", "PPORD-notificatie indienen bij ECHA", "Indienen via REACH-IT portal. Bewijs van R&D-karakter pilot plant.", "JvG Consultancy", "CRITICAL"),
    ("Q3 2026", "ECHA SVHC-monitoring starten", "Kwartaalsgewijze check ECHA-intentielijst voor vanadiumverbindingen", "JvG Consultancy", "MEDIUM"),
    ("Q4 2026", "Elektrolyt stofidentiteit onderzoek", "Literatuur- en databankonderzoek naar bestaande registraties VRFB-elektrolyt", "JvG Consultancy", "HIGH"),
    ("Q1 2027", "End-of-wipe juridische beoordeling", "Arcadis/JvG beoordeling of afgeleide producten end-of-wipe criteria halen", "Arcadis / JvG Consultancy", "CRITICAL"),
    ("H1 2027", "FOAK REACH-strategie definitief", "Beslissing: volledige registratie vs. consortium-deelname per stof", "Phoenix Metals / JvG Consultancy", "HIGH"),
    ("H2 2027", "FOAK REACH-registratie start", "Aanvragen dossieronderzoek + LoA-verlenging + nieuwe registraties", "Specialist REACH consultant", "HIGH"),
]

add_styled_table(doc,
    ["Tijdlijn", "Actie", "Beschrijving", "Eigenaar", "Prioriteit"],
    actions,
    [1.5, 3.5, 5, 2.5, 1.5]
)

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 13: BUDGETINDICATIE
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Budgetindicatie", 1)

add_body(doc, "Onderstaande budgetindicatie is gebaseerd op markttarieven voor REACH-compliance in Nederland (2026). Feitelijke kosten zijn afhankelijk van complexiteit, gekozen consultant en tonnage.")

budget = [
    ("PPORD-notificatie ECHA", "Q3 2026", "€2.000 – €5.000", "Eenmalig", "JvG Consultancy"),
    ("LoA Vanadium Consortium (V₂O₅)", "Q2 2026", "€5.000 – €20.000", "Per jaar (recurrent)", "Vanadium Consortium"),
    ("Elektrolyt stofidentiteit onderzoek", "Q4 2026", "€3.000 – €8.000", "Eenmalig", "JvG Consultancy"),
    ("End-of-wipe juridische beoordeling", "Q1 2027", "€5.000 – €12.000", "Eenmalig", "Arcadis / JvG Consultancy"),
    ("FOAK REACH-strategie & planning", "H1 2027", "€5.000 – €10.000", "Eenmalig", "REACH specialist"),
    ("FOAK volledige registratie (indien nodig)", "H2 2027+", "€120.000 – €290.000", "Eenmalig + onderhoud", "REACH consultant"),
    ("Jaarlijks consortium lidmaatschap", "2027+", "€50.000 – €100.000", "Recurrent", "Vanadium Consortium"),
]

add_styled_table(doc,
    ["Onderdeel", "Tijdlijn", "Kostenindicatie", "Type", "Uitvoerder"],
    budget,
    [4, 1.5, 2.5, 2, 3]
)

add_heading_styled(doc, "Totale Kosten per Fase", 2)

totals = [
    ("Pilotfase (2026)", "€10.000 – €25.000", "PPORD + LoA + onderzoek"),
    ("FOAK-voorbereiding (H1 2027)", "€10.000 – €22.000", "End-of-wipe + strategie"),
    ("FOAK-commercialisatie (2027+)", "€120.000 – €290.000", "Volledige registratie (indien eigen)"),
    ("FOAK alternatief (consortium)", "€55.000 – €120.000/jaar", "Full membership + LoA's"),
]

add_styled_table(doc, ["Fase", "Totale Investering", "Dekking"], totals, [4, 3, 10])

add_callout(doc, "ℹ BUDGET TIP: De JTF-subsidie kan mogelijk worden ingezet voor REACH-compliancekosten, aangezien deze direct gerelateerd zijn aan de pilot- en FOAK-ontwikkeling. Verifieer subsidievoorwaarden met de JTF-projectmanager.", "info")

doc.add_page_break()

# ══════════════════════════════════════════════════════════════
# HOOFDSTUK 14: BIJLAGEN
# ══════════════════════════════════════════════════════════════

add_heading_styled(doc, "Bijlagen", 1)

add_heading_styled(doc, "Bijlage A: Referenties", 2)

refs = [
    ("EG 1907/2006", "REACH-verordening", "https://eur-lex.europa.eu/legal-content/NL/TXT/?uri=CELEX:32006R1907"),
    ("Richtlijn 2008/98/EG", "Kaderrichtlijn Afvalstoffen", "https://eur-lex.europa.eu/legal-content/NL/TXT/?uri=CELEX:32008L0098"),
    ("ECHA REACH-IT", "PPORD-notificatieportaal", "https://reachit.echa.europa.eu/"),
    ("ECHA SVHC-intentielijst", "Kandidaat SVHC-stoffen", "https://echa.europa.eu/registry-of-svhc-intentions-until-outcome"),
    ("Vanadium Consortium", "Consortium website", "https://vanadiumconsortium.com/"),
    ("ECHA InfoCard V₂O₅", "Registratiegegevens", "https://echa.europa.eu/substance-information/-/substanceinfo/100.028.795"),
    ("Arcadis haalbaarheidsstudie", "Dec 2025 — afvalstatus bevestiging", "Vertrouwelijk — Phoenix Metals"),
]

add_styled_table(doc, ["Referentie", "Onderwerp", "URL/Bron"], refs, [3, 3.5, 10])

add_heading_styled(doc, "Bijlage B: Vanadium Consortium — Geregistreerde Stoffen (relevant)", 2)

vc_subs = [
    ("Divanadium pentaoxide", "1314-62-1", "1-10 t/j", "REEDS"),
    ("Sodium metavanadate", "13718-26-8", "1-10 t/j", "REEDS"),
    ("Slags, steelmaking, vanadium", "60912-34-6", "1-10 t/j", "REEDS"),
    ("Vanadium", "7440-62-2", "1-10 t/j", "REEDS"),
    ("Vanadium oxide sulphate", "27774-13-6", "1-10 t/j", "REEDS"),
    ("Divanadium tris(sulphate)", "13701-70-7", "1-10 t/j", "REEDS"),
]

add_styled_table(doc, ["Stof", "CAS", "Tonnage Band", "Type"], vc_subs, [4, 2.5, 2, 2])

add_heading_styled(doc, "Bijlage C: ECHA CAS-nummer Verificatie", 2)

add_body(doc, "Alle CAS-nummers in dit document zijn geverifieerd via de ECHA-substancedatabase (echa.europa.eu) en PubChem. Laatste verificatie: april 2026.")

add_heading_styled(doc, "Bijlage D: ADR-klassificatie Invoerchemicaliën", 2)

adr_data = [
    ("Sodium hydroxide 50%", "UN 1824", "Klasse 8", "PG II", "Gevarenklasse: Corrosief"),
    ("Sulfuric acid 25-75%", "UN 1830", "Klasse 8", "PG II", "Gevarenklasse: Corrosief"),
    ("Calcium oxide", "UN 1910", "Klasse 8", "PG III", "Gevarenklasse: Corrosief"),
]

add_styled_table(doc, ["Stof", "UN-nummer", "ADR-klasse", "Packing Group", "Opmerking"], adr_data, [3, 2, 1.5, 1.5, 4])

# ── Footer on each page ──
for section in doc.sections:
    footer = section.footer
    footer.is_linked_to_previous = False
    p = footer.paragraphs[0] if footer.paragraphs else footer.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("JvG Consultancy | Safety • Governance • Advisory | REACH Compliance Scan Phoenix Metals v1.0 | 20 april 2026 | VERTROUWELIJK")
    run.font.size = Pt(7)
    run.font.color.rgb = SECONDARY
    run.font.name = 'Segoe UI'

# ── Save ──
os.makedirs(os.path.dirname(OUTPUT_PATH), exist_ok=True)
doc.save(OUTPUT_PATH)
print(f"✅ DOCX saved: {OUTPUT_PATH}")
print(f"   File size: {os.path.getsize(OUTPUT_PATH) / 1024:.1f} KB")
