#!/usr/bin/env python3
"""
REACH Kennisdossier DOCX Generator v1.0
Generates a comprehensive REACH knowledge dossier for Phoenix Metals / JvG Consultancy.
"""

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

# === CONFIGURATION ===
OUTPUT_PATH = "/root/projects/jg/2026-consult-REACH-kennisdossier/deliverables/docx/REACH_Kennisdossier_v1.0.docx"
LOGO_PATH = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
PROJECT_CODE = "REACH-KD-2026"
VERSION = "1.0"
DATE_STR = datetime.now().strftime("%d-%m-%Y")
AUTHOR = "HQ_04 Technical Writer | JvG Consultancy"
TITLE = "REACH Kennisdossier"

# Colors
PRIMARY = RGBColor(0x00, 0x33, 0x66)
SECONDARY = RGBColor(0x37, 0x41, 0x51)
TEXT_DARK = RGBColor(0x1F, 0x29, 0x37)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)

# EMU conversions
CM2EMU = 360000  # 1 cm = 360000 EMU

doc = Document()

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

# Heading 1
h1 = doc.styles['Heading 1']
h1.font.name = 'Calibri'
h1.font.size = Pt(14)
h1.font.bold = True
h1.font.color.rgb = PRIMARY
h1.paragraph_format.space_before = Pt(18)
h1.paragraph_format.space_after = Pt(8)

# Heading 2
h2 = doc.styles['Heading 2']
h2.font.name = 'Calibri'
h2.font.size = Pt(12)
h2.font.bold = True
h2.font.color.rgb = SECONDARY
h2.paragraph_format.space_before = Pt(14)
h2.paragraph_format.space_after = Pt(6)

# Heading 3
h3 = doc.styles['Heading 3']
h3.font.name = 'Calibri'
h3.font.size = Pt(11)
h3.font.bold = True
h3.font.color.rgb = SECONDARY
h3.paragraph_format.space_before = Pt(10)
h3.paragraph_format.space_after = Pt(4)

# === DOCUMENT PROPERTIES ===
doc.core_properties.title = f"{TITLE} v{VERSION}"
doc.core_properties.author = AUTHOR
doc.core_properties.keywords = "REACH; CLP; ECHA; Phoenix Metals; chemische stoffen; registratie; SVHC; autorisatie"
doc.core_properties.category = "HSEQ Intelligence"
doc.core_properties.subject = "Kennisdossier REACH-verordening voor Phoenix Metals"

# === HELPER FUNCTIONS ===

def add_header_footer(section):
    """Add logo in header and project info in footer."""
    # Header
    header = section.header
    header.is_linked_to_previous = False
    hp = header.paragraphs[0]
    hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    
    if os.path.exists(LOGO_PATH):
        run = hp.add_run()
        # 2.0cm x 1.8cm
        run.add_picture(LOGO_PATH, width=Cm(2.0), height=Cm(1.8))
    
    # Add header border
    header_pPr = hp._p.get_or_add_pPr()
    pBdr = parse_xml(
        f'<w:pBdr {nsdecls("w")}>'
        f'<w:bottom w:val="single" w:sz="4" w:space="1" w:color="003366"/>'
        f'</w:pBdr>'
    )
    header_pPr.append(pBdr)
    
    # Footer
    footer = section.footer
    footer.is_linked_to_previous = False
    fp = footer.paragraphs[0]
    fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = fp.add_run(f"{PROJECT_CODE} | v{VERSION} | JvG Consultancy | {DATE_STR}")
    run.font.size = Pt(8)
    run.font.color.rgb = WHITE
    run.font.name = 'Calibri'
    
    # Footer background
    footer_pPr = fp._p.get_or_add_pPr()
    shd = parse_xml(f'<w:shd {nsdecls("w")} w:fill="374151" w:val="clear"/>')
    footer_pPr.append(shd)
    
    # Add page number field
    fp2 = footer.add_paragraph()
    fp2.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run2 = fp2.add_run("Pagina ")
    run2.font.size = Pt(8)
    run2.font.color.rgb = WHITE
    fldChar1 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="begin"/>')
    run2._r.append(fldChar1)
    run3 = fp2.add_run()
    run3.font.size = Pt(8)
    run3.font.color.rgb = WHITE
    instrText = parse_xml(f'<w:instrText {nsdecls("w")} xml:space="preserve"> PAGE </w:instrText>')
    run3._r.append(instrText)
    fldChar2 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="end"/>')
    run3._r.append(fldChar2)

def add_styled_table(doc, headers, rows, col_widths=None):
    """Add a table with 'Light Grid Accent 1' style."""
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    table.style = 'Light Grid Accent 1'
    
    # Headers
    for i, header in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = header
        for paragraph in cell.paragraphs:
            for run in paragraph.runs:
                run.font.bold = True
                run.font.size = Pt(10)
                run.font.color.rgb = WHITE
        # Header shading
        shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="003366" w:val="clear"/>')
        cell._tc.get_or_add_tcPr().append(shading)
    
    # Data rows
    for r_idx, row_data in enumerate(rows):
        for c_idx, cell_text in enumerate(row_data):
            cell = table.rows[r_idx + 1].cells[c_idx]
            cell.text = str(cell_text)
            for paragraph in cell.paragraphs:
                for run in paragraph.runs:
                    run.font.size = Pt(10)
            # Alternating row colors
            if r_idx % 2 == 0:
                shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="F8F9FA" w:val="clear"/>')
                cell._tc.get_or_add_tcPr().append(shading)
    
    if col_widths:
        for i, width in enumerate(col_widths):
            for row in table.rows:
                row.cells[i].width = Cm(width)
    
    doc.add_paragraph()
    return table

def add_bullet(doc, text, level=0):
    """Add a bullet point."""
    p = doc.add_paragraph(text, style='List Bullet')
    p.paragraph_format.left_indent = Cm(1.27 + level * 0.63)
    return p

def add_page_break(doc):
    doc.add_page_break()

# === APPLY HEADER/FOOTER ===
for section in doc.sections:
    section.top_margin = Cm(2.0)
    section.bottom_margin = Cm(2.0)
    section.left_margin = Cm(2.5)
    section.right_margin = Cm(2.5)
    add_header_footer(section)

# ============================================================
# CHAPTER 1: VOORBLAD
# ============================================================
for _ in range(6):
    doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("REACH KENNISDOSSIER")
run.font.size = Pt(28)
run.font.bold = True
run.font.color.rgb = PRIMARY
run.font.name = 'Calibri'

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Registratie, Evaluatie, Autorisatie en Restrictie\nvan Chemische Stoffen")
run.font.size = Pt(14)
run.font.color.rgb = SECONDARY
run.font.name = 'Calibri'

doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Opgesteld in opdracht van Phoenix Metals IJmuiden")
run.font.size = Pt(12)
run.font.color.rgb = TEXT_DARK

doc.add_paragraph()
doc.add_paragraph()

# Info box
info_lines = [
    f"Projectcode: {PROJECT_CODE}",
    f"Versie: {VERSION}",
    f"Datum: {DATE_STR}",
    f"Auteur: {AUTHOR}",
    "Classificatie: Vertrouwelijk"
]
for line in info_lines:
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run(line)
    run.font.size = Pt(11)
    run.font.color.rgb = SECONDARY

add_page_break(doc)

# ============================================================
# CHAPTER 2: INHOUDSOPGAVE
# ============================================================
doc.add_heading("Inhoudsopgave", level=1)

