#!/usr/bin/env python3
"""
REACH Kennisdossier v1.1 — CLP Pictogrammen Correctie + Classificatiesystemen
"""

from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
from copy import deepcopy

INPUT = 'archive/REACH_Kennisdossier_v1.0.docx'
OUTPUT = 'deliverables/docx/REACH_Kennisdossier_v1.1.docx'
LOGO = '/root/projects/jg/assets/branding/jvg-logo-white-medium.png'

PRIMARY = RGBColor(0x00, 0x33, 0x66)
BODY_COLOR = RGBColor(0x1F, 0x29, 0x37)

doc = Document(INPUT)

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 style_header_row(table, bg='003366'):
    for cell in table.rows[0].cells:
        set_cell_shading(cell, bg)
        for p in cell.paragraphs:
            for run in p.runs:
                run.font.color.rgb = RGBColor.from_string('FFFFFF')
                run.font.bold = True
                run.font.size = Pt(10)

def make_table(doc_or_parent, headers, data, parent_element=None):
    """Create a new table with proper column count from the start."""
    ncols = len(headers)
    table = doc.add_table(rows=1 + len(data), cols=ncols)
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    # Header
    for i, h in enumerate(headers):
        c = table.rows[0].cells[i]
        c.text = ''
        r = c.paragraphs[0].add_run(h)
        r.font.size = Pt(10)
        r.font.bold = True
    style_header_row(table)
    # Data
    for ri, row_data in enumerate(data):
        for ci, val in enumerate(row_data):
            c = table.rows[ri + 1].cells[ci]
            c.text = ''
            r = c.paragraphs[0].add_run(str(val))
            r.font.size = Pt(9 if len(val) > 50 else Pt(10).pt)
            r.font.size = Pt(9)
            if ri % 2 == 1:
                set_cell_shading(c, 'F8F9FA')
    if parent_element is not None:
        parent_element.addnext(table._element)
    return table

def add_para_before(target, text, bold=False, italic=False, style=None):
    p = doc.add_paragraph(style=style)
    target.addnext(p._element)
    run = p.add_run(text)
    run.font.size = Pt(11)
    run.font.color.rgb = BODY_COLOR
    run.font.bold = bold
    run.font.italic = italic
    return p

# --- Update document properties ---
doc.core_properties.title = "REACH Kennisdossier v1.1"
doc.core_properties.author = "HQ_04 Technical Writer via Kas"
doc.core_properties.keywords = "REACH; CLP; GHS; ADR; kennisdossier; v1.1"
doc.core_properties.category = "HSEQ Intelligence"

# ============================================================
# PHASE 1: Replace Table 9 (CLP pictogrammen) — 2 cols → 4 cols
# ============================================================
t9 = doc.tables[9]
t9_parent = t9._tbl.getparent()
t9_element = t9._tbl

new_picto_table = doc.add_table(rows=1 + 9, cols=4)
new_picto_table.style = 'Table Grid'
new_picto_table.alignment = WD_TABLE_ALIGNMENT.CENTER

picto_headers = ['Code', 'Symbool', 'Pictogram', 'Toepassing']
for i, h in enumerate(picto_headers):
    c = new_picto_table.rows[0].cells[i]
    c.text = ''
    r = c.paragraphs[0].add_run(h)
    r.font.size = Pt(10)
    r.font.bold = True
style_header_row(new_picto_table)

