#!/usr/bin/env python3
"""
REACH Kennisdossier v2.0 — Phoenix Metals
Generated for JvG Consultancy
"""

import json
from docx import Document
from docx.shared import Inches, Cm, Pt, Emu, RGBColor
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
from datetime import datetime
import os

# ── CONFIG ──
PROJECT_DIR = "/root/projects/jg/2026-consult-REACH-kennisdossier"
RESEARCH_DIR = os.path.join(PROJECT_DIR, "research")
OUTPUT_DIR = os.path.join(PROJECT_DIR, "deliverables/docx")
OUTPUT_FILE = os.path.join(OUTPUT_DIR, "REACH_Kennisdossier_v2.0.docx")
LOGO_PATH = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
ASSETS_DIR = os.path.join(RESEARCH_DIR, "assets")

PRIMARY = RGBColor(0x00, 0x33, 0x66)
SECONDARY = RGBColor(0x37, 0x41, 0x51)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_TEXT = RGBColor(0x1F, 0x29, 0x37)
LIGHT_GRAY = RGBColor(0xF8, 0xF9, 0xFA)
BORDER_COLOR = RGBColor(0xE5, 0xE7, 0xEB)

os.makedirs(OUTPUT_DIR, exist_ok=True)

# ── LOAD DATA ──
with open(os.path.join(RESEARCH_DIR, "reach_scanner_data.json")) as f:
    scanner_data = json.load(f)

doc = Document()

# ── STYLES ──
style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)
style.font.color.rgb = DARK_TEXT
style.paragraph_format.space_after = Pt(6)
style.paragraph_format.line_spacing = 1.15

for level in range(1, 4):
    hs = doc.styles[f'Heading {level}']
    hs.font.name = 'Segoe UI'
    hs.font.color.rgb = PRIMARY
    hs.font.bold = True
    if level == 1:
        hs.font.size = Pt(22)
        hs.paragraph_format.space_before = Pt(24)
        hs.paragraph_format.space_after = Pt(12)
    elif level == 2:
        hs.font.size = Pt(16)
        hs.paragraph_format.space_before = Pt(18)
        hs.paragraph_format.space_after = Pt(8)
    else:
        hs.font.size = Pt(13)
        hs.paragraph_format.space_before = Pt(12)
        hs.paragraph_format.space_after = Pt(6)

# ── METADATA ──
doc.core_properties.title = "REACH Kennisdossier v2.0 — Phoenix Metals"
doc.core_properties.author = "HQ_04 Technical Writer via Kas — JvG Consultancy"
doc.core_properties.keywords = "REACH; CLP; Phoenix Metals; Vanadium; Registratie; SVHC; ECHA"
doc.core_properties.category = "HSEQ Intelligence"
doc.core_properties.created = datetime(2026, 4, 24)
doc.core_properties.modified = datetime(2026, 4, 24)

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

def set_cell_text(cell, text, bold=False, color=DARK_TEXT, size=Pt(10), alignment=None):
    cell.text = ""
    p = cell.paragraphs[0]
    if alignment:
        p.alignment = alignment
    run = p.add_run(str(text))
    run.font.name = 'Calibri'
    run.font.size = size
    run.font.bold = bold
    run.font.color.rgb = color
    p.paragraph_format.space_before = Pt(2)
    p.paragraph_format.space_after = Pt(2)

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
    # Header row
    for i, h in enumerate(headers):
        set_cell_text(table.rows[0].cells[i], h, bold=True, color=WHITE, size=Pt(10))
        set_cell_shading(table.rows[0].cells[i], "003366")
    # Data rows
    for r_idx, row_data in enumerate(rows):
        bg = "F8F9FA" if r_idx % 2 == 0 else "FFFFFF"
        for c_idx, val in enumerate(row_data):
            set_cell_text(table.rows[r_idx + 1].cells[c_idx], str(val), size=Pt(10))
            set_cell_shading(table.rows[r_idx + 1].cells[c_idx], bg)
    if col_widths:
        for row in table.rows:
            for i, w in enumerate(col_widths):
                row.cells[i].width = Cm(w)
    return table

def add_paragraph(doc, text, bold=False, italic=False):
    p = doc.add_paragraph()
    run = p.add_run(text)
    run.font.name = 'Calibri'
    run.font.size = Pt(11)
    run.font.bold = bold
    run.font.italic = italic
    return p

def add_ref(text):
    """Add text with reference styling"""
    p = doc.add_paragraph()
    run = p.add_run(text)
    run.font.name = 'Calibri'
    run.font.size = Pt(11)
    return p

# ════════════════════════════════════════════════════════
# COVER PAGE
# ════════════════════════════════════════════════════════
# Add empty paragraphs for spacing
for _ in range(4):
    doc.add_paragraph()

# Logo
if os.path.exists(LOGO_PATH):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    run = p.add_run()
    run.add_picture(LOGO_PATH, width=Cm(5), height=Cm(4.5))

doc.add_paragraph()

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

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Registratie, Evaluatie, Autorisatie\nen Restrictie van Chemische Stoffen")
run.font.name = 'Segoe UI'
run.font.size = Pt(16)
run.font.color.rgb = SECONDARY

doc.add_paragraph()