toc_items = [
    ("1", "Management Samenvatting"),
    ("2", "Methodiek"),
    ("3", "Wat is REACH?"),
    ("4", "Registratie"),
    ("5", "Stoffenidentificatie & Classificatie"),
    ("6", "SVHC & Kandidaatlijst"),
    ("7", "Evaluatie"),
    ("8", "Autorisatie"),
    ("9", "Restrictie"),
    ("10", "Veiligheidsinformatiebladen (SDS)"),
    ("11", "Data-deling & Consortiums"),
    ("12", "SCIP Database"),
    ("13", "UK REACH"),
    ("14", "Phoenix Metals Case Study"),
    ("15", "Tonnage Scenario's Phoenix Metals"),
    ("16", "Chemicaliënregister Phoenix Metals"),
    ("17", "Actuele Ontwikkelingen 2025"),
    ("18", "Bronnenlijst"),
]
for num, title in toc_items:
    p = doc.add_paragraph()
    run = p.add_run(f"{num}.  {title}")
    run.font.size = Pt(11)

add_page_break(doc)

# ============================================================
# CHAPTER 3: MANAGEMENT SAMENVATTING
# ============================================================
doc.add_heading("1. Management Samenvatting", level=1)

doc.add_paragraph(
    "De REACH-verordening (Verordening (EG) nr. 1907/2006) is het fundamentele kader voor de registratie, "
    "evaluatie, autorisatie en restrictie van chemische stoffen binnen de Europese Unie. Sinds de inwerkingtreding "
    "op 1 juni 2007 heeft REACH de verantwoordelijkheid voor het aantonen van veiligheid van chemische stoffen "
    "verschoven van de overheid naar de industrie."
)

doc.add_paragraph(
    "Dit kennisdossier is opgesteld in het kader van het REACH-compliance traject voor Phoenix Metals IJmuiden, "
    "een bedrijf dat vanadium-elektrolyten produceert uit staalslakken voor batterijopslag. Het dossier biedt "
    "een uitgebreid overzicht van de REACH-verordening, de bijbehorende CLP-verordening, en de specifieke "
    "verplichtingen die gelden voor Phoenix Metals bij opschaling van productie."
)

doc.add_heading("Kernverplichtingen", level=2)
add_bullet(doc, "Registratie verplicht bij ≥ 1 ton/jaar productie of import van een stof")
add_bullet(doc, "Veiligheidsinformatiebladen (SDS) verplicht voor gevaarlijke stoffen en mengsels")
add_bullet(doc, "Communicatieplicht bij aanwezigheid van SVHC-stoffen (> 0,1% gewichtspercentage)")
add_bullet(doc, "SCIP-notificatie voor artikelen die SVHC-stoffen bevatten")
add_bullet(doc, "Autorisatie vereist voor stoffen op Bijlage XIV")
add_bullet(doc, "Restricties uit Bijlage XVII zijn onvoorwaardelijk van toepassing")

doc.add_heading("Key Takeaways voor Phoenix Metals", level=2)
add_bullet(doc, "Pilot-fase (< 1 ton/jaar): Geen registratieplicht, maar SDS- en CLP-verplichtingen blijven gelden")
add_bullet(doc, "Demonstrator (1-10 ton/jaar): Volledige REACH-registratie vereist; inschakelen consortium aanbevolen")
add_bullet(doc, "Commercieel (> 10 ton/jaar): Uitgebreid dossier met CSR, blootstellingsscenario's en hogere registratiekosten")
add_bullet(doc, "Budgetindicatie registratie: €120.000 – €290.000 voor volledig traject")
add_bullet(doc, "Doorlooptijd: 12-15 maanden van inventarisatie tot volledige compliance")

add_page_break(doc)

# ============================================================
# CHAPTER 4: METHODEK
# ============================================================
doc.add_heading("2. Methodiek", level=1)

doc.add_paragraph(
    "Dit kennisdossier is samengesteld op basis van een gestructureerde bronnenanalyse, verdeeld over drie "
    "informatietiers conform de JvG Consultancy intelligence-methodologie."
)

doc.add_heading("Tier 1 — Interne Procedures & Primaire Bronnen", level=2)
add_bullet(doc, "REACH Basisdocument — Interne synthese van REACH/CLP-kaders (JvG Consultancy)")
add_bullet(doc, "Basisgids Chemische Veiligheid: CLP — Didactische gids voor CLP-conformiteit")
add_bullet(doc, "REACH Registratie [Phoenix Metals] — Projectaanpak en compliance-roadmap")

doc.add_heading("Tier 2 — Wettelijke Kaders & ECHA Richtsnoeren", level=2)
add_bullet(doc, "ECHA Richtsnoer voor Registratie v4.0 (augustus 2021)")
add_bullet(doc, "ECHA Guidance: SVHC Annex XV dossiers v2.1 (oktober 2018)")
add_bullet(doc, "ECHA Richtsnoer SDS v4.0 (december 2020)")
add_bullet(doc, "ECHA Richtsnoer Stoffenidentificatie v3.0 (december 2023)")
add_bullet(doc, "ECHA Richtsnoer Data-deling v4.1 (december 2023)")
add_bullet(doc, "ECHA Wegwijzer Blootstellingsscenario's v2 (mei 2016)")
add_bullet(doc, "ECHA Guidance: Autorisatie-aanvraag (februari 2021)")
add_bullet(doc, "ECHA Guidance: CLP Labelling v4.2 (maart 2021)")
add_bullet(doc, "ECHA Practical Guide: SIP-ontwikkeling (april 2018)")

doc.add_heading("Tier 3 — Operationele Data & Marktanalyse", level=2)
add_bullet(doc, "Phoenix Metals Chemical Master Data — Excel-registratie (v2.1.0, december 2024)")
add_bullet(doc, "ECHA MKB-gids: Veiligheid van chemische stoffen (2015)")
add_bullet(doc, "ECHA SCIP Practical Guide")

doc.add_heading("Zoekstrategie", level=2)
doc.add_paragraph(
    "De bronnen zijn geselecteerd op relevantie voor de REACH-compliance van een MKB-metaalverwerkende onderneming "
    "met chemische processtappen. Prioriteit is gegeven aan Nederlandstalige ECHA-richtsnoeren en interne "
    "projectdocumentatie. Alle PDF-bronnen zijn geraadpleegd via tekstextractie; key-informatie is samengevat "
    "per thema in de betreffende hoofdstukken."
)

add_page_break(doc)

# ============================================================
# CHAPTER 5: WAT IS REACH?
# ============================================================
doc.add_heading("3. Wat is REACH?", level=1)

doc.add_heading("3.1 Inleiding", level=2)
doc.add_paragraph(
    "REACH is de afkorting voor Registration, Evaluation, Authorisation and Restriction of Chemicals. "
    "De verordening (EG) nr. 1907/2006 trad in werking op 1 juni 2007 en heeft als hoofddoel een hoog "
    "beschermingsniveau te waarborgen voor de menselijke gezondheid en het milieu, tegelijkertijd met het "
    "waarborgen van het vrije verkeer van chemische stoffen op de interne markt."
)

doc.add_heading("3.2 Doelstellingen", level=2)
add_bullet(doc, "Verantwoordelijkheid voor veiligheid bij de industrie leggen ('no data, no market')")
add_bullet(doc, "Verbeterde kennis over eigenschappen en risico's van chemische stoffen")
add_bullet(doc, "Bevordering van alternatieve methoden voor risicobeoordeling (bijv. in vitro testen)")
add_bullet(doc, "Verminderde dierproeven door gedeeld gebruik van gegevens")
add_bullet(doc, "Vrije circulatie van stoffen op de interne markt")

doc.add_heading("3.3 Scope", level=2)
doc.add_paragraph(
    "REACH is van toepassing op alle chemische stoffen, ongeacht of deze als zodanig, in mengsels of in "
    "artikelen op de markt worden gebracht. Uitgezonderd zijn radioactieve stoffen, stoffen onder douane- "
    "toezicht, afvalstoffen en bepaalde stoffen die onder andere specifieke wetgeving vallen (bijv. "
    "geneesmiddelen, levensmiddelenadditieven)."
)

doc.add_heading("3.4 Wie valt eronder?", level=2)
doc.add_paragraph(
    "REACH onderscheidt verschillende rollen in de toeleveringsketen:"
)