picto_data = [
    ['GHS01', '💣', 'Explosief', 'Explosieven, zelfreactieve stoffen, organische peroxiden'],
    ['GHS02', '🔥', 'Ontvlambaar', 'Ontvlambare gassen, vloeistoffen, vaste stoffen, aerosols, zelfverwarmende stoffen, pyrofore stoffen'],
    ['GHS03', '🔺', 'Oxiderend', 'Oxiderende gassen, vloeistoffen en vaste stoffen'],
    ['GHS04', '⚠️', 'Gas onder druk', 'Gassen onder druk, vloeibaar gemaakte gassen, opgeloste gassen'],
    ['GHS05', '🧪', 'Corrosief', 'Huidcorrosie, metaalcorrosie, ernstig oogletsel'],
    ['GHS06', '💀', 'Giftig', 'Acute toxiciteit (categorieën 1-3)'],
    ['GHS07', '❗', 'Gezondheidsgevaar', 'Irriterend, sensibiliserend, acute toxiciteit cat. 4, STOT, aspiratiegevaar'],
    ['GHS08', '🌳', 'Milieugevaar', 'Gevaarlijk voor het aquatische milieu (acuut/chronisch), ozonlaag'],
    ['GHS09', '👤', 'Ernstig gezondheidsgevaar', 'Carcinogeniciteit, mutageniciteit, reproductietoxiciteit, STOT RE, respiratoire sensibilisatie'],
]
for ri, rd in enumerate(picto_data):
    for ci, val in enumerate(rd):
        c = new_picto_table.rows[ri + 1].cells[ci]
        c.text = ''
        r = c.paragraphs[0].add_run(val)
        r.font.size = Pt(10)
        if ri % 2 == 1:
            set_cell_shading(c, 'F8F9FA')

t9_parent.replace(t9_element, new_picto_table._tbl)
# Update reference
doc.tables[9] = new_picto_table  # won't work for Document.tables, but we track it

# ============================================================
# PHASE 2: Replace Table 7 (gevaarsklassen) — 3 cols → 4 cols
# ============================================================
t7 = doc.tables[7]
t7_parent = t7._tbl.getparent()
t7_element = t7._tbl

new_gev_table = doc.add_table(rows=1 + 4, cols=4)
new_gev_table.style = 'Table Grid'
new_gev_table.alignment = WD_TABLE_ALIGNMENT.CENTER

gev_headers = ['Categorie', 'Gevaarsklassen', 'Aantal', 'Signalwoord']
for i, h in enumerate(gev_headers):
    c = new_gev_table.rows[0].cells[i]
    c.text = ''
    r = c.paragraphs[0].add_run(h)
    r.font.size = Pt(10)
    r.font.bold = True
style_header_row(new_gev_table)

gev_data = [
    ['Fysieke gevaren', '1. Explosieven\n2. Ontvlambare gassen\n3. Spuitbussen (aerosols)\n4. Oxiderende gassen\n5. Gassen onder druk\n6. Ontvlambare vloeistoffen\n7. Ontvlambare vaste stoffen\n8. Zelfreactieve stoffen\n9. Pyrofore vloeistoffen\n10. Pyrofore stoffen\n11. Zelfverwarmende stoffen\n12. Stoffen → ontvlambare gassen bij contact met water\n13. Oxiderende vloeistoffen\n14. Oxiderende vaste stoffen\n15. Organische peroxiden\n16. Metaalcorrosief\n17. Gedesensibiliseerde explosieven (2019)', '17', 'GEVAAR / WAARSCHUWING'],
    ['Gezondheidsgevaren', '1. Acute toxiciteit\n2. Huidcorrosie/-irritatie\n3. Ernstig oogletsel/oogirritatie\n4. Respiratoire of huidgevoeligheid\n5. Erfelijke mutageniciteit\n6. Carcinogeniciteit\n7. Reproductietoxiciteit\n8. STOT — eenmalige blootstelling\n9. STOT — herhaalde blootstelling\n10. Aspiratiegevaar\n11. Endocriene disruptie — mens (2023)', '11', 'GEVAAR / WAARSCHUWING'],
    ['Milieugevaren', '1. Gevaarlijk voor het aquatische milieu\n2. Endocriene disruptie — milieu (2023)\n3. PBT / vPvB (2023)\n4. PMT / vPvM (2023)', '4', 'WAARSCHUWING'],
    ['Aanvullend', 'Gevaarlijk voor de ozonlaag', '1', 'WAARSCHUWING'],
]
for ri, rd in enumerate(gev_data):
    for ci, val in enumerate(rd):
        c = new_gev_table.rows[ri + 1].cells[ci]
        c.text = ''
        r = c.paragraphs[0].add_run(val)
        r.font.size = Pt(9)
        if ri % 2 == 1:
            set_cell_shading(c, 'F8F9FA')