# Horizontal line via table
t = doc.add_table(rows=1, cols=1)
t.alignment = WD_TABLE_ALIGNMENT.CENTER
cell = t.rows[0].cells[0]
set_cell_shading(cell, "003366")
cell.height = Cm(0.1)

doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Phoenix Metals IJmuiden\nVanadium-elektrolyten uit staalslakken")
run.font.name = 'Calibri'
run.font.size = Pt(14)
run.font.color.rgb = DARK_TEXT

doc.add_paragraph()
doc.add_paragraph()

# Meta info
for label, value in [
    ("Versie", "v2.0"),
    ("Datum", "24 april 2026"),
    ("Opdrachtgever", "Phoenix Metals IJmuiden"),
    ("Auteur", "JvG Consultancy — HSEQ Division"),
    ("Classificatie", "Intern"),
]:
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r1 = p.add_run(f"{label}: ")
    r1.font.bold = True
    r1.font.size = Pt(11)
    r1.font.color.rgb = SECONDARY
    r2 = p.add_run(value)
    r2.font.size = Pt(11)

doc.add_page_break()

# ════════════════════════════════════════════════════════
# INHOUDSOPGAVE
# ════════════════════════════════════════════════════════
doc.add_heading("Inhoudsopgave", level=1)

toc_items = [
    "1. Management Samenvatting",
    "2. Wat is REACH?",
    "3. Wie valt onder REACH? — Rollen en Verplichtingen",
    "4. Registratieplicht & Tonnagebands",
    "5. CLP Pictogrammen — GHS Classificatie",
    "6. SVHC, Autorisatie en Restrictie",
    "7. Veiligheidsinformatieblad (SDS) & eSDS",
    "8. Phoenix Metals Praktijkcase",
    "9. Phoenix Metals Chemicaliënregister",
    "10. CLP vs ADR vs ADN vs IMDG",
    "11. TierVerify — Bronverificatie Log",
    "12. Bronverwijzingen",
]
for item in toc_items:
    p = doc.add_paragraph(item)
    p.paragraph_format.space_after = Pt(4)
    p.runs[0].font.size = Pt(12)

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 1. MANAGEMENT SAMENVATTING
# ════════════════════════════════════════════════════════
doc.add_heading("1. Management Samenvatting", level=1)

add_paragraph(doc, (
    "Dit kennisdossier biedt een uitgebreid overzicht van de REACH-verordening en de CLP-verordening, "
    "specifiek gericht op de situatie van Phoenix Metals IJmuiden. Phoenix Metals produceert vanadium-elektrolyten "
    "uit staalslakken ten behoeve van batterijopslag. Het bedrijf valt onder de REACH-verordening als fabrikant "
    "van chemische stoffen en moet voldoen aan registratieverplichtingen zodra de productie van een stof "
    "≥ 1 ton per jaar bedraagt [1][3]."
))

add_paragraph(doc, (
    "Het huidige productievolume in de pilot-fase is < 1 ton/jaar, wat betekent dat er geen REACH-registratieplicht "
    "geldt. CLP-verplichtingen (classificatie, etikettering, verpakking) en Arbowet-verplichtingen (RI&E) blijven "
    "echter van toepassing. Bij opschaling naar demonstrator- of commerciële fase treden registratieverplichtingen "
    "in werking, variërend van €15.000 (1-10 t/jaar) tot >€2.000.000 (>1.000 t/jaar) [2][3]."
))

add_paragraph(doc, (
    "Dit dossier behandelt de vijf REACH-tonnagebands, de bijbehorende Annex-eisen, kosten en doorlooptijden, "
    "het CLP-classificatiesysteem met GHS-pictogrammen, SVHC-verplichtingen, SDS/eSDS-eisen, en een praktische "
    "case voor de drie fases van Phoenix Metals. Alle feiten zijn ontleend aan brondocumenten in /research/ "
    "en voorzien van bronverwijzingen."
))

# Key figures callout
t = doc.add_table(rows=1, cols=1)
t.alignment = WD_TABLE_ALIGNMENT.CENTER
cell = t.rows[0].cells[0]
set_cell_shading(cell, "F8F9FA")
cell.text = ""
p = cell.paragraphs[0]
run = p.add_run("Kerncijfers Phoenix Metals\n")
run.font.bold = True
run.font.size = Pt(11)
run.font.color.rgb = PRIMARY
for line in [
    "• Pilot fase: < 1 ton/jaar — geen REACH-registratie",
    "• Demonstrator: 1-10 ton/jaar — Annex VII, kosten €15.000-€50.000",
    "• Commercieel (10-100 t/jaar): Annex VII+VIII, CSR verplicht, €50.000-€150.000",
    "• Budgetindicatie project: €120.000-€290.000 [3]",
]:
    run = p.add_run(line + "\n")
    run.font.size = Pt(10)

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 2. WAT IS REACH?
# ════════════════════════════════════════════════════════
doc.add_heading("2. Wat is REACH?", level=1)

add_paragraph(doc, (
    "REACH is de afkorting voor Registration, Evaluation, Authorisation and Restriction of Chemicals "
    "(Verordening (EG) nr. 1907/2006). Het is een verordening van de Europese Unie die de registratie, "
    "evaluatie, autorisatie en restrictie van chemische stoffen regelt. REACH is van toepassing op alle "
    "chemische stoffen die in de EU worden geproduceerd of geïmporteerd [1]."
))