add_styled_table(doc,
    ["Rol", "Afkorting", "Definitie"],
    [
        ["Fabrikant", "MF", "Stoffen produceren binnen de EER"],
        ["Importeur", "IM", "Stoffen uit derde landen invoeren"],
        ["Alleenstandaard", "SDU", "Stoffen vervaardigen of invoeren voor eigen gebruik (art. 5)"],
        ["Downstreamgebruiker", "DU", "Stoffen of mengsels gebruiken in beroepsmatige context (art. 3)"],
        ["Distributeur", "DI", "Stoffen of mengsels leveren aan derden"],
        ["Enige Vertegenwoordiger", "OR", "Niet-EU fabrikant vertegenwoordigen in de EER (art. 8)"],
    ]
)

doc.add_heading("3.5 European Chemicals Agency (ECHA)", level=2)
doc.add_paragraph(
    "ECHA (European Chemicals Agency), gevestigd in Helsinki, Finland, is de centrale uitvoeringsinstantie "
    "van REACH. ECHA beheert de REACH-IT portal, de SCIP-database, de C&L Inventory en voert de "
    "evaluatie-, autorisatie- en restrictieprocedures uit. Daarnaast is ECHA verantwoordelijk voor de "
    "uitvoering van de CLP-verordening, de Biocidenverordening (BPR) en de PIC-verordening."
)

doc.add_heading("3.6 CLP — Classificatie, Etikettering en Verpakking", level=2)
doc.add_paragraph(
    "De CLP-verordening (EG nr. 1272/2008) is het complementaire kader aan REACH. CLP harmoniseert de "
    "classificatie, etikettering en verpakking van stoffen en mengsels binnen de EU, in lijn met het "
    "mondiale GHS-systeem (Globally Harmonized System) van de Verenigde Naties. CLP trad in werking op "
    "20 januari 2009 en verving de oude Dangerous Substances Directive (DSD) en Dangerous Preparations "
    "Directive (DPD)."
)
add_bullet(doc, "Classificatie: Indeling op basis van intrinsieke gevaarseigenschappen (fysicochemisch, gezondheid, milieu)")
add_bullet(doc, "Etikettering: Geharmoniseerde pictogrammen, signaalwoorden, H- en P-zinnen")
add_bullet(doc, "Verpakking: Technische standaarden voor kinderveilige sluitingen (CRF) en tastbare gevarenaanduidingen (TWD)")

add_page_break(doc)

# ============================================================
# CHAPTER 6: REGISTRATIE
# ============================================================
doc.add_heading("4. Registratie", level=1)

doc.add_heading("4.1 Wanneer is registratie verplicht?", level=2)
doc.add_paragraph(
    "Registratie bij ECHA is verplicht voor fabrikanten en importeurs die stoffen produceren of invoeren "
    "in hoeveelheden van 1 ton of meer per jaar. Stoffen die reeds voor 1 juni 2007 op de markt waren "
    "(zgn. 'existing substances' of 'phase-in substances') konden gebruikmaken van overgangsregelingen. "
    "De laatste registratiedeadline voor fase-in stoffen was 31 mei 2018."
)

doc.add_heading("4.2 Tonnagebands en informatie-eisen", level=2)
doc.add_paragraph(
    "De omvang van het vereiste registratiedossier is afhankelijk van de jaarlijkse tonnage:"
)

add_styled_table(doc,
    ["Tonnageband", "Informatie-eisen", "Typische kostenindicatie"],
    [
        ["1 – 10 ton/jaar", "Bijlage VII (standaardinformatie) + Bijlage VIII", "€5.000 – €15.000"],
        ["10 – 100 ton/jaar", "Bijlage VII + VIII + IX (toxicologisch)", "€15.000 – €50.000"],
        ["100 – 1.000 ton/jaar", "Bijlage VII + VIII + IX + X (eco-toxicologisch)", "€50.000 – €150.000"],
        ["> 1.000 ton/jaar", "Volledig dossier + CSR (Chemical Safety Report)", "€150.000 – €500.000+"],
    ]
)

doc.add_heading("4.3 Registratieproces — Stappenplan", level=2)

doc.add_heading("Stap 1: Voorbereiding en inventarisatie", level=3)
add_bullet(doc, "Identificeer alle stoffen in het productieproces (inclusief tussenproducten en residuen)")
add_bullet(doc, "Bepaal de jaarlijkse tonnage per stof (productie + import)")
add_bullet(doc, "Verifieer of de stof reeds geregistreerd is via ECHA's zoekfunctie")
add_bullet(doc, "Controleer op uitzonderingen (Bijlage IV, V, VI)")

doc.add_heading("Stap 2: Data-verzameling", level=3)
add_bullet(doc, "Verzamel fysisch-chemische, toxicologische en eco-toxicologische gegevens")
add_bullet(doc, "Sluit aan bij een SIEF (Substance Information Exchange Forum)")
add_bullet(doc, "Verkrijg een Letter of Access (LoA) van het lead registrant consortium")
add_bullet(doc, "Identificeer en plan ontbrekende testen")

doc.add_heading("Stap 3: Dossieropstelling", level=3)
add_bullet(doc, "Stel het technische dossier op in IUCLID 6")
add_bullet(doc, "Voor ≥ 10 ton/jaar: voeg een Chemical Safety Report (CSR) toe")
add_bullet(doc, "Ontwikkel blootstellingsscenario's voor alle geïdentificeerde gebruikstoepassingen")
add_bullet(doc, "Definieer risicobeheersmaatregelen (RMM)")

doc.add_heading("Stap 4: Indiening", level=3)
add_bullet(doc, "Maak een REACH-IT account aan")
add_bullet(doc, "Dien het dossier in via REACH-IT (joint submission of individueel)")
add_bullet(doc, "Betaal de registratievergoeding")
add_bullet(doc, "Ontvang het registratienummer en bevestiging")

doc.add_heading("4.4 ECHA-IT en IUCLID", level=2)
doc.add_paragraph(
    "REACH-IT is de online portal van ECHA voor indiening van registratie-, notificatie- en autorisatiedossiers. "
    "IUCLID 6 is de verplichte software voor het opstellen van technische dossiers. IUCLID ondersteunt "
    "het gestructureerd vastleggen van stofidentiteit, fysisch-chemische gegevens, toxicologische profielen, "
    "eco-toxicologische data en blootstellingsscenario's."
)

doc.add_heading("4.5 Gezamenlijke indiening (Joint Submission)", level=2)
doc.add_paragraph(
    "Het OSOR-principe (One Substance, One Registration) verplicht fabrikanten en importeurs van dezelfde "
    "stof om gezamenlijk een registratie in te dienen. Het Stofidentiteitsprofiel (SIP) is hierbij het "
    "centrale instrument dat de grenzen van de stofidentiteit definieert. De gezamenlijke indiening omvat "
    "gedeelde data (lead registrant) en bedrijfsspecifieke informatie (co-registranten)."
)

doc.add_heading("4.6 Uitzonderingen op registratie", level=2)
add_bullet(doc, "Bijlage IV: Stoffen die een minimaal risico vormen (bijv. water, argon)")
add_bullet(doc, "Bijlage V: Stoffen in de natuur voorkomende die niet gewijzigd zijn")
add_bullet(doc, "Bijlage VI: Onderzoek en ontwikkeling (PPORD), < 1 ton/jaar")
add_bullet(doc, "Polymeren: De monomeren moeten geregistreerd zijn, niet het polymeer zelf")
add_bullet(doc, "Stoffen in artikelen: Alleen als de stof > 1 ton/jaar wordt vrijgegeven")

add_page_break(doc)

# ============================================================
# CHAPTER 7: STOFFENIDENTIFICATIE & CLASSIFICATIE
# ============================================================
doc.add_heading("5. Stoffenidentificatie & Classificatie", level=1)