t7_parent.replace(t7_element, new_gev_table._tbl)

# ============================================================
# PHASE 3: Fix H314 text in Table 8
# ============================================================
for t_idx, t in enumerate(doc.tables):
    for row in t.rows:
        if row.cells[0].text.strip() == 'H314':
            for p in row.cells[1].paragraphs:
                for run in p.runs:
                    if 'huidverbrandingen' in run.text:
                        run.text = run.text.replace('ernstige huidverbrandingen en oogbeschadiging', 'ernstige brandwonden en oogletsel')

# ============================================================
# PHASE 4: Fix P128 — pictogram intro text
# ============================================================
for p in doc.paragraphs:
    if 'De negen GHS-pictogrammen zijn diamantvormig' in p.text:
        for run in p.runs:
            run.text = ''
        run = p.add_run('De negen GHS-pictogrammen zijn ruitvormig (diamant) met een witte achtergrond en rode rand, conform CLP-verordening (EG) nr. 1272/2008. Elk pictogram vertegenwoordigt een specifiek type gevaar. De pictogrammen zijn gebaseerd op het VN GHS-systeem en vormen de wettelijke standaard voor etikettering van gevaarlijke stoffen en mengsels op de EU-markt.')
        run.font.size = Pt(11)
        run.font.color.rgb = BODY_COLOR
        break

# ============================================================
# PHASE 5: Update P120 — CLP intro
# ============================================================
for p in doc.paragraphs:
    if p.text.startswith('De CLP-verordening (Verordening (EG) nr. 1272/2008)'):
        for run in p.runs:
            run.text = ''
        run = p.add_run('De CLP-verordening (Verordening (EG) nr. 1272/2008) implementeert het GHS (Globally Harmonised System) van de VN in de EU. CLP regelt de indeling (classification), etikettering (labelling) en verpakking (packaging) van stoffen en mengsels. CLP is sinds 1 juni 2015 volledig van toepassing en vervangt de oudere richtlijnen 67/548/EEG (stoffen) en 1999/45/EC (preparaten).')
        run.font.size = Pt(11)
        run.font.color.rgb = BODY_COLOR
        break

# ============================================================
# PHASE 6: Insert new sections before chapter 6 (SVHC)
# ============================================================
insert_idx = None
for i, p in enumerate(doc.paragraphs):
    if '6. SVHC' in p.text and p.style.name == 'Heading 1':
        insert_idx = i
        break