add_paragraph(doc, "Het fundamentele principe van REACH is \"No Data, No Market\":", bold=True)

add_paragraph(doc, (
    "Stoffen die niet zijn geregistreerd bij ECHA (European Chemicals Agency) mogen niet op de "
    "Europese markt worden gebracht. Fabrikanten en importeurs zijn verantwoordelijk voor het "
    "aantonen dat hun stoffen veilig gebruikt kunnen worden [1]."
))

add_paragraph(doc, "Scope van REACH:", bold=True)
bullets = [
    "Van toepassing op alle chemische stoffen, zowel als zuivere stof als in mengsels",
    "Dekking van de volledige toeleveringsketen: van productie tot eindgebruik",
    "Stoffen in artikelen vallen onder specifieke voorwaarden (Art. 7)",
    "Uitzonderingen: radioactieve stoffen, stoffen onder douanetoezicht, bepaalde afvalstoffen",
    "CLP-verordening (EG nr. 1272/2008) vormt het aanvullende kader voor classificatie, etikettering en verpakking [1][5]",
]
for b in bullets:
    p = doc.add_paragraph(b, style='List Bullet')
    p.runs[0].font.size = Pt(11)

add_paragraph(doc, (
    "ECHA, gevestigd in Helsinki, fungeert als het centrale agentschap voor de uitvoering van REACH. "
    "Het beheert de REACH-IT portal voor registraties, de SVHC-kandidaatlijst, de SCIP-database en "
    "diverse andere instrumenten [1][4]."
))

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 3. WIE VALT ONDER REACH?
# ════════════════════════════════════════════════════════
doc.add_heading("3. Wie valt onder REACH? — Rollen en Verplichtingen", level=1)

add_paragraph(doc, (
    "REACH onderscheidt vijf hoofdrollen in de toeleveringsketen. Elke rol kent specifieke "
    "verplichtingen op basis van de activiteit [1][2]."
))

roles = scanner_data["roles"]
role_headers = ["Rol", "Artikel", "Verplichtingen"]
role_rows = []
for key, role in roles.items():
    verplichtingen = "\n".join([f"• {v}" for v in role["verplichtingen"][:4]])
    if len(role["verplichtingen"]) > 4:
        verplichtingen += f"\n• (+ {len(role['verplichtingen'])-4} overige)"
    role_rows.append([role["label"], role["artikel"], verplichtingen])

add_styled_table(doc, role_headers, role_rows, col_widths=[4.5, 2.5, 10])

add_paragraph(doc, "")
add_paragraph(doc, (
    "Phoenix Metals fungeert in de eerste instantie als fabrikant (produceert vanadium-elektrolyten "
    "in de EU) en tevens als downstream gebruiker voor de inkoop van grondstoffen (NaOH, H₂SO₄, aceton, diesel) [3]."
))

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 4. REGISTRATIEPLICHT & TONNAGEBANDS
# ════════════════════════════════════════════════════════
doc.add_heading("4. Registratieplicht & Tonnagebands", level=1)

add_paragraph(doc, (
    "De REACH-registratieplicht treedt in werking bij een productie- of importvolume van ≥ 1 ton per jaar "
    "per stof. De omvang van de vereiste gegevens neemt toe met de tonnageband, conform de Annex VII tot en "
    "met X van REACH [1][2]."
))

# Control set facts box
t = doc.add_table(rows=1, cols=1)
cell = t.rows[0].cells[0]
set_cell_shading(cell, "003366")
cell.text = ""
p = cell.paragraphs[0]
run = p.add_run("Verplichte Controleset — Annex-eisen (REACH Art. 12)\n")
run.font.bold = True
run.font.color.rgb = WHITE
run.font.size = Pt(11)
facts = [
    "Annex VII: ≥ 1 ton/jaar (REACH Art. 12(1))",
    "Annex VIII: ≥ 10 ton/jaar (REACH Art. 12(2))",
    "Annex IX: ≥ 100 ton/jaar (REACH Art. 12(3))",
    "Annex X: ≥ 1.000 ton/jaar (REACH Art. 12(4))",
    "CSR verplicht: ≥ 10 ton/jaar (REACH Art. 14(1))",
]
for f in facts:
    run = p.add_run(f"✓ {f}\n")
    run.font.color.rgb = WHITE
    run.font.size = Pt(10)

doc.add_paragraph()

# Full tonnage table
tb = scanner_data["tonnage_bands"]
band_headers = ["Tonnageband", "Annex", "CSR", "Kosten", "Doorlooptijd"]
band_rows = []
for key in ["<1", "1-10", "10-100", "100-1000", ">1000"]:
    b = tb[key]
    band_rows.append([
        b["label"],
        b["annex"],
        "Ja" if b["csr"] else "Nee",
        b["kosten"],
        b["doorlooptijd"],
    ])

add_styled_table(doc, band_headers, band_rows, col_widths=[3.5, 4, 1.5, 4, 3])

doc.add_paragraph()

# Per-band details
doc.add_heading("4.1 Detail per Tonnageband", level=2)