doc.add_heading("5.1 Unieke identificatie", level=2)
doc.add_paragraph(
    "Ondubbelzinnige stofidentificatie is een randvoorwaarde voor geldige REACH-registratie. Elke stof "
    "wordt geïdentificeerd aan de hand van:"
)
add_bullet(doc, "CAS-nummer (Chemical Abstracts Service) — unieke numerieke aanduiding")
add_bullet(doc, "EG-nummer (EINECS/ELINCS) — Europees identificatienummer")
add_bullet(doc, "IUPAC-naam — systematische chemische naamgeving")
add_bullet(doc, "Molecuulformule en structuur")
add_bullet(doc, "Fysisch-chemische parameters (smeltpunt, kookpunt, dichtheid, oplosbaarheid)")

doc.add_heading("5.2 Samenstellingstypen", level=2)
add_styled_table(doc,
    ["Type", "Samenstelling", "Naamgeving"],
    [
        ["Mono-constituent", "Hoofdbestanddeel ≥ 80%", "Genoemd naar hoofdbestanddeel"],
        ["Multi-constituent", "Meerdere bestanddelen 10-80%", "\"Reactiemassa van [bestanddelen]\""],
        ["UVCB", "Onbekende/variabele samenstelling", "Beschrijving van bron/proces"],
    ]
)

doc.add_paragraph(
    "Onzuiverheden ≥ 1% moeten worden gespecificeerd, of lager indien relevant voor classificatie "
    "of PBT-beoordeling. Additieven voor stabilisatie worden meegerekend in de massabalans."
)

doc.add_heading("5.3 CLP Classificatie", level=2)
doc.add_paragraph(
    "De CLP-verordening hanteert drie hoofdcategorieën gevaarsklassen:"
)
add_bullet(doc, "Fysicochemische gevaren: Ontvlambaar, oxiderend, explosief, gassen onder druk, corrosief aan metalen")
add_bullet(doc, "Gezondheidsgevaren: Acute toxiciteit, huidirritatie, oogbeschadiging, sensibilisatie, mutageniciteit, carcinogeniteit, reproductietoxiciteit, STOT)")
add_bullet(doc, "Milieugevaren: Aquatische toxiciteit, persistentie, bioaccumulatie")

doc.add_heading("5.4 H-zinnen en P-zinnen", level=2)
doc.add_paragraph(
    "H-zinnen (Hazard statements) beschrijven de aard van het gevaar. Voorbeelden:"
)
add_styled_table(doc,
    ["Code", "Tekst", "Categorie"],
    [
        ["H314", "Veroorzaakt ernstige brandwonden en oogbeschadiging", "Huidcorrosie"],
        ["H290", "Kan corrosief zijn voor metalen", "Metaalcorrosie"],
        ["H311", "Giftig bij huidcontact", "Acute toxiciteit cat. 3"],
        ["H351", "Vermoedelijk kankerverwekkend", "Carcinogeniciteit cat. 2"],
        ["H410", "Zeer giftig voor in het water levende organismen", "Aquatische toxiciteit cat. 1"],
    ]
)

doc.add_paragraph(
    "P-zinnen (Precautionary statements) beschrijven voorzorgsmaatregelen. Voorbeelden: P280 (beschermende "
    "handschoenen/beschermende kleding/oogbescherming dragen), P305+P351+P338 (BIJ CONTACT MET DE OGEN: "
    "voorzichtig afspoelen met water)."
)

doc.add_heading("5.5 GHS Pictogrammen", level=2)
doc.add_paragraph(
    "De CLP-verordening gebruikt negen standaard GHS-pictogrammen (rood-omrande ruiten met witte achtergrond): "
    "vlam, vlam over cirkel, exploderende bom, corrosie, gasfles, schedel en gekruiste beenderen, uitroepteken, "
    "gezondheid, en milieu. Elk pictogram correspondeert met specifieke gevaarsklassen."
)

doc.add_heading("5.6 UFI — Unique Formula Identifier", level=2)
doc.add_paragraph(
    "Conform Bijlage VIII van CLP moeten importeurs en downstreamgebruikers van gevaarlijke mengsels een "
    "melding doen bij de Poison Centres (PCN). De UFI is een 16-cijferige alfanumerieke code die op het "
    "etiket wordt aangebracht. Vanaf januari 2025 is een intensieve handhavingsperiode van zes maanden "
    "gestart gericht op PCN/UFI-conformiteit."
)

add_page_break(doc)

# ============================================================
# CHAPTER 8: SVHC & KANDIDAATLIJST
# ============================================================
doc.add_heading("6. SVHC & Kandidaatlijst", level=1)

doc.add_heading("6.1 Wat zijn SVHC's?", level=2)
doc.add_paragraph(
    "Substances of Very High Concern (SVHC) zijn stoffen die mogelijk ernstige en onomkeerbare effecten "
    "hebben op de menselijke gezondheid of het milieu. SVHC's worden genomineerd door lidstaten of ECHA "
    "en opgenomen op de Kandidaatlijst (artikel 57 REACH). Een stof kwalificeert als SVHC bij een van de "
    "volgende criteria:"
)
add_bullet(doc, "CMR categorie 1A of 1B: Kankerverwekkend, mutageen of toxisch voor de voortplanting")
add_bullet(doc, "PBT: Persistent, Bioaccumulatief en Toxisch")
add_bullet(doc, "vPvB: Zeer Persistent en Zeer Bioaccumulatief")
add_bullet(doc, "Stoffen met equivalente bezorgdheid (bijv. endocriene disruptors)")

doc.add_heading("6.2 De Kandidaatlijst", level=2)
doc.add_paragraph(
    "De Kandidaatlijst wordt regelmatig bijgewerkt door ECHA. Per begin 2025 bevat de lijst meer dan 240 "
    "stoffen. De lijst is publiek toegankelijk via de ECHA-website en dient als vroege waarschuwing voor "
    "toekomstige autorisatie- en restrictiemaatregelen. Vanadiumverbindingen staan niet op de Kandidaatlijst, "
    "maar zijn wel onderwerp van monitoring door ECHA."
)

doc.add_heading("6.3 Communicatieplicht (Artikel 33)", level=2)
doc.add_paragraph(
    "Leveranciers van artikelen die een SVHC bevatten in een concentratie > 0,1% gewichtspercentage zijn "
    "verplicht de ontvanger hiervan in kennis te stellen. Deze informatie stelt de ontvanger in staat om "
    "het gebruik van de stof veilig te beheren en, indien relevant, consumenten te informeren."
)

doc.add_heading("6.4 Notificatieplicht (Artikel 7(2))", level=2)
doc.add_paragraph(
    "Fabrikanten en importeurs van artikelen moeten een notificatie bij ECHA indienen indien:"
)
add_bullet(doc, "De stof op de Kandidaatlijst staat")
add_bullet(doc, "De stof aanwezig is in een concentratie > 0,1% gewichtspercentage")
add_bullet(doc, "De stof in totaal > 1 ton/jaar in de artikelen aanwezig is")
add_bullet(doc, "De blootstelling van mens of milieu niet kan worden uitgesloten")

doc.add_heading("6.5 Overgang naar Autorisatie", level=2)
doc.add_paragraph(
    "Stoffen op de Kandidaatlijst kunnen worden opgenomen in Bijlage XIV (Lijst van stoffen die aan "
    "autorisatie zijn onderworpen). Na de 'sunset date' mag de stof niet meer gebruikt worden zonder "
    "geldige autorisatie."
)

add_page_break(doc)

# ============================================================
# CHAPTER 9: EVALUATIE
# ============================================================
doc.add_heading("7. Evaluatie", level=1)

doc.add_heading("7.1 Doel van evaluatie", level=2)
doc.add_paragraph(
    "Evaluatie is het proces waarbij ECHA en de lidstaten de kwaliteit van registratiedossiers beoordelen "
    "en de noodzaak van verdere testen of risicobeheersing vaststellen. Evaluatie bestaat uit twee componenten:"
)