if insert_idx:
    target = doc.paragraphs[insert_idx]._element
    
    # --- 5.6 Oud vs Nieuw ---
    h = doc.add_heading('5.6 Overgang: Oud Europees systeem naar CLP', level=2)
    target.addprevious(h._element)
    target = h._element
    for run in h.runs:
        run.font.color.rgb = PRIMARY

    p = add_para_before(target, 'CLP verving het oude Europese classificatiesysteem. Het is essentieel het verschil te kennen, aangezien oudere veiligheidsinformatiebladen en documentatie nog R/S-zinnen en oranje symbolen kunnen bevatten:')
    target = p._element

    # Comparison table: CLP vs old system
    comp_table = doc.add_table(rows=7, cols=3)
    comp_table.style = 'Table Grid'
    comp_table.alignment = WD_TABLE_ALIGNMENT.CENTER
    target.addnext(comp_table._element)
    target = comp_table._element

    comp_h = ['Aspect', 'Oud systeem (67/548/EEG)', 'CLP (EG 1272/2008)']
    comp_d = [
        ['Symbolen', 'Oranje vierkanten (rond/driehoek/schedel)', 'Ruitvormige diamanten (wit, rode rand)'],
        ['Gevaarsaanduiding', 'R-zinnen (Risico-zinnen), bijv. R34, R45', 'H-zinnen (Hazard statements), bijv. H314, H350'],
        ['Veiligheidsaanbevelingen', 'S-zinnen (Veiligheids-zinnen), bijv. S26, S36', 'P-zinnen (Precautionary statements), bijv. P260, P280'],
        ['Indeling', 'R-indeling, categorieën (1-3)', 'Gevaarsklassen en -categorieën, cat. 1A, 1B, 2, 3'],
        ['Signalwoorden', 'Geen standaard signalwoorden', 'GEVAAR (ernstig) / WAARSCHUWING (minder ernstig)'],
        ['Toepassing', 'Vervangen per 1 juni 2015', 'Wettelijk verplicht sinds 1 juni 2015'],
    ]
    for i, h_txt in enumerate(comp_h):
        c = comp_table.rows[0].cells[i]
        c.text = ''
        r = c.paragraphs[0].add_run(h_txt)
        r.font.size = Pt(10)
        r.font.bold = True
    style_header_row(comp_table)
    for ri, rd in enumerate(comp_d):
        for ci, val in enumerate(rd):
            c = comp_table.rows[ri + 1].cells[ci]
            c.text = ''
            r = c.paragraphs[0].add_run(val)
            r.font.size = Pt(10)
            if ri % 2 == 1:
                set_cell_shading(c, 'F8F9FA')

    p = add_para_before(target, 'Let op: bij revisie van veiligheidsinformatiebladen (SDS) moet worden gecontroleerd of deze het CLP-systeem hanteren. SDS\'en met R/S-zinnen zijn verouderd en niet conform de huidige wetgeving.', italic=True)
    target = p._element

    # --- 5.7 CLP vs ADR vs ADN vs IMDG ---
    h = doc.add_heading('5.7 Classificatiesystemen: CLP vs ADR vs ADN vs IMDG', level=2)
    target.addprevious(h._element)
    target = h._element
    for run in h.runs:
        run.font.color.rgb = PRIMARY

    p = add_para_before(target, 'Gevaarlijke stoffen worden geclassificeerd onder verschillende systemen, afhankelijk van de context. Het is essentieel het juiste systeem toe te passen: CLP voor de werkplek en consumentenverpakkingen, ADR/ADN/IMDG voor transport.')
    target = p._element

    # Systems comparison table
    sys_table = doc.add_table(rows=6, cols=5)
    sys_table.style = 'Table Grid'
    sys_table.alignment = WD_TABLE_ALIGNMENT.CENTER
    target.addnext(sys_table._element)
    target = sys_table._element

    sys_h = ['Systeem', 'Scope', 'Pictogramvorm', 'Codering', 'Regelgeving']
    sys_d = [
        ['CLP\n(EC 1272/2008)', 'Werkplek &\nconsument', 'Ruitvormig (diamant)\nwit + rode rand', 'GHS01–GHS09\nH-zinnen / P-zinnen', 'EU-verordening\nrechtstreeks werkend'],
        ['ADR', 'Wegvervoer\n(internationaal)', 'Rechthoekig\noranje achtergrond', 'ADR-klasse 1–9\nUN-nummers\nKemler-code', 'Europees verdrag\nin nationale wet'],
        ['ADN', 'Binnenvaart', 'Oranje borden\nblauwe milieuborden', 'ADR-klasse 1–9\nUN-nummers\nADN-specifieke voorschriften', 'Europees verdrag\nin nationale wet'],
        ['IMDG Code', 'Zeevaart', 'Rechthoekig\n(kleur per klasse)', 'IMDG-klasse 1–9\nUN-nummers\nMarine pollutant', 'IMO-resolutie\nvia nationaal recht'],
        ['IATA-DGR', 'Luchtvaart', 'Rechthoekig\n(kleur per klasse)', 'IATA/ICAO-klasse\nUN-nummers\nPG I/II/III', 'IATA-resolutie\nnationale wetgeving'],
    ]
    for i, h_txt in enumerate(sys_h):
        c = sys_table.rows[0].cells[i]
        c.text = ''
        r = c.paragraphs[0].add_run(h_txt)
        r.font.size = Pt(9)
        r.font.bold = True
    style_header_row(sys_table)
    for ri, rd in enumerate(sys_d):
        for ci, val in enumerate(rd):
            c = sys_table.rows[ri + 1].cells[ci]
            c.text = ''
            r = c.paragraphs[0].add_run(val)
            r.font.size = Pt(9)
            if ri % 2 == 1:
                set_cell_shading(c, 'F8F9FA')

    p = add_para_before(target, 'Belangrijk: een stof kan onder CLP en onder ADR een andere classificatie krijgen. Bijvoorbeeld: een stof die onder CLP als "ontvlambaar" (GHS02) is geclassificeerd, valt mogelijk niet onder ADR-klasse 3 bij transport in kleine hoeveelheden (< 1000 ml voor verpakking in groep III). Omgekeerd kan een stof onder ADR een specifieke transportklasse hebben zonder dat deze onder CLP als gevaarlijk wordt geclassificeerd voor werkplekgebruik.')
    target = p._element

    # --- 5.7.1 Phoenix Metals example ---
    h = doc.add_heading('5.7.1 Voorbeeld: Phoenix Metals chemicaliënregister', level=3)
    target.addprevious(h._element)
    target = h._element
    for run in h.runs:
        run.font.color.rgb = PRIMARY

    p = add_para_before(target, 'De chemicaliën in het Phoenix Metals register moeten onder zowel CLP als ADR worden geclassificeerd:')
    target = p._element

    ex_table = doc.add_table(rows=5, cols=5)
    ex_table.style = 'Table Grid'
    ex_table.alignment = WD_TABLE_ALIGNMENT.CENTER
    target.addnext(ex_table._element)
    target = ex_table._element

    ex_h = ['Stof', 'CLP Pictogram', 'CLP H-zinnen', 'ADR Klasse', 'ADR PG']
    ex_d = [
        ['NaOH 50%\n(Natriumhydroxide)', 'GHS05\n(Corrosief)', 'H314: Veroorzaakt ernstige\nbrandwonden en oogletsel', 'Klasse 8\n(Corrosief)', 'II'],
        ['H₂SO₄ 25/50/75%\n(Zwavelzuur)', 'GHS05\n(Corrosief)', 'H314: Veroorzaakt ernstige\nbrandwonden en oogletsel\nH290: Kan corrosief zijn\nvoor metalen', 'Klasse 8\n(Corrosief)', 'II'],
        ['Aceton\n(Industrieel)', 'GHS02 + GHS07\n(Ontvlambaam +\nGezondheidsgevaar)', 'H225: Zeer ontvlambare\nvloeistof en damp\nH319: Ernstige oogirritatie\nH336: Kan slaperigheid of\nduizeligheid veroorzaken', 'Klasse 3\n(Ontvlambare\nvloeistof)', 'II'],
        ['Diesel\n(Brandstof)', 'GHS02 + GHS07\n+ GHS08', 'H226: Ontvlambare vloeistof\nen damp\nH304: Kan bij inslikken en\ntoedringing in luchtwegen\nlethaal zijn\nH411: Giftig voor in het water\nlevende organismen', 'Klasse 3\n(Ontvlambare\nvloeistof)', 'III'],
    ]
    for i, h_txt in enumerate(ex_h):
        c = ex_table.rows[0].cells[i]
        c.text = ''
        r = c.paragraphs[0].add_run(h_txt)
        r.font.size = Pt(9)
        r.font.bold = True
    style_header_row(ex_table)
    for ri, rd in enumerate(ex_d):
        for ci, val in enumerate(rd):
            c = ex_table.rows[ri + 1].cells[ci]
            c.text = ''
            r = c.paragraphs[0].add_run(val)
            r.font.size = Pt(9)
            if ri % 2 == 1:
                set_cell_shading(c, 'F8F9FA')