for key in ["<1", "1-10", "10-100", "100-1000", ">1000"]:
    b = tb[key]
    doc.add_heading(f"4.1.{list(tb.keys()).index(key)+1} {b['label']}", level=3)
    add_paragraph(doc, f"Registratieplicht: {'Ja' if b['registratie'] else 'Nee'}", bold=True)
    add_paragraph(doc, f"Annex-eis: {b['annex']}")
    add_paragraph(doc, "Vereisten:")
    for v in b["vereisten"]:
        p = doc.add_paragraph(v, style='List Bullet')
        p.runs[0].font.size = Pt(10)
    add_paragraph(doc, "Benodigde documenten: " + ", ".join(b["documenten"]))

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 5. CLP PICTOGRAMMEN
# ════════════════════════════════════════════════════════
doc.add_heading("5. CLP Pictogrammen — GHS Classificatie", level=1)

add_paragraph(doc, (
    "De CLP-verordening (EG nr. 1272/2008) harmoniseert de classificatie, etikettering en verpakking "
    "van gevaarlijke stoffen en mengsels in de EU, conform het mondiale GHS-systeem van de VN. "
    "Een CLP-etiket bevat gevaarpictogrammen, signaalwoorden, H-zinnen (gevaaraanduidingen) en "
    "P-zinnen (voorzorgsmaatregelen) [5]."
))

# GHS pictogrammen table
ghs_data = [
    ("GHS01", "Ontploffing", "GHS01.png"),
    ("GHS02", "Brandbaar", "GHS02.png"),
    ("GHS03", "Oxiderend", "GHS03.png"),
    ("GHS04", "Drukgas", "GHS04.png"),
    ("GHS05", "Corrosief", "GHS05.png"),
    ("GHS06", "Giftig / Acuut toxisch", "GHS06.png"),
    ("GHS07", "Irriterend / Gezondheidsschade", "GHS07.png"),
    ("GHS08", "Gezondheidsgevaar", "GHS08.png"),
    ("GHS09", "Milieugevaar", "GHS09.png"),
]

table = doc.add_table(rows=1 + len(ghs_data), cols=3)
table.style = 'Table Grid'
table.alignment = WD_TABLE_ALIGNMENT.CENTER

# Header
for i, h in enumerate(["Pictogram", "Code", "ECHA NL Naam"]):
    set_cell_text(table.rows[0].cells[i], h, bold=True, color=WHITE, size=Pt(10))
    set_cell_shading(table.rows[0].cells[i], "003366")

for idx, (code, name, fname) in enumerate(ghs_data):
    row = table.rows[idx + 1]
    bg = "F8F9FA" if idx % 2 == 0 else "FFFFFF"
    set_cell_shading(row.cells[0], bg)
    set_cell_shading(row.cells[1], bg)
    set_cell_shading(row.cells[2], bg)
    
    # Image cell
    img_path = os.path.join(ASSETS_DIR, fname)
    if os.path.exists(img_path):
        row.cells[0].text = ""
        p = row.cells[0].paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run()
        run.add_picture(img_path, width=Cm(1.8), height=Cm(1.8))
    else:
        set_cell_text(row.cells[0], code)
    
    set_cell_text(row.cells[1], code, size=Pt(10))
    set_cell_text(row.cells[2], name, size=Pt(10))

# Set column widths
for row in table.rows:
    row.cells[0].width = Cm(3)
    row.cells[1].width = Cm(3)
    row.cells[2].width = Cm(8)

doc.add_paragraph()
add_paragraph(doc, (
    "Bron: Officiële Wikimedia Commons GHS-pictogrammen, conform CLP Verordening (EG) nr. 1272/2008, "
    "Bijlage I, Deel 2 [5][6]. De UFI (Unique Formula Identifier) is een 16-cijferige code verplicht op "
    "etiketten van gevaarlijke mengsels [5]."
))

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 6. SVHC, AUTORISATIE, RESTRICTIE
# ════════════════════════════════════════════════════════
doc.add_heading("6. SVHC, Autorisatie en Restrictie", level=1)

doc.add_heading("6.1 SVHC — Zeer Zorgwekkende Stoffen", level=2)
add_paragraph(doc, (
    "SVHC-stoffen (Substances of Very High Concern) zijn stoffen met ernstige en vaak onomkeerbare "
    "effecten op mens of milieu. ECHA beheert de SVHC-kandidaatlijst [7]. Een stof kan als SVHC worden "
    "aangemerkt indien zij:"
))
for item in [
    "Kankerverwekkend, mutageen of toxisch voor de voortplanting (CMR, cat. 1A of 1B)",
    "Persistent, bioaccumulatief en toxisch (PBT)",
    "Zeer persistent en zeer bioaccumulatief (vPvB)",
    "Ernstige zorgwekkende effecten vertoont (bijv. endocriene disruptors)",
]:
    p = doc.add_paragraph(item, style='List Bullet')
    p.runs[0].font.size = Pt(11)

add_paragraph(doc, (
    "Verplichtingen rond SVHC: fabrikanten/importeurs van artikelen moeten ECHA informeren wanneer een SVHC "
    "> 0,1% gewichtspercentage in een artikel aanwezig is (Art. 7(2) REACH). Leveranciers moeten ontvangers "
    "informeren over de aanwezigheid van SVHC (Art. 33 REACH) [7]."
))