doc.add_heading("7.2 Dossierbeoordeling (Compliance Check)", level=2)
doc.add_paragraph(
    "Bij elke registratie voert ECHA een minimale controle uit (minimum 5% van de dossiers per tonnageband). "
    "Een compliance check toetst of het dossier voldoet aan de informatie-eisen van de desbetreffende "
    "bijlagen (VII-XI). Bij tekortkomingen kan ECHA een besluit tot verdere informatie (DCR) opleggen "
    "met een uiterste termijn voor indiening."
)

doc.add_heading("7.3 Stoffenevaluatie", level=2)
doc.add_paragraph(
    "Lidstaten selecteren stoffen voor verdere evaluatie op basis van risico-indicatoren: hoge tonnage, "
    "CMR-eigenschappen, PBT/vPvB-profiel, brede verspreiding of blootstelling van consumenten en werknemers. "
    "Het doel is vaststellen of de stof aanleiding geeft tot zorg voor de menselijke gezondheid of het milieu. "
    "De lidstaat stelt een evaluatiebesluit op met mogelijke aanvullende informatie-eisen."
)

doc.add_heading("7.4 Prioritaire stoffen", level=2)
doc.add_paragraph(
    "ECHA publiceert jaarlijks een communautair rollend actieplan (CoRAP) met stoffen die in de komende "
    "drie jaar door lidstaten worden geëvalueerd. Dit plan is publiek toegankelijk en geeft bedrijven "
    "de mogelijkheid om zich voor te bereiden op eventuele informatie-eisen."
)

add_page_break(doc)

# ============================================================
# CHAPTER 8: AUTORISATIE
# ============================================================
doc.add_heading("8. Autorisatie", level=1)

doc.add_heading("8.1 Bijlage XIV — Lijst van stoffen onder autorisatie", level=2)
doc.add_paragraph(
    "Bijlage XIV bevat stoffen die als SVHC zijn geïdentificeerd en waarvoor het gebruik op de EU-markt "
    "aan een autorisatievereiste is onderworpen. Na de 'sunset date' (de datum vanaf wanneer autorisatie "
    "verplicht is) mag de stof niet meer worden gebruikt of op de markt gebracht zonder een geldige "
    "autorisatie van de Europese Commissie."
)

doc.add_heading("8.2 Aanvraagproces", level=2)
doc.add_paragraph("Een autorisatieaanvraag omvat de volgende elementen:")
add_bullet(doc, "Identificatie van de aanvrager en de stof")
add_bullet(doc, "Beschrijving van het gebruik (use descriptor)")
add_bullet(doc, "Chemical Safety Report (CSR) met risicobeoordeling")
add_bullet(doc, "Analyse van alternatieven — demonstratie dat risico's adequaat worden beheerst")
add_bullet(doc, "Substitutieplan — indien geschikte alternatieven beschikbaar zijn")
add_bullet(doc, "Sociaaleconomische analyse (SEA) — facultatief maar vaak noodzakelijk")

doc.add_heading("8.3 Kosten en doorlooptijd", level=2)
doc.add_paragraph(
    "Autorisatieaanvragen zijn complex en kostenintensief. Gemiddelde kosten bedragen €100.000 – €500.000 "
    "per aanvraag, afhankelijk van de stof, het aantal gebruikstoepassingen en de benodigde testen. "
    "De doorlooptijd bedraagt circa 12-18 maanden van indiening tot besluit."
)

doc.add_heading("8.4 Sunset dates en overgangsperiodes", level=2)
doc.add_paragraph(
    "Elke stof op Bijlage XIV krijgt een 'latest application date' (LAD) en een 'sunset date'. Tussen "
    "deze datums kunnen aanvragers een autorisatie indienen. Na de sunset date mag de stof niet meer "
    "worden gebruikt zonder autorisatie. ECHA publiceert een overzicht van alle data's op de website."
)

add_page_break(doc)

# ============================================================
# CHAPTER 9: RESTRICTIE
# ============================================================
doc.add_heading("9. Restrictie", level=1)

doc.add_heading("9.1 Bijlage XVII — Restricties", level=2)
doc.add_paragraph(
    "Bijlage XVII van REACH bevat restricties voor de productie, het op de markt brengen en het gebruik "
    "van bepaalde gevaarlijke stoffen, mengsels en artikelen. Restricties zijn onvoorwaardelijk van "
    "toepassing: elke actor in de toeleveringsketen moet naleven."
)

doc.add_heading("9.2 Voorbeelden van restricties", level=2)
add_styled_table(doc,
    ["Stof/Groep", "Toepassingsgebied", "Kernrestrictie"],
    [
        ["Chroom-6 verbindingen", "Cement, oppervlaktebehandeling", "Verboden in consumentenproducten; limiet in cement"],
        ["Asbest", "Alle toepassingen", "Verboden productie, invoer en gebruik"],
        ["CMR stoffen cat. 1A/1B", "Consumentenproducten", "Verboden in speelgoed, cosmetica, kleding"],
        ["Cadmium", "PVC, batterijen, pigmenten", "Beperkt gebruik; limietwaarden"],
        ["Lood", "Verf, waterleidingen, speelgoed", "Verboden/limiet in diverse toepassingen"],
        ["Nikkel", "In sieraden en textiel", "Vrijgavelimiet 0,5 µg/cm²/week"],
        ["PFAS", "Diverse toepassingen", "Voorgestelde universele restrictie (2025)"],
    ]
)

doc.add_heading("9.3 PFAS — Opkomende restrictie", level=2)
doc.add_paragraph(
    "Perfluoralkyl en polyfluoralkyl stoffen (PFAS) zijn het onderwerp van een voorgestelde universele "
    "restrictie door de vijf lidstaten (Duitsland, Nederland, Noorwegen, Zweden, Denemarken). De "
    "voorgestelde restrictie betrekt meer dan 10.000 PFAS-stoffen. De publieke consultatie is afgerond "
    "en ECHA's Risk Assessment Committee (RAC) en Socio-economic Assessment Committee (SEAC) beoordelen "
    "het voorstel."
)

add_page_break(doc)

# ============================================================
# CHAPTER 10: SDS
# ============================================================
doc.add_heading("10. Veiligheidsinformatiebladen (SDS)", level=1)

doc.add_heading("10.1 Wettelijke basis", level=2)
doc.add_paragraph(
    "Veiligheidsinformatiebladen (Safety Data Sheets, SDS) zijn verplicht voor gevaarlijke stoffen en "
    "mengsels die op de markt worden gebracht (artikel 31 REACH). De SDS moet worden verstrekt aan "
    "professionele gebruikers in de taal van het lidstaat waar de stof wordt geleverd."
)

doc.add_heading("10.2 De 16 secties van een SDS", level=2)
add_styled_table(doc,
    ["Sectie", "Onderwerp"],
    [
        ["1", "Identificatie van de stof/het mengsel en van de vennootschap"],
        ["2", "Mogelijke gevaren"],
        ["3", "Samenstelling en informatie over de bestanddelen"],
        ["4", "Eerste-hulpmaatregelen"],
        ["5", "Brandblusmaatregelen"],
        ["6", "Maatregelen bij ongevallijke vrijgave"],
        ["7", "Veilig omgaan met de stof en veilig opslaan"],
        ["8", "Blootstellingsbeheersing / persoonlijke bescherming"],
        ["9", "Fysische en chemische eigenschappen"],
        ["10", "Stabiliteit en reactiviteit"],
        ["11", "Toxicologische gegevens"],
        ["12", "Ecologische gegevens"],
        ["13", "Berekening van het afvalverwijderingsaspect"],
        ["14", "Vervoersinformatie"],
        ["15", "Wettelijke gegevens"],
        ["16", "Overige informatie"],
    ]
)