# ============================================================
# PHASE 7: Update ATP15 text in section 17.2
# ============================================================
for p in doc.paragraphs:
    if 'De 15e aanpassing aan de technische vooruitgang (ATP 15)' in p.text:
        for run in p.runs:
            run.text = ''
        run = p.add_run('De 15e aanpassing aan de technische vooruitgang (ATP 15) van CLP introduceert nieuwe gevaarsklassen en wijzigt bestaande criteria. Deze wijzigingen zijn in werking getreden via Verordening (EU) 2023/707:')
        run.font.size = Pt(11)
        run.font.color.rgb = BODY_COLOR
        break

# ============================================================
# PHASE 8: Add PMT/vPvM bullet after PBT bullet in section 17.2
# ============================================================
for p in doc.paragraphs:
    if 'Persistent, bioaccumulatief en toxisch (PBT)' in p.text and p.style.name == 'List Bullet':
        new_p = doc.add_paragraph(style='List Bullet')
        p._element.addnext(new_p._element)
        run = new_p.add_run('Persistent, mobiel en toxisch (PMT) en zeer persistent en zeer mobiel (vPvM): nieuwe gevaarsklassen met categorie 1 — stoffen die zich via waterwegen kunnen verspreiden en persistent zijn in het milieu.')
        run.font.size = Pt(11)
        run.font.color.rgb = BODY_COLOR
        break