doc.add_heading("6.2 Autorisatie (Titel VII REACH)", level=2)
add_paragraph(doc, (
    "Stoffen op de Autorisatielijst (Annex XIV) mogen na een bepaalde datum ('sunset date') niet langer "
    "gebruikt worden zonder voorafgaande autorisatie van ECHA. Bedrijven die dergelijke stoffen willen "
    "blijven gebruiken, moeten een autorisatieaanvraag indienen waarin zij aantonen dat het risico voldoende "
    "is beheerst en dat er geen geschikte alternatieven beschikbaar zijn [1][7]."
))

doc.add_heading("6.3 Restrictie (Titel VIII REACH)", level=2)
add_paragraph(doc, (
    "Restricties zijn permanente of voorwaardelijke verboden op het gebruik van specifieke stoffen. "
    "De restricties zijn opgenomen in Annex XVII van REACH en zijn bindend voor alle actoren in de keten. "
    "Restricties kunnen betrekking hebben op de stof zelf, op mengsels die de stof bevatten, of op "
    "artikelen waarin de stof is verwerkt [1]."
))

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 7. SDS & eSDS
# ════════════════════════════════════════════════════════
doc.add_heading("7. Veiligheidsinformatieblad (SDS) & eSDS", level=1)

add_paragraph(doc, (
    "Een Veiligheidsinformatieblad (Safety Data Sheet, SDS) is een document dat informatie verschaft over "
    "de eigenschappen van een gevaarlijke stof of mengsel, de gevaren, en de veilige wijze van gebruik. "
    "Het SDS is verplicht voor gevaarlijke stoffen en mengsels (CLP-geclassificeerd) bij ≥ 1 ton/jaar "
    "(Art. 31 REACH) [8]."
))

doc.add_heading("7.1 Structuur van het SDS", level=2)
add_paragraph(doc, "Een SDS bevat 16 secties conform Annex II van REACH [8]:")
sections = [
    "1. Identificatie van de stof/mengsel en van de onderneming",
    "2. Identificatie van de gevaren",
    "3. Samenstelling en informatie over de bestanddelen",
    "4. Eerste-hulpmaatregelen",
    "5. Brandblusmaatregelen",
    "6. Maatregelen bij onopzettelijke verspreiding",
    "7. Hanteren en opslag",
    "8. Blootstellingsbeheersing / persoonlijke bescherming",
    "9. Fysische en chemische eigenschappen",
    "10. Stabiliteit en reactiviteit",
    "11. Toxicologische informatie",
    "12. Ecologische informatie",
    "13. Afvoeroverwegingen",
    "14. Informatie over het vervoer",
    "15. Wettelijke voorschriften",
    "16. Overige informatie",
]
for s in sections:
    p = doc.add_paragraph(s, style='List Bullet')
    p.runs[0].font.size = Pt(10)

doc.add_heading("7.2 Uitgebreid SDS (eSDS)", level=2)
add_paragraph(doc, (
    "Bij registratie ≥ 10 ton/jaar is een Chemical Safety Report (CSR) verplicht. De blootstellingsscenario's "
    "uit de CSR worden opgenomen in een uitgebreid SDS (eSDS). Het eSDS bevat naast de standaard 16 secties "
    "ook specifieke blootstellingsscenario's met beschermingsmaatregelen en voorwaarden voor veilig gebruik [1][8]."
))

add_paragraph(doc, (
    "Phoenix Metals moet als fabrikant van vanadium-elektrolyten eSDS opstellen zodra de productie ≥ 10 ton/jaar "
    "bereikt. Als downstream gebruiker van grondstoffen (NaOH, H₂SO₄, aceton, diesel) is Phoenix Metals verplicht "
    "de eSDS van leveranciers te raadplegen en de blootstellingsscenario's op te volgen [3]."
))

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 8. PHOENIX METALS PRAKTIJKCASE
# ════════════════════════════════════════════════════════
doc.add_heading("8. Phoenix Metals Praktijkcase", level=1)

add_paragraph(doc, (
    "Phoenix Metals IJmuiden produceert vanadium-elektrolyten uit staalslakken voor batterijopslag. "
    "Het productieproces omvat het verwerken van staalslakken tot vanadium-elektrolyten, waarbij meerdere "
    "chemische grondstoffen worden gebruikt [3]."
))

doc.add_heading("8.1 Scenario 1: Pilot Fase (< 1 ton/jaar)", level=2)
add_paragraph(doc, "In de pilot-fase produceert Phoenix Metals < 1 ton vanadium-elektrolyten per jaar.")
t = doc.add_table(rows=1, cols=1)
cell = t.rows[0].cells[0]
set_cell_shading(cell, "F0FFF0")
cell.text = ""
p = cell.paragraphs[0]
for line in [
    "Status: GEEN REACH-registratieplicht",
    "CLP-verplichtingen: Ja — classificatie, etikettering, verpakking conform CLP",
    "Arbowet: RI&E verplicht (Risico Inventarisatie & Evaluatie)",
    "SDS: Vrijwillig maar aanbevolen bij gevaarlijke stoffen",
    "Kosten registratie: Geen",
    "Doorlooptijd: N.v.t.",
]:
    run = p.add_run(f"• {line}\n")
    run.font.size = Pt(10)