doc.add_heading("10.3 Uitgebreide SDS (eSDS)", level=2)
doc.add_paragraph(
    "Wanneer een Chemical Safety Assessment (CSA) is vereist (bij ≥ 10 ton/jaar), moet de SDS worden "
    "uitgebreid met blootstellingsscenario's (exposure scenarios). Een eSDS bevat:"
)
add_bullet(doc, "Gedetailleerde beschrijving van de gebruiksomstandigheden (use descriptor)")
add_bullet(doc, "Blootstellingsschatting voor werknemers, consumenten en milieu")
add_bullet(doc, "Risicobeheersmaatregelen (RMM) — technische, organisatorisch en persoonlijk")
add_bullet(doc, "Taal voor downstreamgebruikers dat direct toepasbaar is in de praktijk")

doc.add_heading("10.4 Blootstellingsscenario's", level=2)
doc.add_paragraph(
    "Een blootstellingsscenario beschrijft de operationele omstandigheden en risicobeheersmaatregelen "
    "die de blootstelling van mens en milieu adequaat beheersen. Voor downstreamgebruikers geldt: "
    "indien de eigen gebruiksomstandigheden niet onder het ontvangen blootstellingsscenario vallen, "
    "moet een afgeleid blootstellingsscenario worden opgesteld of de leverancier worden geïnformeerd "
    "met het verzoek om het blootstellingsscenario uit te breiden."
)

add_page_break(doc)

# ============================================================
# CHAPTER 11: DATA-DELING & CONSORTIUMS
# ============================================================
doc.add_heading("11. Data-deling & Consortiums", level=1)

doc.add_heading("11.1 SIEF — Substance Information Exchange Forum", level=2)
doc.add_paragraph(
    "Een SIEF is een informeel verband van (potentiële) registranten van dezelfde stof. Het doel van een "
    "SIEF is het gezamenlijk verzamelen, beoordelen en delen van studiegegevens die nodig zijn voor "
    "registratie. Deelname aan een SIEF is verplicht voor alle registranten en pre-registranten van "
    "dezelfde stof."
)

doc.add_heading("11.2 Letter of Access (LoA)", level=2)
doc.add_paragraph(
    "Een Letter of Access is een overeenkomst tussen de lead registrant (of consortium) en een co-registrant "
    "waarbij de co-registrant tegen betaling toegang krijgt tot de gezamenlijk ingediende data. De LoA "
    "dekking stemt overeen met de informatie-eisen van de desbetreffende tonnageband."
)

doc.add_heading("11.3 Consortiums", level=2)
doc.add_paragraph(
    "Een consortium is een formeel samenwerkingsverband van bedrijven die dezelfde stof produceren of "
    "importeren. Consortiums bieden voordelen:"
)
add_bullet(doc, "Kostenbesparing door gedeelde studies (toxicologisch, eco-toxicologisch)")
add_bullet(doc, "Toegang tot bestaande registratiegegevens en expertise")
add_bullet(doc, "Coördinatie van de joint submission via een lead registrant")
add_bullet(doc, "Collectieve onderhandeling met testlaboratoria")
add_bullet(doc, "Vermindering van dubbel werk en dierproeven")

doc.add_heading("11.4 Tips voor data-deling", level=2)
add_bullet(doc, "Start vroeg met consortiumonderzoek — wacht niet tot de registratiedeadline")
add_bullet(doc, "Controleer bestaande registraties in ECHA's database voordat u zelf studies initieert")
add_bullet(doc, "Documenteer alle data-deling activiteiten — dit is vereist voor compliance")
add_bullet(doc, "Verken alternatieve methoden (read-across, QSAR) om onnodige dierproeven te vermijden")
add_bullet(doc, "Sluit duidelijke data-deling overeenkomsten (DDA) af met alle betrokken partijen")

add_page_break(doc)

# ============================================================
# CHAPTER 12: SCIP DATABASE
# ============================================================
doc.add_heading("12. SCIP Database", level=1)

doc.add_heading("12.1 Wat is SCIP?", level=2)
doc.add_paragraph(
    "SCIP (Substances of Concern In articles as such or in complex objects (Products)) is de database van "
    "ECHA voor notificaties van SVHC-stoffen in artikelen. SCIP is ingesteld ter uitvoering van de "
    "Afvalstoffenrichtlijn (Richtlijn 2008/98/EG) en heeft als doel het informeren van afvalverwerkers "
    "en consumenten over de aanwezigheid van SVHC's in producten."
)

doc.add_heading("12.2 Wie moet notificeren?", level=2)
add_bullet(doc, "Fabrikanten van artikelen die SVHC-stoffen bevatten (> 0,1% gew.%)")
add_bullet(doc, "Importeurs van artikelen die SVHC-stoffen bevatten (> 0,1% gew.%)")
add_bullet(doc, "Distributeurs en andere leveranciers die artikelen op de EU-markt brengen")

doc.add_heading("12.3 Proces", level=2)
add_bullet(doc, "Identificeer SVHC-stoffen in artikelen via de toeleveringsketen (art. 33 communicatie)")
add_bullet(doc, "Verzamel de benodigde gegevens: stofidentiteit, concentratie, locatie in het artikel")
add_bullet(doc, "Dien de notificatie in via ECHA's SCIP-submissieportaal")
add_bullet(doc, "Werk de notificatie bij bij wijzigingen in samenstelling of productontwerp")

doc.add_heading("12.4 Relatie met Afvalstoffenrichtlijn", level=2)
doc.add_paragraph(
    "SCIP ondersteunt de transitie naar een circulaire economie door afvalverwerkers te informeren over "
    "gevaarlijke stoffen in afvalstromen. Hierdoor kunnen afvalverwerkers gerichte maatregelen nemen "
    "bij de sortering, verwerking en recycling van producten die SVHC-stoffen bevatten."
)

add_page_break(doc)

# ============================================================
# CHAPTER 13: UK REACH
# ============================================================
doc.add_heading("13. UK REACH", level=1)

doc.add_heading("13.1 Post-Brexit verschillen", level=2)
doc.add_paragraph(
    "Na de Brexit (1 januari 2021) is UK REACH van kracht geworden als afzonderlijk reguleringssysteem "
    "in het Verenigd Koninkrijk. UK REACH is gebaseerd op EU REACH maar wordt onafhankelijk beheerd door "
    "de Health and Safety Executive (HSE) en het Department for Environment, Food and Rural Affairs "
    "(Defra)."
)

doc.add_heading("13.2 UK REACH IT", level=2)
doc.add_paragraph(
    "Registraties moeten worden ingediend via UK REACH IT (https://ukreach.hse.gov.uk/), de Britse "
    "tegenhanger van REACH-IT. EU-registraties worden niet automatisch overgedragen."
)

doc.add_heading("13.3 Transitional arrangements", level=2)
add_bullet(doc, "GB-based holders of EU REACH registrations konden een 'grandfathered' UK REACH registratie aanvragen (deadline: 27 oktober 2023)")
add_bullet(doc, "Voor stoffen met een EU-registratie > 1 ton/jaar was een transitional registration vereist")
add_bullet(doc, "De HSE kan Scarborough Levels (toetsingsniveaus) opleggen die afwijken van EU-eisen")
add_bullet(doc, "Nieuwe stoffen die alleen in het VK op de markt worden gebracht moeten volledig worden geregistreerd onder UK REACH")

doc.add_heading("13.4 Implicaties voor Phoenix Metals", level=2)
doc.add_paragraph(
    "Indien Phoenix Metals vanadium-elektrolyten exporteert naar het VK, is een afzonderlijke UK REACH "
    "registratie vereist. Dit brengt extra kosten en administratieve lasten met zich mee. Het is aanbevolen "
    "om de VK-markt in de strategische planning op te nemen."
)

add_page_break(doc)

# ============================================================
# CHAPTER 14: PHOENIX METALS CASE STUDY
# ============================================================
doc.add_heading("14. Phoenix Metals Case Study", level=1)