# ============================================================
# PHASE 9: Add logo to header
# ============================================================
for section in doc.sections:
    header = section.header
    if not header.paragraphs or all(len(p.runs) == 0 for p in header.paragraphs if p.runs):
        hp = header.paragraphs[0] if header.paragraphs else header.add_paragraph()
        hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        run = hp.add_run()
        run.add_picture(LOGO, width=Cm(2.0), height=Cm(1.8))

# ============================================================
# SAVE
# ============================================================
doc.save(OUTPUT)
print(f"✅ Opgeslagen: {OUTPUT}")

# ============================================================
# VERIFY
# ============================================================
doc2 = Document(OUTPUT)
print(f"\n📄 Verificatie:")
print(f"  Title: {doc2.core_properties.title}")
print(f"  Author: {doc2.core_properties.author}")

# Check pictogram table
print(f"\n  Totaal tabellen: {len(doc2.tables)}")

# Find the new 4-col pictogram table
for t_idx, t in enumerate(doc2.tables):
    if len(t.columns) == 4 and t.rows[0].cells[0].text.strip() == 'Code':
        print(f"  ✅ CLP Pictogrammentabel (Tabel {t_idx}): {len(t.rows)} rijen, {len(t.columns)} kolommen")
        print(f"    Header: {[c.text for c in t.rows[0].cells]}")
        print(f"    GHS01: {[c.text for c in t.rows[1].cells]}")
        print(f"    GHS09: {[c.text for c in t.rows[len(t.rows)-1].cells]}")
        break

# Find gevaarsklassen table
for t_idx, t in enumerate(doc2.tables):
    if len(t.columns) == 4 and 'Fysieke gevaren' in t.rows[1].cells[0].text:
        print(f"  ✅ Gevaarsklassentabel (Tabel {t_idx}): {len(t.rows)} rijen, {len(t.columns)} kolommen")
        break

# Check new sections
checks = {
    'Sectie 5.6 (Oud/Nieuw)': any('5.6' in p.text for p in doc2.paragraphs),
    'Sectie 5.7 (CLP vs ADR)': any('5.7' in p.text for p in doc2.paragraphs),
    'Sectie 5.7.1 (Phoenix Metals)': any('5.7.1' in p.text for p in doc2.paragraphs),
    'ADR referenties': any('ADR' in p.text for p in doc2.paragraphs),
    'PMT/vPvM vermelding': any('PMT' in p.text for p in doc2.paragraphs),
    'Oud vs Nieuw tabel': any('Oud systeem' in p.text for p in doc2.paragraphs) or any('Oud systeem' in c.text for t in doc2.tables for row in t.rows for c in row.cells),
}
for label, ok in checks.items():
    print(f"  {'✅' if ok else '❌'} {label}")

# Check H314
for t in doc2.tables:
    for row in t.rows:
        if row.cells[0].text.strip() == 'H314':
            h314_text = row.cells[1].text
            ok = 'brandwonen' in h314_text.lower() and 'oogletsel' in h314_text.lower()
            h314_ok = 'ernstige ernstige' not in h314_text
            print(f"  {'✅' if ok else '❌'} H314 gecorrigeerd: {h314_text}")
            break

print(f"\n✅ REACH_Kennisdossier_v1.1.docx gegenereerd en geverifieerd.")