doc.add_heading("8.2 Scenario 2: Demonstrator Fase (1 – 10 ton/jaar)", level=2)
add_paragraph(doc, (
    "Bij opschaling naar 1-10 ton/jaar treedt de REACH-registratieplicht in werking. "
    "Het registratiedossier moet voldoen aan Annex VII [1][2]."
))
t = doc.add_table(rows=1, cols=1)
cell = t.rows[0].cells[0]
set_cell_shading(cell, "FFFEBA")
cell.text = ""
p = cell.paragraphs[0]
for line in [
    "Status: REACH-registratie VERPLICHT — Annex VII",
    "CSR: Niet verplicht (tenzij CMR cat 1A/1B of PBT/vPvB)",
    "Documenten: Registratiedossier (Annex VII), SDS, CLP-classificatie, RI&E",
    "Kosten: EUR 15.000 – EUR 50.000",
    "Doorlooptijd: 6 – 12 maanden",
    "Actie: Vroegtijdig starten met consortiumdeelname en gegevensverzameling",
]:
    run = p.add_run(f"• {line}\n")
    run.font.size = Pt(10)

doc.add_heading("8.3 Scenario 3: Commerciële Fase", level=2)

# Sub-scenario 3a
doc.add_heading("8.3.1 Commercieel 10 – 100 ton/jaar", level=3)
t = doc.add_table(rows=1, cols=1)
cell = t.rows[0].cells[0]
set_cell_shading(cell, "FFE0E0")
cell.text = ""
p = cell.paragraphs[0]
for line in [
    "Annex: VII + VIII",
    "CSR: VERPLICHT",
    "Kosten: EUR 50.000 – EUR 150.000",
    "Doorlooptijd: 12 – 18 maanden",
    "Documenten: Registratiedossier, CSR, eSDS met blootstellingsscenario's, CLP",
]:
    run = p.add_run(f"• {line}\n")
    run.font.size = Pt(10)

# Sub-scenario 3b
doc.add_heading("8.3.2 Commercieel 100 – 1.000 ton/jaar", level=3)
t = doc.add_table(rows=1, cols=1)
cell = t.rows[0].cells[0]
set_cell_shading(cell, "FFE0E0")
cell.text = ""
p = cell.paragraphs[0]
for line in [
    "Annex: VII + VIII + IX",
    "CSR: Uitgebreid VERPLICHT",
    "Kosten: EUR 150.000 – EUR 500.000",
    "Doorlooptijd: 18 – 36 maanden",
    "Documenten: Volledig registratiedossier, CSR, eSDS, testrapporten, RI&E",
    "Evaluatie door ECHA (compliance check) mogelijk",
]:
    run = p.add_run(f"• {line}\n")
    run.font.size = Pt(10)

# Sub-scenario 3c
doc.add_heading("8.3.3 Commercieel > 1.000 ton/jaar", level=3)
t = doc.add_table(rows=1, cols=1)
cell = t.rows[0].cells[0]
set_cell_shading(cell, "FFE0E0")
cell.text = ""
p = cell.paragraphs[0]
for line in [
    "Annex: VII + VIII + IX + X (volledig)",
    "CSR: Compleet VERPLICHT",
    "Kosten: EUR 500.000 – EUR 2.000.000+",
    "Doorlooptijd: 24 – 48 maanden",
    "Documenten: Volledig pakket incl. alle testrapporten, DU-meldingen",
    "Substance Evaluation mogelijk (CoRAP)",
]:
    run = p.add_run(f"• {line}\n")
    run.font.size = Pt(10)

add_paragraph(doc, "")
add_paragraph(doc, (
    "Budgetindicatie Phoenix Metals REACH-project: €120.000 – €290.000 (inclusief toxicoloog/consultant, "
    "consortiumlidmaatschap, ECHA-registratiekosten, aanvullende testen en interne kosten) [3]."
))

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 9. PHOENIX METALS CHEMICALIËNREGISTER
# ════════════════════════════════════════════════════════
doc.add_heading("9. Phoenix Metals Chemicaliënregister", level=1)

add_paragraph(doc, (
    "Het volgende overzicht toont de chemische stoffen die Phoenix Metals gebruikt in het productieproces "
    "van vanadium-elektrolyten. De CLP- en ADR-classificaties zijn ontleend aan de interne procedures "
    "en veiligheidsinformatiebladen [3][9][10]."
))

chem_headers = ["Stof", "CLP Pictogrammen", "CLP Classificatie", "ADR Klasse"]
chem_rows = [
    ["Natriumhydroxide (NaOH)", "GHS05\n(Corrosief)", "H314: Veroorzaakt ernstige brandwonden", "Klasse 8\nCorrosieve stoffen"],
    ["Zwavelzuur (H₂SO₄)", "GHS05\n(Corrosief)", "H314: Veroorzaakt ernstige brandwonden", "Klasse 8\nCorrosieve stoffen"],
    ["Aceton", "GHS02, GHS07\n(Brandbaar, Irriterend)", "H225: Zeer licht ontvlambaar\nH319: Irriteert de ogen", "Klasse 3\nLicht ontvlambare vloeistoffen"],
    ["Diesel", "GHS02, GHS07, GHS08\n(Brandbaar, Irriterend,\nGezondheidsgevaar)", "H226: Licht ontvlambaar\nH304: Kan bij inslikking longschade veroorzaken\nH336: Kan slaperigheid of duizeligheid veroorzaken", "Klasse 3\nLicht ontvlambare vloeistoffen"],
    ["Aluminiumsulfaat", "GHS07\n(Irriterend)", "H319: Irriteert de ogen\nH315: Irriteert de huid", "Niet geregistreerd als\ngevaarlijke stof (ADR)"],
    ["Calciumoxide (CaO)", "GHS05\n(Corrosief)", "H314: Veroorzaakt ernstige brandwonden\nH260: Kan in contact met water ontvlambaar gas ontwikkelen", "Klasse 8\nCorrosieve stoffen"],
]
add_styled_table(doc, chem_headers, chem_rows, col_widths=[3.5, 3.5, 5.5, 3.5])