doc.add_heading("14.1 Bedrijfsprofiel", level=2)
doc.add_paragraph(
    "Phoenix Metals IJmuiden is een innovatief metaalverwerkend bedrijf dat vanadium-elektrolyten "
    "produceert uit staalslakken, bestemd voor batterijopslag (vanadium redox flow batterijen, VRFB). "
    "Het productieproces omvat chemische extractie- en zuiveringsstappen waarbij diverse gevaarlijke "
    "stoffen worden gebruikt."
)

doc.add_heading("14.2 Procesoverzicht", level=2)
doc.add_paragraph(
    "Het productieproces omvat de volgende chemische stoffen als input:"
)
add_bullet(doc, "Natriumhydroxide (NaOH) 50% — voor pH-regeling en neerslag")
add_bullet(doc, "Zwavelzuur (H₂SO₄) 75%, 50% en 25% — voor oplossen en zuivering")
add_bullet(doc, "Aluminiumsulfaat (Al-sulfaat) — als coagulatiemiddel")
add_bullet(doc, "Calciumoxide (CaO) — voor pH-buffering")

doc.add_heading("14.3 Huidige status", level=2)
doc.add_paragraph(
    "Phoenix Metals bevindt zich in de pilot-fase. De huidige chemische voorraad omvat de bovengenoemde "
    "stoffen in laboratoriumschaal volumes (< 1 ton per stof per jaar). Alle stoffen zijn aangekocht bij "
    "Carl Roth en zijn voorzien van een Veiligheidsinformatieblad (SDS). Geen van de stoffen staat op de "
    "SVHC-kandidaatlijst."
)

doc.add_heading("14.4 Stappenplan REACH-compliance", level=2)

doc.add_heading("Fase 1: Voorbereiding (Maand 1-2)", level=3)
add_bullet(doc, "Volledige stoffeninventarisatie afronden")
add_bullet(doc, "Productievolumes per stof per jaar bepalen")
add_bullet(doc, "Bestaande ECHA-registraties verifiëren")
add_bullet(doc, "Onderzoek naar consortiumlidmaatschap (Vanadium REACH Consortium)")

doc.add_heading("Fase 2: Gegevensverzameling (Maand 3-6)", level=3)
add_bullet(doc, "Consortiumlidmaatschap afronden")
add_bullet(doc, "Letter of Access verkrijgen voor bestaande studies")
add_bullet(doc, "SIEF-deelname en data-uitwisseling")
add_bullet(doc, "Ontbrekende testen identificeren en plannen")

doc.add_heading("Fase 3: Risicobeoordeling (Maand 7-10)", level=3)
add_bullet(doc, "Chemical Safety Report opstellen")
add_bullet(doc, "Blootstellingsscenario's ontwikkelen")
add_bullet(doc, "Risicokarakterisering uitvoeren")

doc.add_heading("Fase 4: Indiening (Maand 11-12)", level=3)
add_bullet(doc, "Dossier samenstellen in IUCLID 6")
add_bullet(doc, "Kwaliteitscontrole en indiening via REACH-IT")
add_bullet(doc, "Registratienummer verkrijgen")

doc.add_heading("Fase 5: Implementatie (Maand 13-15)", level=3)
add_bullet(doc, "SDS actualiseren")
add_bullet(doc, "Personeel trainen")
add_bullet(doc, "Klantcommunicatie")
add_bullet(doc, "Compliance monitoringsysteem opzetten")

doc.add_heading("14.5 Budgetindicatie", level=2)
add_styled_table(doc,
    ["Post", "Bereik"],
    [
        ["Toxicoloog/consultant", "€50.000 – €80.000"],
        ["Consortiumlidmaatschap", "€15.000 – €40.000"],
        ["ECHA registratiekosten", "€10.000 – €30.000"],
        ["Aanvullende testen", "€20.000 – €100.000"],
        ["Interne kosten (HSE/management)", "€25.000 – €40.000"],
        ["TOTAAL", "€120.000 – €290.000"],
    ]
)

add_page_break(doc)

# ============================================================
# CHAPTER 15: TONNAGE SCENARIO'S
# ============================================================
doc.add_heading("15. Tonnage Scenario's Phoenix Metals", level=1)

doc.add_heading("15.1 Scenario 1: Pilot (< 1 ton/jaar)", level=2)
doc.add_paragraph(
    "In de pilot-fase verwerkt Phoenix Metals staalslakken in laboratoriumschaal. De jaarlijkse consumptie "
    "van elke individuele chemische stof blijft beneden 1 ton."
)
doc.add_heading("Verplichtingen", level=3)
add_bullet(doc, "Geen REACH-registratieplicht (drempel niet overschreden)")
add_bullet(doc, "SDS en CLP-etikettering verplicht voor gevaarlijke stoffen")
add_bullet(doc, "PCN/UFI-melding bij Poison Centres voor mengsels")
add_bullet(doc, "Interne veiligheidsprocedures volgens Arbowet en BRZO (indien van toepassing)")

doc.add_heading("Risico's", level=3)
add_bullet(doc, "Beperkt — lage volumes minimaliseren blootstelling")
add_bullet(doc, "Let op accumulatie: totale voorraad over alle stoffen monitoren")

doc.add_heading("15.2 Scenario 2: Demonstrator (1-10 ton/jaar)", level=2)
doc.add_paragraph(
    "Bij opschaling naar demonstrator-niveau overschrijden één of meer stoffen de 1-ton drempel. "
    "Volledige REACH-registratie is vereist."
)
doc.add_heading("Verplichtingen", level=3)
add_bullet(doc, "REACH-registratie voor alle stoffen ≥ 1 ton/jaar (Bijlage VII + VIII)")
add_bullet(doc, "Deelname aan SIEF en consortium")
add_bullet(doc, "IUCLID 6 dossier opstellen")
add_bullet(doc, "Uitgebreide SDS met blootstellingsscenario's")
add_bullet(doc, "SCIP-notificatie indien van toepassing")

doc.add_heading("Kostenindicatie", level=3)
add_bullet(doc, "Per stof: €5.000 – €15.000 registratiekosten")
add_bullet(doc, "Consortiumlidmaatschap: €15.000 – €40.000")
add_bullet(doc, "Consultancy/advies: €20.000 – €50.000")

doc.add_heading("15.3 Scenario 3: Commercieel (> 10 ton/jaar)", level=2)
doc.add_paragraph(
    "Commerciële productie resulteert in tonnages > 10 ton/jaar per stof. Uitgebreide registratie "
    "met Chemical Safety Report is verplicht."
)
doc.add_heading("Verplichtingen", level=3)
add_bullet(doc, "Volledig registratiedossier (Bijlage VII + VIII + IX + X)")
add_bullet(doc, "Chemical Safety Report (CSR) met blootstellingsscenario's")
add_bullet(doc, "eSDS met gedetailleerde risicobeheersmaatregelen")
add_bullet(doc, "Mogelijkstoffenevaluatie door ECHA")
add_bullet(doc, "Continue monitoring van Kandidaatlijst en Bijlage XIV/XVII wijzigingen")

doc.add_heading("Kostenindicatie", level=3)
add_bullet(doc, "Per stof: €50.000 – €150.000+ registratiekosten")
add_bullet(doc, "Consortiumlidmaatschap: €30.000 – €80.000")
add_bullet(doc, "Toxicoloog/consultant: €50.000 – €80.000")
add_bullet(doc, "Totaal traject: €120.000 – €290.000")

doc.add_heading("15.4 Risico-overzicht per scenario", level=2)
add_styled_table(doc,
    ["Risico", "Pilot", "Demonstrator", "Commercieel"],
    [
        ["Compliance", "Laag", "Medium", "Hoog"],
        ["Financieel", "Minimaal", "Moderaat", "Substantieel"],
        ["Operationeel", "Minimaal", "Medium", "Hoog"],
        ["Reputatie", "Laag", "Medium", "Hoog"],
        ["Tijdig opschalen", "N.v.t.", "12-15 maanden", "18-24 maanden"],
    ]
)