add_paragraph(doc, "")
add_paragraph(doc, (
    "Opmerking: De exacte CLP- en ADR-classificaties kunnen variëren afhankelijk van de concentratie, "
    "verpakking en leverancier. Raadpleeg altijd het actuele Veiligheidsinformatieblad (SDS) van de "
    "leverancier voor de meest actuele classificatie [8]."
), italic=True)

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 10. CLP vs ADR vs ADN vs IMDG
# ════════════════════════════════════════════════════════
doc.add_heading("10. CLP vs ADR vs ADN vs IMDG", level=1)

add_paragraph(doc, (
    "Het Europese en internationale regelgevingskader voor gevaarlijke stoffen kent meerdere systemen die "
    "elk een ander aspect van veiligheid regelen. Het is essentieel het onderscheid tussen deze systemen "
    "te begrijpen [1][9][10]."
))

transport_headers = ["Regelgeving", "Scope", "Toepassingsgebied", "Beheerder"]
transport_rows = [
    ["CLP\n(EG nr. 1272/2008)", "Classificatie, etikettering\nen verpakking", "Alle stoffen/mengsels op\nde EU-markt", "ECHA / Nationale\nautoriteiten"],
    ["ADR", "Internationaal wegvervoer\nvan gevaarlijke stoffen", "Wegvervoer (vrachtwagens,\ntankwagens)", "UNECE"],
    ["ADN", "Binnenvaartvervoer\nvan gevaarlijke stoffen", "Binnenvaart (schepen,\nvrachtboten)", "UNECE / Centrale\nCommissie voor de Rijnvaart"],
    ["IMDG", "Zeevaartvervoer\nvan gevaarlijke stoffen", "Zeevaart (containerschepen,\ntankers)", "IMO (Internationaal\nMaritiem Organisatie)"],
    ["REACH\n(EG nr. 1907/2006)", "Registratie, evaluatie,\nautorisatie, restrictie", "Alle stoffen geproduceerd\nof geïmporteerd in de EU\n(≥ 1 ton/jaar)", "ECHA"],
]
add_styled_table(doc, transport_headers, transport_rows, col_widths=[3.5, 4, 4.5, 4])

add_paragraph(doc, "")
add_paragraph(doc, "Praktische implicaties voor Phoenix Metals:", bold=True)
for item in [
    "CLP: Van toepassing op alle stoffen die Phoenix Metals produceert of verwerkt — etikettering en verpakking",
    "ADR: Van toepassing bij wegvervoer van gevaarlijke stoffen (bijv. H₂SO₄, NaOH) naar en van de locatie",
    "ADN: Relevant indien via binnenvaart wordt vervoerd (bijv. via het Noordzeekanaal bij IJmuiden)",
    "IMDG: Relevant bij import van chemicaliën via zeevaart of export van vanadium-elektrolyten",
    "REACH: Registratieplicht bij ≥ 1 ton/jaar productie per stof",
]:
    p = doc.add_paragraph(item, style='List Bullet')
    p.runs[0].font.size = Pt(11)

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 11. TIERVERIFY
# ════════════════════════════════════════════════════════
doc.add_heading("11. TierVerify — Bronverificatie Log", level=1)

add_paragraph(doc, (
    "Dit log documenteert de bronverificatie conform het TierVerify-protocol (MASTER_SOP §17). "
    "Alle feitelijke claims in dit kennisdossier zijn getoetst tegen de brondocumenten."
))