add_page_break(doc)

# ============================================================
# CHAPTER 16: CHEMICALIËNREGISTER
# ============================================================
doc.add_heading("16. Chemicaliënregister Phoenix Metals", level=1)

doc.add_paragraph(
    "Het onderstaande register bevat de chemische stoffen die Phoenix Metals gebruikt in het "
    "pilot-proces, gebaseerd op de interne master data (versie 2.1.0, december 2024)."
)

add_styled_table(doc,
    ["Stof", "CAS-nr.", "ADR-klasse", "PG", "Volume", "Supplier", "SVHC"],
    [
        ["NaOH 50%", "1310-73-2", "8", "II", "100 l", "Carl Roth", "Nee"],
        ["H₂SO₄ 75%", "7664-93-9", "8", "II", "30 l", "Carl Roth", "Nee"],
        ["H₂SO₄ 50%", "7664-93-9", "8", "II", "70 l", "Carl Roth", "Nee"],
        ["H₂SO₄ 25%", "7664-93-9", "8", "II", "100 l", "Carl Roth", "Nee"],
        ["Al-sulfaat", "7784-31-8", "N/A", "N/A", "5 kg", "Carl Roth", "Nee"],
        ["CaO", "1305-78-8", "N/A", "N/A", "10 kg", "Carl Roth", "Nee"],
    ],
    col_widths=[3.0, 2.5, 1.5, 1.0, 1.5, 2.5, 1.5]
)

doc.add_heading("Opmerkingen", level=2)
add_bullet(doc, "Alle stoffen zijn voorzien van MSDS (hardcopy aanwezig)")
add_bullet(doc, "Geen van de stoffen staat op de SVHC-kandidaatlijst (status december 2024)")
add_bullet(doc, "NaOH en H₂SO₄ zijn geclassificeerd als corrosief (ADR-klasse 8)")
add_bullet(doc, "Alle stoffen zijn ingeslagen in het laboratorium (storage racking)")
add_bullet(doc, "Status: In stock (unopened)")

add_page_break(doc)

# ============================================================
# CHAPTER 17: ACTUELE ONTWIKKELINGEN 2025
# ============================================================
doc.add_heading("17. Actuele Ontwikkelingen 2025", level=1)

doc.add_heading("17.1 PCN/UFI Handhaving", level=2)
doc.add_paragraph(
    "Vanaf januari 2025 voeren handhavingsautoriteiten in EU-lidstaten een intensieve inspectieperiode "
    "van zes maanden uit, specifiek gericht op PCN/UFI-conformiteit, de validiteit van etiketten en de "
    "actualiteit van Veiligheidsinformatiebladen. Bedrijven die niet conform zijn riskeren boetes en "
    "markttoegangsbeperkingen."
)

doc.add_heading("17.2 CLP — Nieuwe gevaarsklassen", level=2)
doc.add_paragraph(
    "De herziene CLP-verordening (Delegated Regulation 2023/707) introduceert nieuwe gevaarsklassen "
    "en categorieën, waaronder:"
)
add_bullet(doc, "Endocriene disruptors voor de menselijke gezondheid")
add_bullet(doc, "Endocriene disruptors voor het milieu")
add_bullet(doc, "Persistent, Bioaccumulatief en Toxisch (PBT)")
add_bullet(doc, "Zeer Persistent en Zeer Bioaccumulatief (vPvB)")
add_bullet(doc, "Tijdelijk toxisch (STOT RE) — herziening van bestaande categorieën")

doc.add_heading("17.3 REACH Updates", level=2)
add_bullet(doc, "Verdere uitbreiding van de Kandidaatlijst — focus op PFAS en endocriene disruptors")
add_bullet(doc, "Naar verwachting wordt de PFAS-restrictie (Bijlage XVII) in 2025-2026 definitief")
add_bullet(doc, "ECHA versterkt toezicht op nanovormen en vormspecifieke registraties")
add_bullet(doc, "Herziening van de polymerenuitzondering — mogelijke registratieplicht voor bepaalde polymeren")

doc.add_heading("17.4 ECHA Enforcement", level=2)
doc.add_paragraph(
    "ECHA's Forum for Exchange of Information on Enforcement coördineert gemeenschappelijke handhavingsprojecten "
    "(REF) in alle lidstaten. Recente projecten richten zich op grensoverschrijdende online-verkoop van "
    "gevaarlijke chemische stoffen, correcte etikettering en registratie van nanomaterialen. Bedrijven "
    "worden geadviseerd om proactief compliance te verifiëren."
)

doc.add_heading("17.5 Digitalisering", level=2)
doc.add_paragraph(
    "ECHA werkt aan de verdere digitalisering van de chemische stoffenregelgeving. Onderdeel hiervan is "
    "de ontwikkeling van de 'Chemicals Data Hub', een geïntegreerd platform dat de diverse ECHA-databases "
    "(REACH, CLP, BPR, PIC) samenbrengt. Verwachte lancering: 2025-2026."
)

add_page_break(doc)

# ============================================================
# CHAPTER 18: BRONNENLIJST
# ============================================================
doc.add_heading("18. Bronnenlijst", level=1)

doc.add_heading("Tier 1 — Interne Procedures", level=2)
add_bullet(doc, "REACH Basisdocument — JvG Consultancy, interne synthese van REACH/CLP-kaders")
add_bullet(doc, "Basisgids Chemische Veiligheid: Begrijpen en Werken met CLP — Didactische gids")
add_bullet(doc, "REACH Registratie [Phoenix Metals] — Projectaanpak en compliance-roadmap")

doc.add_heading("Tier 2 — Wettelijke Kaders & ECHA Richtsnoeren", level=2)
add_bullet(doc, "ECHA Richtsnoer voor Registratie, versie 4.0, augustus 2021")
add_bullet(doc, "ECHA Guidance: Preparation of Annex XV SVHC dossiers, versie 2.1, oktober 2018")
add_bullet(doc, "ECHA Richtsnoer voor het samenstellen van veiligheidsinformatiebladen, versie 4.0, december 2020")
add_bullet(doc, "ECHA Richtsnoer voor identificatie en naamgeving van stoffen volgens REACH en CLP, versie 3.0, december 2023")
add_bullet(doc, "ECHA Richtsnoer voor gezamenlijk gebruik van gegevens, versie 4.1, december 2023")
add_bullet(doc, "ECHA Wegwijzer 13: Blootstellingsscenario's voor downstreamgebruikers, versie 2, mei 2016")
add_bullet(doc, "ECHA How to apply for authorisation, februari 2021")
add_bullet(doc, "ECHA Guidance on Labelling and Packaging (CLP), versie 4.2, maart 2021")
add_bullet(doc, "ECHA Practical Guide: Stofidentiteitsprofiel (SIP), april 2018")

doc.add_heading("Tier 3 — Operationele Data & Marktanalyse", level=2)
add_bullet(doc, "Phoenix Metals Registration Chemicals MASTER, versie 2.1.0, december 2024")
add_bullet(doc, "ECHA: Veiligheid van chemische stoffen in uw bedrijf — Inleiding voor KMO's, 2015")
add_bullet(doc, "ECHA SCIP Database — echa.europa.eu/scip")
add_bullet(doc, "ECHA Kandidaatlijst — echa.europa.eu/candidate-list-table")
add_bullet(doc, "Verordening (EG) nr. 1907/2006 (REACH)")
add_bullet(doc, "Verordening (EG) nr. 1272/2008 (CLP)")
add_bullet(doc, "Nederlandse REACH Helpdesk — chemischestoffengoedgeregeld.nl")

# === SAVE ===
os.makedirs(os.path.dirname(OUTPUT_PATH), exist_ok=True)
doc.save(OUTPUT_PATH)
print(f"✅ Document saved: {OUTPUT_PATH}")
print(f"   Size: {os.path.getsize(OUTPUT_PATH) / 1024:.1f} KB")