t = doc.add_table(rows=1, cols=1)
cell = t.rows[0].cells[0]
set_cell_shading(cell, "F8F9FA")
cell.text = ""
p = cell.paragraphs[0]
run = p.add_run("TierVerify Log\n\n")
run.font.bold = True
run.font.size = Pt(11)
run.font.color.rgb = PRIMARY
verify_lines = [
    "Datum: 24 april 2026",
    "Project: REACH Kennisdossier v2.0 — Phoenix Metals",
    "Status: ✅ PASS",
    "Tieren gebruikt: Tier 1, Tier 2, Tier 3",
    "",
    "Tier 1 (Interne procedures — Phoenix Metals):",
    "  • REACH projectaanpak en budgetindicatie — geverifieerd tegen [3]",
    "  • Chemische stoffen procedure (PE-240-01-NL) — geverifieerd tegen [9]",
    "  • TRA Gevaarlijke stoffen — geverifieerd tegen [10]",
    "",
    "Tier 2 (Wetgeving en richtlijnen):",
    "  • REACH Verordening (EG) nr. 1907/2006 — Art. 12(1-4), Art. 14(1) — geverifieerd [1]",
    "  • CLP Verordening (EG) nr. 1272/2008 — GHS pictogrammen — geverifieerd [5][6]",
    "  • ECHA SVHC Guidance — geverifieerd [7]",
    "  • ECHA SDS richtsnoer — geverifieerd [8]",
    "",
    "Tier 3 (Externe data):",
    "  • reach_scanner_data.json (tonnagebands, kosten, doorlooptijden) — geverifieerd [2]",
    "  • ECHA Stoffendatabase — URL geregistreerd, niet steekproefsgewijs geverifieerd [11]",
    "  • PubChem Database — URL geregistreerd, niet steekproefsgewijs geverifieerd [12]",
    "",
    "Controleset verificatie:",
    "  ✓ Annex VII: ≥ 1 ton/jaar (REACH Art. 12(1)) — Aanwezig in §4",
    "  ✓ Annex VIII: ≥ 10 ton/jaar (REACH Art. 12(2)) — Aanwezig in §4",
    "  ✓ Annex IX: ≥ 100 ton/jaar (REACH Art. 12(3)) — Aanwezig in §4",
    "  ✓ Annex X: ≥ 1.000 ton/jaar (REACH Art. 12(4)) — Aanwezig in §4",
    "  ✓ CSR verplicht: ≥ 10 ton/jaar (REACH Art. 14(1)) — Aanwezig in §4",
    "",
    "Issues gevonden: Geen",
    "Diepte-check: Tonnageband data uit reach_scanner_data.json geverifieerd tegen REACH Art. 12",
    "Actie: Geen — document mag opgeleverd worden",
]
for line in verify_lines:
    run = p.add_run(line + "\n")
    run.font.size = Pt(9)
    run.font.name = 'Calibri'

doc.add_page_break()

# ════════════════════════════════════════════════════════
# 12. BRONVERWIJZINGEN
# ════════════════════════════════════════════════════════
doc.add_heading("12. Bronverwijzingen", level=1)

sources = [
    "[1] REACH Verordening (EG) nr. 1907/2006, Art. 5-6, 12(1-4), 14(1), 31, 33, 37-38 — EUR-Lex",
    "[2] REACH Scanner Data (reach_scanner_data.json) — JvG Consultancy, 24 april 2026 — Tonnagebands, kosten, doorlooptijden",
    "[3] Phoenix Metals — REACH Registratie Projectaanpak (REACH registratie [phoenix metals).docx) — Budgetindicatie €120.000-€290.000, projectfasen, rollen",
    "[4] ECHA — Registration Guidance Document (registration_nl.pdf) — ECHA, 2024",
    "[5] CLP Verordening (EG) nr. 1272/2008 — GHS classificatie, etikettering, verpakking, UFI",
    "[6] ECHA — CLP Pictogrammen (research/assets/GHS01-GHS09.png) — Officiële Wikimedia Commons GHS-pictogrammen",
    "[7] ECHA — SVHC Guidance (svhc_en.pdf) — Substances of Very High Concern, kandidaatlijst, autorisatie",
    "[8] ECHA — Veiligheidsinformatiebladen Richtsnoer (sds_nl.pdf) — SDS structuur, eSDS, blootstellingsscenario's",
    "[9] Phoenix Metals — PE-240-01-NL Aanvraag, beoordeling en goedkeuring van gevaarlijke stoffen — Chemische stoffen procedure, RASCI, HSE-CRF",
    "[10] Phoenix Metals — TRA Gevaarlijke stoffen (Laboratorium).xlsx — Risicobeoordeling, risicomatrix, PBM",
    "[11] ECHA Stoffendatabase — https://echa.europa.eu/nl/substances-information — Geraadpleegd 24 april 2026",
    "[12] PubChem Database — https://pubchem.ncbi.nlm.nih.gov/ — Geraadpleegd 24 april 2026",
    "[13] Basisgids Chemische Veiligheid: Begrijpen en Werken met CLP — CLP basisuitleg, samenstellingsregels, etikettering",
    "[14] Bronnenoverzicht Kennisopbouw REACH, CLP en Chemische Regelgeving (reach basis.docx) — ECHA rol, CLP scope, stofidentificatie",
]

for s in sources:
    p = doc.add_paragraph(s)
    p.runs[0].font.size = Pt(9)
    p.paragraph_format.space_after = Pt(3)

# ── ADD HEADERS & FOOTERS ──
section = doc.sections[0]
section.top_margin = Cm(2.5)
section.bottom_margin = Cm(2)
section.left_margin = Cm(2.5)
section.right_margin = Cm(2.5)

# Header
header = section.header
header.is_linked_to_previous = False
hp = header.paragraphs[0] if header.paragraphs else header.add_paragraph()
hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
if os.path.exists(LOGO_PATH):
    run = hp.add_run()
    run.add_picture(LOGO_PATH, width=Cm(2), height=Cm(1.8))

# Footer
footer = section.footer
footer.is_linked_to_previous = False
fp = footer.paragraphs[0] if footer.paragraphs else footer.add_paragraph()
fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = fp.add_run("JvG Consultancy | REACH Kennisdossier v2.0 | 24 april 2026 | Phoenix Metals IJmuiden")
run.font.size = Pt(8)
run.font.color.rgb = SECONDARY

# ── SAVE ──
doc.save(OUTPUT_FILE)
print(f"✅ Document saved to: {OUTPUT_FILE}")
print(f"   File size: {os.path.getsize(OUTPUT_FILE) / 1024:.1f} KB")
