# ============================================================
# MODULE: BRZO/Seveso Dienst Transformatie — FASE 3
# HSEQ Intelligence Dashboard
# MAPP, ARIE, Veiligheidsrapport, VBS Compliance Tracker,
# BRZO Inspectie Voorbereiding, Noodscenario Planning
# ============================================================

import json
import sqlite3
from datetime import datetime, timedelta
from flask import jsonify, request, render_template_string
from search import get_db, DB_PATH


# ─── DB Init ───────────────────────────────────────────────────────────────

def init_db_brzo():
    """Create BRZO/Seveso tables (prefix: brzo_)."""
    try:
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()

        # 1. MAPP documents
        c.execute('''CREATE TABLE IF NOT EXISTS brzo_mapp (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL DEFAULT 'Major Accident Prevention Policy',
            company_name TEXT, establishment_id TEXT,
            brzo_tier TEXT DEFAULT 'lower',
            policy_text TEXT, safety_objectives TEXT,
            vbs_integration TEXT,
            status TEXT DEFAULT 'draft',
            version INTEGER DEFAULT 1,
            created_by TEXT DEFAULT 'system',
            created_at TEXT DEFAULT CURRENT_TIMESTAMP,
            updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
            deliverable_id INTEGER
        )''')

        # 2. ARIE reports
        c.execute('''CREATE TABLE IF NOT EXISTS brzo_arie (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL DEFAULT 'Algemene Risicoanalyse',
            company_name TEXT, establishment_id TEXT,
            scope TEXT, methodology TEXT,
            substances_assessed TEXT, installations_assessed TEXT,
            scenarios TEXT, risk_results TEXT,
            recommendations TEXT,
            status TEXT DEFAULT 'draft',
            version INTEGER DEFAULT 1,
            created_by TEXT DEFAULT 'system',
            created_at TEXT DEFAULT CURRENT_TIMESTAMP,
            updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
            deliverable_id INTEGER
        )''')

        # 3. Veiligheidsrapporten (upper tier only)
        c.execute('''CREATE TABLE IF NOT EXISTS brzo_safety_report (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL DEFAULT 'Veiligheidsrapport',
            company_name TEXT, establishment_id TEXT,
            mapp_id INTEGER, arie_id INTEGER,
            additional_data TEXT,
            status TEXT DEFAULT 'draft',
            version INTEGER DEFAULT 1,
            created_by TEXT DEFAULT 'system',
            created_at TEXT DEFAULT CURRENT_TIMESTAMP,
            updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
            deliverable_id INTEGER
        )''')

        # 4. VBS Compliance Tracker items (extends existing vbs_elements)
        c.execute('''CREATE TABLE IF NOT EXISTS brzo_vbs_compliance (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            vbs_element_id INTEGER NOT NULL,
            element_code TEXT NOT NULL,
            compliance_pct REAL DEFAULT 0,
            status TEXT DEFAULT 'not_started',
            action_items TEXT,
            last_assessment TEXT,
            next_review TEXT,
            assessor TEXT DEFAULT 'HSEQ Manager',
            notes TEXT,
            created_at TEXT DEFAULT CURRENT_TIMESTAMP,
            updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
            FOREIGN KEY (vbs_element_id) REFERENCES vbs_elements(id)
        )''')

        # 5. BRZO Inspectie Checklists
        c.execute('''CREATE TABLE IF NOT EXISTS brzo_inspection (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL DEFAULT 'BRZO Inspectie Checklist',
            inspection_type TEXT DEFAULT 'routine',
            template TEXT,
            items TEXT,
            status TEXT DEFAULT 'draft',
            score REAL DEFAULT 0,
            findings TEXT,
            created_by TEXT DEFAULT 'system',
            created_at TEXT DEFAULT CURRENT_TIMESTAMP,
            updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
            deliverable_id INTEGER
        )''')

        # 6. Noodscenario's
        c.execute('''CREATE TABLE IF NOT EXISTS brzo_emergency_scenarios (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL,
            scenario_type TEXT DEFAULT 'release',
            description TEXT,
            installation_ref TEXT,
            substances_involved TEXT,
            environmental_factors TEXT,
            evacuation_plan TEXT,
            response_plan TEXT,
            severity TEXT DEFAULT 'medium',
            probability TEXT DEFAULT 'low',
            risk_score REAL DEFAULT 0,
            status TEXT DEFAULT 'draft',
            version INTEGER DEFAULT 1,
            created_by TEXT DEFAULT 'system',
            created_at TEXT DEFAULT CURRENT_TIMESTAMP,
            updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
            deliverable_id INTEGER
        )''')

        # Indexes
        c.execute('CREATE INDEX IF NOT EXISTS idx_brzo_mapp_status ON brzo_mapp(status)')
        c.execute('CREATE INDEX IF NOT EXISTS idx_brzo_arie_status ON brzo_arie(status)')
        c.execute('CREATE INDEX IF NOT EXISTS idx_brzo_sr_status ON brzo_safety_report(status)')
        c.execute('CREATE INDEX IF NOT EXISTS idx_brzo_vbs_elem ON brzo_vbs_compliance(vbs_element_id)')
        c.execute('CREATE INDEX IF NOT EXISTS idx_brzo_insp_status ON brzo_inspection(status)')
        c.execute('CREATE INDEX IF NOT EXISTS idx_brzo_emerg_status ON brzo_emergency_scenarios(status)')

        conn.commit()
        conn.close()
        print("[OK] BRZO/Seveso FASE 3 tables initialized")
    except Exception as e:
        print(f"[WARN] init_db_brzo: {e}")


# ─── Lifecycle helper ──────────────────────────────────────────────────────

def _link_deliverable(db, title, dtype, content=None, params=None):
    """Create a dlv_lifecycle entry and return its ID."""
    try:
        content_j = json.dumps(content, ensure_ascii=False) if isinstance(content, (dict, list)) else content
        params_j = json.dumps(params, ensure_ascii=False) if isinstance(params, (dict, list)) else params
        cur = db.execute(
            'INSERT INTO dlv_lifecycle (title, type, service, status, content, parameters, created_by) VALUES (?,?,?,?,?,?,?)',
            (title, dtype, 'brzo', 'draft', content_j, params_j, 'system'))
        db.commit()
        return cur.lastrowid
    except Exception as e:
        print(f"[WARN] _link_deliverable: {e}")
        return None


# ═══════════════════════════════════════════════════════════════════════════
# 1. MAPP Generator
# ═══════════════════════════════════════════════════════════════════════════

def _mapp_list():
    db = get_db()
    rows = db.execute("SELECT * FROM brzo_mapp ORDER BY updated_at DESC").fetchall()
    db.close()
    return jsonify([dict(r) for r in rows])


def _mapp_get(mid):
    db = get_db()
    row = db.execute("SELECT * FROM brzo_mapp WHERE id=?", (mid,)).fetchone()
    db.close()
    if not row:
        return jsonify({'error': 'Not found'}), 404
    return jsonify(dict(row))


def _mapp_create():
    data = request.get_json(force=True)
    if not data:
        return jsonify({'error': 'No data'}), 400
    db = get_db()
    now = datetime.utcnow().isoformat()
    cur = db.execute(
        '''INSERT INTO brzo_mapp (title, company_name, establishment_id, brzo_tier,
           policy_text, safety_objectives, vbs_integration, status, created_by, created_at, updated_at)
           VALUES (?,?,?,?,?,?,?,?,?,?,?)''',
        (data.get('title', 'Major Accident Prevention Policy'),
         data.get('company_name', ''), data.get('establishment_id', ''),
         data.get('brzo_tier', 'lower'),
         json.dumps(data.get('policy_text'), ensure_ascii=False) if isinstance(data.get('policy_text'), (dict, list)) else data.get('policy_text'),
         json.dumps(data.get('safety_objectives'), ensure_ascii=False) if isinstance(data.get('safety_objectives'), (dict, list)) else data.get('safety_objectives'),
         json.dumps(data.get('vbs_integration'), ensure_ascii=False) if isinstance(data.get('vbs_integration'), (dict, list)) else data.get('vbs_integration'),
         data.get('status', 'draft'), data.get('created_by', 'system'), now, now))
    db.commit()
    did = _link_deliverable(db, data.get('title', 'MAPP'), 'mapp', {'mapp_id': cur.lastrowid})
    if did:
        db.execute("UPDATE brzo_mapp SET deliverable_id=? WHERE id=?", (did, cur.lastrowid))
        db.commit()
    db.close()
    return jsonify({'id': cur.lastrowid, 'deliverable_id': did, 'status': 'draft'}), 201


def _mapp_update(mid):
    data = request.get_json(force=True)
    db = get_db()
    row = db.execute("SELECT id FROM brzo_mapp WHERE id=?", (mid,)).fetchone()
    if not row:
        db.close()
        return jsonify({'error': 'Not found'}), 404
    fields, vals = [], []
    for f in ('title', 'company_name', 'establishment_id', 'brzo_tier', 'policy_text',
              'safety_objectives', 'vbs_integration', 'status'):
        if f in data:
            v = data[f]
            if isinstance(v, (dict, list)):
                v = json.dumps(v, ensure_ascii=False)
            fields.append(f'{f}=?')
            vals.append(v)
    if fields:
        fields.append("updated_at=?")
        vals.append(datetime.utcnow().isoformat())
        vals.append(mid)
        db.execute(f"UPDATE brzo_mapp SET {','.join(fields)} WHERE id=?", vals)
        db.commit()
    db.close()
    return jsonify({'status': 'updated'})


def _mapp_generate_html(mid):
    """Generate HTML MAPP document."""
    db = get_db()
    row = db.execute("SELECT * FROM brzo_mapp WHERE id=?", (mid,)).fetchone()
    db.close()
    if not row:
        return jsonify({'error': 'Not found'}), 404
    m = dict(row)

    # Parse JSON fields
    policy_text = m.get('policy_text', '')
    safety_objectives = m.get('safety_objectives', '')
    vbs_integration = m.get('vbs_integration', '')
    try:
        if policy_text and isinstance(policy_text, str):
            policy_text = json.loads(policy_text)
    except: pass
    try:
        if safety_objectives and isinstance(safety_objectives, str):
            safety_objectives = json.loads(safety_objectives)
    except: pass

    # Build VBS section from existing vbs_elements
    db2 = get_db()
    vbs_elements = db2.execute("SELECT * FROM vbs_elements ORDER BY sort_order").fetchall()
    db2.close()

    vbs_rows = ''
    for v in vbs_elements:
        vbs_rows += f'<tr><td>{v["code"]}</td><td>{v["name_nl"]}</td><td>{v["description"] or ""}</td></tr>\n'

    policy_items = ''
    if isinstance(policy_text, list):
        for p in policy_text:
            policy_items += f'<li>{p}</li>\n'
    elif isinstance(policy_text, str) and policy_text:
        policy_items = f'<li>{policy_text}</li>'

    obj_items = ''
    if isinstance(safety_objectives, list):
        for o in safety_objectives:
            obj_items += f'<li>{o}</li>\n'
    elif isinstance(safety_objectives, str) and safety_objectives:
        obj_items = f'<li>{safety_objectives}</li>'

    html = f'''<!DOCTYPE html>
<html lang="nl"><head><meta charset="UTF-8"><title>MAPP — {m.get("company_name","")}</title>
<style>
body{{font-family:Arial,sans-serif;margin:40px;color:#1E293B;line-height:1.6}}
h1{{color:#0A1628;border-bottom:3px solid #3B82F6;padding-bottom:10px}}
h2{{color:#1B2A4A;margin-top:30px}}
table{{width:100%;border-collapse:collapse;margin:16px 0}}
th{{background:#0A1628;color:#fff;padding:10px;text-align:left}}
td{{padding:8px 10px;border-bottom:1px solid #E2E8F0}}
.meta{{color:#64748B;font-size:12px;margin-bottom:20px}}
.footer{{margin-top:40px;padding-top:16px;border-top:1px solid #E2E8F0;font-size:11px;color:#94A3B8}}
</style></head><body>
<h1>Major Accident Prevention Policy (MAPP)</h1>
<div class="meta">
Bedrijf: {m.get("company_name","—")}<br>
Inrichting: {m.get("establishment_id","—")}<br>
BRZO Categorie: {m.get("brzo_tier","lower").upper()} TIER<br>
Datum: {datetime.now().strftime("%d-%m-%Y")} | Versie: {m.get("version",1)}
</div>

<h2>1. Doel & Toepassingsgebied</h2>
<p>Dit document bevat het veiligheidsbeleid van {m.get("company_name","het bedrijf")} ter voorkoming van zware ongevallen met gevaarlijke stoffen, conform Bijlage III van de Seveso III richtlijn en artikel 8 van het BRZO 2015.</p>

<h2>2. Veiligheidsdoelstellingen</h2>
<ul>{obj_items or "<li>Geen doelstellingen gedefinieerd</li>"}</ul>

<h2>3. Veiligheidsbeleid</h2>
<ul>{policy_items or "<li>Geen beleidspunten gedefinieerd</li>"}</ul>

<h2>4. VBS-Elementen Integratie</h2>
<p>De MAPP dekt de volgende elementen van het Veiligheidsbeheersingssysteem (VBS):</p>
<table>
<thead><tr><th>Code</th><th>Element</th><th>Beschrijving</th></tr></thead>
<tbody>{vbs_rows}</tbody>
</table>

<h2>5. Organisatie & Verantwoordelijkheden</h2>
<p>De directie is eindverantwoordelijk voor de implementatie en handhaving van dit beleid. De HSEQ Manager coördineert de uitvoering en rapporteert aan de directie.</p>

<h2>6. Review & Actualisatie</h2>
<p>Deze MAPP wordt jaarlijks herzien of bij wijziging van de inrichting, stoffen of processen. De volgende review is gepland binnen 12 maanden na vaststelling.</p>

<div class="footer">Gegenereerd door HSEQ Intelligence Dashboard — JvG Consultancy<br>{datetime.now().strftime("%d-%m-%Y %H:%M")}</div>
</body></html>'''

    return jsonify({'html': html, 'title': m.get('title', 'MAPP'), 'mapp_id': mid})


# ═══════════════════════════════════════════════════════════════════════════
# 2. ARIE Generator
# ═══════════════════════════════════════════════════════════════════════════

def _arie_list():
    db = get_db()
    rows = db.execute("SELECT * FROM brzo_arie ORDER BY updated_at DESC").fetchall()
    db.close()
    return jsonify([dict(r) for r in rows])


def _arie_get(aid):
    db = get_db()
    row = db.execute("SELECT * FROM brzo_arie WHERE id=?", (aid,)).fetchone()
    db.close()
    if not row:
        return jsonify({'error': 'Not found'}), 404
    return jsonify(dict(row))


def _arie_create():
    data = request.get_json(force=True)
    if not data:
        return jsonify({'error': 'No data'}), 400
    db = get_db()
    now = datetime.utcnow().isoformat()
    cur = db.execute(
        '''INSERT INTO brzo_arie (title, company_name, establishment_id, scope, methodology,
           substances_assessed, installations_assessed, scenarios, risk_results, recommendations,
           status, version, created_by, created_at, updated_at, deliverable_id)
           VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
        (data.get('title', 'Algemene Risicoanalyse'),
         data.get('company_name', ''), data.get('establishment_id', ''),
         data.get('scope', ''), data.get('methodology', ''),
         json.dumps(data.get('substances_assessed'), ensure_ascii=False) if isinstance(data.get('substances_assessed'), (dict, list)) else data.get('substances_assessed'),
         json.dumps(data.get('installations_assessed'), ensure_ascii=False) if isinstance(data.get('installations_assessed'), (dict, list)) else data.get('installations_assessed'),
         json.dumps(data.get('scenarios'), ensure_ascii=False) if isinstance(data.get('scenarios'), (dict, list)) else data.get('scenarios'),
         json.dumps(data.get('risk_results'), ensure_ascii=False) if isinstance(data.get('risk_results'), (dict, list)) else data.get('risk_results'),
         json.dumps(data.get('recommendations'), ensure_ascii=False) if isinstance(data.get('recommendations'), (dict, list)) else data.get('recommendations'),
         data.get('status', 'draft'), 1, data.get('created_by', 'system'), now, now, None))
    db.commit()
    did = _link_deliverable(db, data.get('title', 'ARIE'), 'arie', {'arie_id': cur.lastrowid})
    if did:
        db.execute("UPDATE brzo_arie SET deliverable_id=? WHERE id=?", (did, cur.lastrowid))
        db.commit()
    db.close()
    return jsonify({'id': cur.lastrowid, 'deliverable_id': did, 'status': 'draft'}), 201


def _arie_update(aid):
    data = request.get_json(force=True)
    db = get_db()
    if not db.execute("SELECT id FROM brzo_arie WHERE id=?", (aid,)).fetchone():
        db.close()
        return jsonify({'error': 'Not found'}), 404
    fields, vals = [], []
    for f in ('title', 'company_name', 'establishment_id', 'scope', 'methodology',
              'substances_assessed', 'installations_assessed', 'scenarios', 'risk_results',
              'recommendations', 'status'):
        if f in data:
            v = data[f]
            if isinstance(v, (dict, list)):
                v = json.dumps(v, ensure_ascii=False)
            fields.append(f'{f}=?')
            vals.append(v)
    if fields:
        fields.append("updated_at=?")
        vals.append(datetime.utcnow().isoformat())
        vals.append(aid)
        db.execute(f"UPDATE brzo_arie SET {','.join(fields)} WHERE id=?", vals)
        db.commit()
    db.close()
    return jsonify({'status': 'updated'})


def _arie_cross_reference():
    """Cross-reference with substance_library and risk_scenarios."""
    db = get_db()
    substances = [dict(r) for r in db.execute("SELECT * FROM substance_library ORDER BY substance_name").fetchall()]
    scenarios = [dict(r) for r in db.execute("SELECT * FROM risk_scenarios ORDER BY code").fetchall()]
    db.close()
    return jsonify({
        'substance_library': substances,
        'risk_scenarios': scenarios,
        'substance_count': len(substances),
        'scenario_count': len(scenarios)
    })


def _arie_generate_html(aid):
    """Generate HTML ARIE report."""
    db = get_db()
    row = db.execute("SELECT * FROM brzo_arie WHERE id=?", (aid,)).fetchone()
    db.close()
    if not row:
        return jsonify({'error': 'Not found'}), 404
    a = dict(row)

    def parse_json(val):
        if not val: return []
        try: return json.loads(val) if isinstance(val, str) else val
        except: return [val] if val else []

    substances = parse_json(a.get('substances_assessed'))
    scenarios = parse_json(a.get('scenarios'))
    results = parse_json(a.get('risk_results'))
    recommendations = parse_json(a.get('recommendations'))

    sub_rows = ''
    for s in substances:
        if isinstance(s, dict):
            sub_rows += f'<tr><td>{s.get("name","")}</td><td>{s.get("cas_number","")}</td><td>{s.get("quantity","")}</td><td>{s.get("unit","")}</td></tr>\n'
        elif isinstance(s, str):
            sub_rows += f'<tr><td colspan="4">{s}</td></tr>\n'

    scen_rows = ''
    for sc in scenarios:
        if isinstance(sc, dict):
            sev = sc.get('severity', 'low')
            sev_color = '#D1FAE5' if sev == 'low' else '#FEF3C7' if sev == 'medium' else '#FEE2E2'
            scen_rows += f'<tr><td>{sc.get("code","")}</td><td>{sc.get("title","")}</td><td>{sc.get("description","")}</td><td style="background:{sev_color};font-weight:600">{sev}</td></tr>\n'
        elif isinstance(sc, str):
            scen_rows += f'<tr><td colspan="4">{sc}</td></tr>\n'

    rec_rows = ''
    for r in recommendations:
        if isinstance(r, dict):
            rec_rows += f'<tr><td>{r.get("priority","")}</td><td>{r.get("title","")}</td><td>{r.get("description","")}</td></tr>\n'
        elif isinstance(r, str):
            rec_rows += f'<tr><td colspan="3">{r}</td></tr>\n'

    html = f'''<!DOCTYPE html>
<html lang="nl"><head><meta charset="UTF-8"><title>ARIE — {a.get("company_name","")}</title>
<style>
body{{font-family:Arial,sans-serif;margin:40px;color:#1E293B;line-height:1.6}}
h1{{color:#0A1628;border-bottom:3px solid #3B82F6;padding-bottom:10px}}
h2{{color:#1B2A4A;margin-top:30px}}
table{{width:100%;border-collapse:collapse;margin:16px 0}}
th{{background:#0A1628;color:#fff;padding:10px;text-align:left}}
td{{padding:8px 10px;border-bottom:1px solid #E2E8F0}}
.meta{{color:#64748B;font-size:12px;margin-bottom:20px}}
.footer{{margin-top:40px;padding-top:16px;border-top:1px solid #E2E8F0;font-size:11px;color:#94A3B8}}
</style></head><body>
<h1>Algemene Risicoanalyse (ARIE)</h1>
<div class="meta">
Bedrijf: {a.get("company_name","—")}<br>
Inrichting: {a.get("establishment_id","—")}<br>
Scope: {a.get("scope","—")}<br>
Methodologie: {a.get("methodology","—")}<br>
Datum: {datetime.now().strftime("%d-%m-%Y")} | Versie: {a.get("version",1)}
</div>

<h2>1. Stoffenlijst</h2>
<table>
<thead><tr><th>Stof</th><th>CAS</th><th>Hoeveelheid</th><th>Eenheid</th></tr></thead>
<tbody>{sub_rows or "<tr><td colspan='4'>Geen stoffen gedefinieerd</td></tr>"}</tbody>
</table>

<h2>2. Risicoscenario's</h2>
<table>
<thead><tr><th>Code</th><th>Scenario</th><th>Beschrijving</th><th>Ernst</th></tr></thead>
<tbody>{scen_rows or "<tr><td colspan='4'>Geen scenario's gedefinieerd</td></tr>"}</tbody>
</table>

<h2>3. Risicoresultaten</h2>
<pre style="background:#F8FAFC;padding:16px;border-radius:8px;overflow:auto">{json.dumps(results, indent=2, ensure_ascii=False) if results else "Geen resultaten beschikbaar"}</pre>

<h2>4. Aanbevelingen</h2>
<table>
<thead><tr><th>Prioriteit</th><th>Aanbeveling</th><th>Beschrijving</th></tr></thead>
<tbody>{rec_rows or "<tr><td colspan='3'>Geen aanbevelingen gedefinieerd</td></tr>"}</tbody>
</table>

<div class="footer">Gegenereerd door HSEQ Intelligence Dashboard — JvG Consultancy<br>{datetime.now().strftime("%d-%m-%Y %H:%M")}</div>
</body></html>'''

    return jsonify({'html': html, 'title': a.get('title', 'ARIE'), 'arie_id': aid})


# ═══════════════════════════════════════════════════════════════════════════
# 3. Veiligheidsrapport Generator (upper tier only)
# ═══════════════════════════════════════════════════════════════════════════

def _safety_report_list():
    db = get_db()
    rows = db.execute("SELECT * FROM brzo_safety_report ORDER BY updated_at DESC").fetchall()
    db.close()
    return jsonify([dict(r) for r in rows])


def _safety_report_create():
    data = request.get_json(force=True)
    if not data:
        return jsonify({'error': 'No data'}), 400
    # Enforce upper tier
    db = get_db()
    if data.get('brzo_tier') == 'lower':
        db.close()
        return jsonify({'error': 'Veiligheidsrapport alleen beschikbaar voor upper tier bedrijven'}), 403
    now = datetime.utcnow().isoformat()
    cur = db.execute(
        '''INSERT INTO brzo_safety_report (title, company_name, establishment_id, mapp_id, arie_id,
           additional_data, status, created_by, created_at, updated_at)
           VALUES (?,?,?,?,?,?,?,?,?,?)''',
        (data.get('title', 'Veiligheidsrapport'),
         data.get('company_name', ''), data.get('establishment_id', ''),
         data.get('mapp_id'), data.get('arie_id'),
         json.dumps(data.get('additional_data'), ensure_ascii=False) if isinstance(data.get('additional_data'), (dict, list)) else data.get('additional_data'),
         data.get('status', 'draft'), data.get('created_by', 'system'), now, now))
    db.commit()
    did = _link_deliverable(db, data.get('title', 'Veiligheidsrapport'), 'mapp', {'safety_report_id': cur.lastrowid})
    if did:
        db.execute("UPDATE brzo_safety_report SET deliverable_id=? WHERE id=?", (did, cur.lastrowid))
        db.commit()
    db.close()
    return jsonify({'id': cur.lastrowid, 'deliverable_id': did, 'status': 'draft'}), 201


def _safety_report_generate_html(srid):
    """Generate combined safety report from MAPP + ARIE."""
    db = get_db()
    sr = db.execute("SELECT * FROM brzo_safety_report WHERE id=?", (srid,)).fetchone()
    if not sr:
        db.close()
        return jsonify({'error': 'Not found'}), 404
    sr = dict(sr)

    mapp_data = {}
    if sr.get('mapp_id'):
        m = db.execute("SELECT * FROM brzo_mapp WHERE id=?", (sr['mapp_id'],)).fetchone()
        if m: mapp_data = dict(m)

    arie_data = {}
    if sr.get('arie_id'):
        a = db.execute("SELECT * FROM brzo_arie WHERE id=?", (sr['arie_id'],)).fetchone()
        if a: arie_data = dict(a)

    db.close()

    html = f'''<!DOCTYPE html>
<html lang="nl"><head><meta charset="UTF-8"><title>Veiligheidsrapport — {sr.get("company_name","")}</title>
<style>
body{{font-family:Arial,sans-serif;margin:40px;color:#1E293B;line-height:1.6}}
h1{{color:#0A1628;border-bottom:3px solid #EF4444;padding-bottom:10px}}
h2{{color:#1B2A4A;margin-top:30px;border-left:4px solid #3B82F6;padding-left:12px}}
.meta{{color:#64748B;font-size:12px;margin-bottom:20px;background:#FEF2F2;padding:12px;border-radius:8px;border:1px solid #FECACA}}
.section{{margin:20px 0;padding:16px;background:#F8FAFC;border-radius:8px;border:1px solid #E2E8F0}}
.footer{{margin-top:40px;padding-top:16px;border-top:1px solid #E2E8F0;font-size:11px;color:#94A3B8}}
</style></head><body>
<h1>🚨 VEILIGHEIDSRAPPORT — BRZO Upper Tier</h1>
<div class="meta">
⚠️ CONFIDENTIEEL — Dit rapport is bestemd voor de bevoegde autoriteit<br>
Bedrijf: {sr.get("company_name","—")} | Inrichting: {sr.get("establishment_id","—")}<br>
Datum: {datetime.now().strftime("%d-%m-%Y")} | Versie: {sr.get("version",1)}
</div>

<div class="section">
<h2>A. Major Accident Prevention Policy (MAPP)</h2>
<p>Status: {mapp_data.get("status", "niet gekoppeld")}</p>
<p>{mapp_data.get("policy_text", "Geen MAPP gegevens beschikbaar")}</p>
</div>

<div class="section">
<h2>B. Algemene Risicoanalyse (ARIE)</h2>
<p>Status: {arie_data.get("status", "niet gekoppeld")}</p>
<p>Methodologie: {arie_data.get("methodology", "—")}</p>
</div>

<div class="section">
<h2>C. Aanvullende Informatie</h2>
<p>Veiligheidsrapporten bevatten aanvullende informatie over de inrichting, de gevaarlijke stoffen, de procesveiligheid en de noodplannen.</p>
</div>

<div class="footer">Gegenereerd door HSEQ Intelligence Dashboard — JvG Consultancy<br>{datetime.now().strftime("%d-%m-%Y %H:%M")}</div>
</body></html>'''

    return jsonify({'html': html, 'title': sr.get('title', 'Veiligheidsrapport')})


# ═══════════════════════════════════════════════════════════════════════════
# 4. VBS Compliance Tracker
# ═══════════════════════════════════════════════════════════════════════════

def _vbs_compliance_dashboard():
    db = get_db()
    # Get all VBS elements with compliance data
    rows = db.execute('''
        SELECT ve.id, ve.code, ve.name_nl, ve.description,
               COALESCE(bvc.compliance_pct, 0) as compliance_pct,
               COALESCE(bvc.status, 'not_started') as status,
               bvc.action_items, bvc.last_assessment, bvc.next_review,
               bvc.assessor, bvc.notes
        FROM vbs_elements ve
        LEFT JOIN brzo_vbs_compliance bvc ON bvc.vbs_element_id = ve.id
        ORDER BY ve.sort_order
    ''').fetchall()

    # Also count gaps from existing compliance_status
    gaps = db.execute('''
        SELECT COUNT(*) as cnt FROM compliance_status
        WHERE status IN ('non_compliant', 'partially_compliant', 'not_assessed')
    ''').fetchone()

    db.close()
    items = [dict(r) for r in rows]
    overall_pct = 0
    if items:
        overall_pct = round(sum(i['compliance_pct'] for i in items) / len(items), 1)
    return jsonify({
        'overall_compliance_pct': overall_pct,
        'total_gaps': gaps['cnt'] if gaps else 0,
        'elements': items
    })


def _vbs_compliance_update(vid):
    """Update or create VBS compliance entry."""
    data = request.get_json(force=True)
    db = get_db()
    now = datetime.utcnow().isoformat()
    existing = db.execute("SELECT id FROM brzo_vbs_compliance WHERE id=?", (vid,)).fetchone()
    if not existing:
        db.close()
        return jsonify({'error': 'Not found'}), 404
    fields, vals = [], []
    for f in ('compliance_pct', 'status', 'action_items', 'last_assessment',
              'next_review', 'assessor', 'notes'):
        if f in data:
            v = data[f]
            if isinstance(v, (dict, list)):
                v = json.dumps(v, ensure_ascii=False)
            fields.append(f'{f}=?')
            vals.append(v)
    if fields:
        fields.append("updated_at=?")
        vals.append(now)
        vals.append(vid)
        db.execute(f"UPDATE brzo_vbs_compliance SET {','.join(fields)} WHERE id=?", vals)
        db.commit()
    db.close()
    return jsonify({'status': 'updated'})


def _vbs_compliance_init():
    """Initialize compliance entries for all VBS elements."""
    db = get_db()
    existing = db.execute("SELECT vbs_element_id FROM brzo_vbs_compliance").fetchall()
    existing_ids = {r['vbs_element_id'] for r in existing}
    elements = db.execute("SELECT id, code FROM vbs_elements").fetchall()
    created = 0
    for e in elements:
        if e['id'] not in existing_ids:
            db.execute(
                "INSERT INTO brzo_vbs_compliance (vbs_element_id, element_code, status, created_at) VALUES (?,?,?,?)",
                (e['id'], e['code'], 'not_started', datetime.utcnow().isoformat()))
            created += 1
    db.commit()
    db.close()
    return jsonify({'status': 'ok', 'initialized': created})


def _vbs_compliance_action_items():
    """Get action items for non-compliant VBS elements."""
    db = get_db()
    rows = db.execute('''
        SELECT bvc.id, ve.code, ve.name_nl,
               bvc.compliance_pct, bvc.status, bvc.action_items,
               bvc.next_review, bvc.assessor
        FROM brzo_vbs_compliance bvc
        JOIN vbs_elements ve ON ve.id = bvc.vbs_element_id
        WHERE bvc.status IN ('not_started', 'in_progress', 'non_compliant')
           OR bvc.compliance_pct < 80
        ORDER BY bvc.compliance_pct ASC
    ''').fetchall()
    db.close()
    return jsonify([dict(r) for r in rows])


# ═══════════════════════════════════════════════════════════════════════════
# 5. BRZO Inspectie Voorbereiding
# ═══════════════════════════════════════════════════════════════════════════

INSPECTION_TEMPLATE = [
    {"id": 1, "category": "Algemeen", "item": "BRZO-licentie en vergunning aanwezig", "critical": True},
    {"id": 2, "category": "Algemeen", "item": "Veiligheidsrapport (MID) up-to-date (upper tier)", "critical": True},
    {"id": 3, "category": "Algemeen", "item": "MAPP (Major Accident Prevention Policy) vastgesteld", "critical": True},
    {"id": 4, "category": "ARIE", "item": "ARIE (Algemene Risicoanalyse) actueel", "critical": True},
    {"id": 5, "category": "ARIE", "item": "Risicoscenario's gedocumenteerd en geëvalueerd", "critical": True},
    {"id": 6, "category": "ARIE", "item": "Beheersmaatregelen geïmplementeerd", "critical": True},
    {"id": 7, "category": "Stoffen", "item": "Stoffenlijst actueel met hoeveelheden", "critical": True},
    {"id": 8, "category": "Stoffen", "item": "Veiligheidsinformatiebladen (SDS) beschikbaar", "critical": False},
    {"id": 9, "category": "Stoffen", "item": "PGS-richtlijnen toegepast", "critical": False},
    {"id": 10, "category": "Noodplan", "item": "Interne noodplan (BHV) actueel en geoefend", "critical": True},
    {"id": 11, "category": "Noodplan", "item": "Externe noodplan afgestemd met hulpverlening", "critical": True},
    {"id": 12, "category": "Noodplan", "item": "Oefeningen uitgevoerd en geëvalueerd (min. 1x/jaar)", "critical": True},
    {"id": 13, "category": "VBS", "item": "Veiligheidsbeheersingssysteem geïmplementeerd", "critical": True},
    {"id": 14, "category": "VBS", "item": "Management review uitgevoerd", "critical": False},
    {"id": 15, "category": "VBS", "item": "Interne audits uitgevoerd", "critical": False},
    {"id": 16, "category": "Documentatie", "item": "Logboek zware ongevallen bijgehouden", "critical": True},
    {"id": 17, "category": "Documentatie", "item": "Meldingen aan bevoegd gezag gedaan", "critical": True},
    {"id": 18, "category": "Documentatie", "item": "Ontwerpkeuring rapporten beschikbaar", "critical": False},
    {"id": 19, "category": "Procesveiligheid", "item": "HAZOP/What-If studies uitgevoerd", "critical": True},
    {"id": 20, "category": "Procesveiligheid", "item": "MoC (Management of Change) procedure actief", "critical": True},
]


def _brzo_inspection_list():
    db = get_db()
    rows = db.execute("SELECT * FROM brzo_inspection ORDER BY updated_at DESC").fetchall()
    db.close()
    return jsonify([dict(r) for r in rows])


def _brzo_inspection_get(iid):
    db = get_db()
    row = db.execute("SELECT * FROM brzo_inspection WHERE id=?", (iid,)).fetchone()
    db.close()
    if not row:
        return jsonify({'error': 'Not found'}), 404
    return jsonify(dict(row))


def _brzo_inspection_create():
    data = request.get_json(force=True)
    if not data:
        return jsonify({'error': 'No data'}), 400
    db = get_db()
    now = datetime.utcnow().isoformat()
    # Auto-populate template items if not provided
    items = data.get('items')
    if not items:
        items = INSPECTION_TEMPLATE
    cur = db.execute(
        '''INSERT INTO brzo_inspection (title, inspection_type, template, items,
           status, score, findings, created_by, created_at, updated_at)
           VALUES (?,?,?,?,?,?,?,?,?,?)''',
        (data.get('title', 'BRZO Inspectie Checklist'),
         data.get('inspection_type', 'routine'),
         json.dumps(INSPECTION_TEMPLATE, ensure_ascii=False),
         json.dumps(items, ensure_ascii=False) if isinstance(items, (dict, list)) else items,
         data.get('status', 'draft'), data.get('score', 0),
         json.dumps(data.get('findings'), ensure_ascii=False) if isinstance(data.get('findings'), (dict, list)) else data.get('findings'),
         data.get('created_by', 'system'), now, now))
    db.commit()
    did = _link_deliverable(db, data.get('title', 'BRZO Inspectie Checklist'), 'inspection_checklist',
                           {'inspection_id': cur.lastrowid})
    if did:
        db.execute("UPDATE brzo_inspection SET deliverable_id=? WHERE id=?", (did, cur.lastrowid))
        db.commit()
    db.close()
    return jsonify({'id': cur.lastrowid, 'deliverable_id': did, 'items_count': len(items)}), 201


def _brzo_inspection_update_item(iid):
    """Update individual checklist item status."""
    data = request.get_json(force=True)
    db = get_db()
    row = db.execute("SELECT items FROM brzo_inspection WHERE id=?", (iid,)).fetchone()
    if not row:
        db.close()
        return jsonify({'error': 'Not found'}), 404
    items = json.loads(row['items']) if row['items'] else []
    item_id = data.get('item_id')
    new_status = data.get('status', 'pending')
    notes = data.get('notes', '')
    updated = False
    for item in items:
        if item.get('id') == item_id:
            item['status'] = new_status
            item['notes'] = notes
            item['updated_at'] = datetime.utcnow().isoformat()
            updated = True
            break
    if not updated:
        db.close()
        return jsonify({'error': 'Item not found'}), 404
    # Calculate score
    total = len(items)
    done = sum(1 for i in items if i.get('status') in ('compliant', 'ok', 'na'))
    score = round((done / total) * 100, 1) if total > 0 else 0
    db.execute("UPDATE brzo_inspection SET items=?, score=?, updated_at=? WHERE id=?",
               (json.dumps(items, ensure_ascii=False), score, datetime.utcnow().isoformat(), iid))
    db.commit()
    db.close()
    return jsonify({'status': 'updated', 'score': score, 'completed': done, 'total': total})


def _brzo_inspection_template():
    """Get the standard BRZO inspection template."""
    return jsonify({'template': INSPECTION_TEMPLATE, 'total_items': len(INSPECTION_TEMPLATE)})


# ═══════════════════════════════════════════════════════════════════════════
# 6. Noodscenario Planning
# ═══════════════════════════════════════════════════════════════════════════

def _emergency_scenarios_list():
    db = get_db()
    rows = db.execute("SELECT * FROM brzo_emergency_scenarios ORDER BY risk_score DESC, updated_at DESC").fetchall()
    db.close()
    return jsonify([dict(r) for r in rows])


def _emergency_scenario_get(eid):
    db = get_db()
    row = db.execute("SELECT * FROM brzo_emergency_scenarios WHERE id=?", (eid,)).fetchone()
    db.close()
    if not row:
        return jsonify({'error': 'Not found'}), 404
    return jsonify(dict(row))


def _emergency_scenario_create():
    data = request.get_json(force=True)
    if not data or not data.get('title'):
        return jsonify({'error': 'Title required'}), 400
    db = get_db()
    now = datetime.utcnow().isoformat()
    # Auto-calculate risk score
    sev_map = {'low': 1, 'medium': 3, 'high': 5, 'extreme': 10}
    prob_map = {'very_low': 1, 'low': 2, 'medium': 4, 'high': 7, 'very_high': 10}
    severity = data.get('severity', 'medium')
    probability = data.get('probability', 'low')
    risk_score = sev_map.get(severity, 3) * prob_map.get(probability, 2)
    cur = db.execute(
        '''INSERT INTO brzo_emergency_scenarios (title, scenario_type, description,
           installation_ref, substances_involved, environmental_factors,
           evacuation_plan, response_plan, severity, probability, risk_score,
           status, created_by, created_at, updated_at)
           VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
        (data['title'], data.get('scenario_type', 'release'), data.get('description', ''),
         data.get('installation_ref', ''),
         json.dumps(data.get('substances_involved'), ensure_ascii=False) if isinstance(data.get('substances_involved'), (dict, list)) else data.get('substances_involved'),
         json.dumps(data.get('environmental_factors'), ensure_ascii=False) if isinstance(data.get('environmental_factors'), (dict, list)) else data.get('environmental_factors'),
         json.dumps(data.get('evacuation_plan'), ensure_ascii=False) if isinstance(data.get('evacuation_plan'), (dict, list)) else data.get('evacuation_plan'),
         json.dumps(data.get('response_plan'), ensure_ascii=False) if isinstance(data.get('response_plan'), (dict, list)) else data.get('response_plan'),
         severity, probability, risk_score,
         data.get('status', 'draft'), data.get('created_by', 'system'), now, now))
    db.commit()
    did = _link_deliverable(db, data['title'], 'mapp', {'scenario_id': cur.lastrowid})
    if did:
        db.execute("UPDATE brzo_emergency_scenarios SET deliverable_id=? WHERE id=?", (did, cur.lastrowid))
        db.commit()
    db.close()
    return jsonify({'id': cur.lastrowid, 'deliverable_id': did, 'risk_score': risk_score}), 201


def _emergency_scenario_update(eid):
    data = request.get_json(force=True)
    db = get_db()
    if not db.execute("SELECT id FROM brzo_emergency_scenarios WHERE id=?", (eid,)).fetchone():
        db.close()
        return jsonify({'error': 'Not found'}), 404
    fields, vals = [], []
    for f in ('title', 'scenario_type', 'description', 'installation_ref',
              'substances_involved', 'environmental_factors', 'evacuation_plan',
              'response_plan', 'severity', 'probability', 'status'):
        if f in data:
            v = data[f]
            if isinstance(v, (dict, list)):
                v = json.dumps(v, ensure_ascii=False)
            fields.append(f'{f}=?')
            vals.append(v)
    # Recalculate risk score if severity or probability changed
    if 'severity' in data or 'probability' in data:
        sev_map = {'low': 1, 'medium': 3, 'high': 5, 'extreme': 10}
        prob_map = {'very_low': 1, 'low': 2, 'medium': 4, 'high': 7, 'very_high': 10}
        existing = db.execute("SELECT severity, probability FROM brzo_emergency_scenarios WHERE id=?", (eid,)).fetchone()
        s = data.get('severity', existing['severity'])
        p = data.get('probability', existing['probability'])
        fields.append('risk_score=?')
        vals.append(sev_map.get(s, 3) * prob_map.get(p, 2))
    if fields:
        fields.append("updated_at=?")
        vals.append(datetime.utcnow().isoformat())
        vals.append(eid)
        db.execute(f"UPDATE brzo_emergency_scenarios SET {','.join(fields)} WHERE id=?", vals)
        db.commit()
    db.close()
    return jsonify({'status': 'updated'})


def _emergency_scenario_matrix():
    """Get risk matrix overview of all scenarios."""
    db = get_db()
    rows = db.execute("SELECT title, severity, probability, risk_score, status FROM brzo_emergency_scenarios ORDER BY risk_score DESC").fetchall()
    db.close()
    # Build matrix
    matrix = {}
    for r in rows:
        key = f"{r['severity']}_{r['probability']}"
        if key not in matrix:
            matrix[key] = []
        matrix[key].append({'title': r['title'], 'risk_score': r['risk_score'], 'status': r['status']})
    return jsonify({'matrix': matrix, 'scenarios': [dict(r) for r in rows]})


def _emergency_scenario_generate_html(eid):
    """Generate HTML emergency scenario document."""
    db = get_db()
    row = db.execute("SELECT * FROM brzo_emergency_scenarios WHERE id=?", (eid,)).fetchone()
    db.close()
    if not row:
        return jsonify({'error': 'Not found'}), 404
    s = dict(row)

    def parse(val):
        if not val: return ''
        try: return json.loads(val) if isinstance(val, str) else val
        except: return val

    sev_color = '#D1FAE5' if s['severity'] in ('low',) else '#FEF3C7' if s['severity'] in ('medium',) else '#FEE2E2'

    html = f'''<!DOCTYPE html>
<html lang="nl"><head><meta charset="UTF-8"><title>Noodscenario — {s.get("title","")}</title>
<style>
body{{font-family:Arial,sans-serif;margin:40px;color:#1E293B;line-height:1.6}}
h1{{color:#0A1628;border-bottom:3px solid #EF4444;padding-bottom:10px}}
h2{{color:#1B2A4A;margin-top:30px}}
.meta{{color:#64748B;font-size:12px;margin-bottom:20px}}
.risk-badge{{display:inline-block;padding:6px 16px;border-radius:8px;font-weight:700;font-size:14px;background:{sev_color};margin:10px 0}}
.section{{margin:16px 0;padding:16px;background:#F8FAFC;border-radius:8px;border:1px solid #E2E8F0}}
.footer{{margin-top:40px;padding-top:16px;border-top:1px solid #E2E8F0;font-size:11px;color:#94A3B8}}
</style></head><body>
<h1>🚨 Noodscenario Document</h1>
<div class="meta">
Scenario: {s.get("title","—")}<br>
Type: {s.get("scenario_type","—")} | Risicoscore: {s.get("risk_score",0)}<br>
Installatie: {s.get("installation_ref","—")}<br>
Datum: {datetime.now().strftime("%d-%m-%Y")} | Versie: {s.get("version",1)}
</div>
<div class="risk-badge">Ernst: {s.get("severity","—").upper()} | Waarschijnlijkheid: {s.get("probability","—").upper()}</div>

<h2>1. Scenario Beschrijving</h2>
<div class="section">{s.get("description","Geen beschrijving beschikbaar")}</div>

<h2>2. Betrokken Stoffen</h2>
<div class="section"><pre style="white-space:pre-wrap">{json.dumps(parse(s.get("substances_involved")), indent=2, ensure_ascii=False) if s.get("substances_involved") else "Geen stoffen gespecificeerd"}</pre></div>

<h2>3. Omgevingsfactoren</h2>
<div class="section"><pre style="white-space:pre-wrap">{json.dumps(parse(s.get("environmental_factors")), indent=2, ensure_ascii=False) if s.get("environmental_factors") else "Geen factoren gespecificeerd"}</pre></div>

<h2>4. Evacuatieplan</h2>
<div class="section"><pre style="white-space:pre-wrap">{json.dumps(parse(s.get("evacuation_plan")), indent=2, ensure_ascii=False) if s.get("evacuation_plan") else "Geen evacuatieplan beschikbaar"}</pre></div>

<h2>5. Bestrijdingsplan</h2>
<div class="section"><pre style="white-space:pre-wrap">{json.dumps(parse(s.get("response_plan")), indent=2, ensure_ascii=False) if s.get("response_plan") else "Geen bestrijdingsplan beschikbaar"}</pre></div>

<div class="footer">Gegenereerd door HSEQ Intelligence Dashboard — JvG Consultancy<br>{datetime.now().strftime("%d-%m-%Y %H:%M")}</div>
</body></html>'''

    return jsonify({'html': html, 'title': s.get('title', 'Noodscenario')})


# ═══════════════════════════════════════════════════════════════════════════
# Route Registration
# ═══════════════════════════════════════════════════════════════════════════

def register_brzo_routes(app, page_fn, BASE_PATH="/hseq-dashboard"):
    _page = page_fn

    # ── UI Page ──
    @app.route(BASE_PATH + '/brzo-seveso')
    def brzo_seveso_page():
        body = '''
        <style>
        .brzo-tabs{display:flex;gap:4px;margin-bottom:20px;flex-wrap:wrap}
        .brzo-tab{padding:8px 16px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;border:1px solid #E2E8F0;background:#fff;color:#64748B;transition:all .15s}
        .brzo-tab:hover,.brzo-tab.active{background:#1B2A4A;color:#fff;border-color:#1B2A4A}
        .brzo-panel{display:none}
        .brzo-panel.active{display:block}
        .brzo-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin-bottom:20px}
        .brzo-stat{background:#fff;border-radius:8px;padding:16px;text-align:center;border:1px solid #E2E8F0}
        .brzo-stat .val{font-size:28px;font-weight:700;color:#1B2A4A}
        .brzo-stat .lbl{font-size:11px;color:#64748B;margin-top:4px;text-transform:uppercase;letter-spacing:.5px}
        .brzo-card{background:#fff;border-radius:8px;padding:16px;border:1px solid #E2E8F0;margin-bottom:12px;transition:all .2s}
        .brzo-card:hover{box-shadow:0 4px 12px rgba(0,0,0,.08)}
        .brzo-card h3{font-size:14px;color:#1B2A4A;margin-bottom:8px}
        .brzo-btn{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;border:none;transition:all .15s}
        .brzo-btn-primary{background:#1B2A4A;color:#fff}
        .brzo-btn-primary:hover{background:#2D4A7A}
        .brzo-btn-accent{background:#3B82F6;color:#fff}
        .brzo-btn-accent:hover{background:#2563EB}
        .brzo-btn-success{background:#10B981;color:#fff}
        .brzo-btn-danger{background:#EF4444;color:#fff}
        .brzo-btn-outline{background:transparent;color:#1B2A4A;border:1px solid #E2E8F0}
        .brzo-table{width:100%;border-collapse:collapse;font-size:13px}
        .brzo-table th{background:#0A1628;color:#fff;padding:10px 12px;text-align:left;font-size:12px}
        .brzo-table td{padding:10px 12px;border-bottom:1px solid #E2E8F0}
        .brzo-table tr:hover td{background:#F8FAFC}
        .vbs-bar{height:8px;background:#E2E8F0;border-radius:4px;overflow:hidden;margin-top:6px}
        .vbs-bar-fill{height:100%;border-radius:4px;transition:width .6s}
        .risk-low{color:#059669}.risk-medium{color:#D97706}.risk-high{color:#DC2626}.risk-extreme{color:#991B1B}
        .modal-bg{display:none;position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:200;align-items:center;justify-content:center}
        .modal-bg.active{display:flex}
        .modal-box{background:#fff;border-radius:12px;padding:24px;width:90%;max-width:640px;max-height:85vh;overflow-y:auto}
        .modal-box h3{font-size:16px;color:#0A1628;margin-bottom:16px}
        .modal-box label{font-size:12px;font-weight:500;color:#475569;display:block;margin-bottom:4px;margin-top:12px}
        .modal-box input,.modal-box select,.modal-box textarea{width:100%;padding:8px 12px;border:1px solid #E2E8F0;border-radius:6px;font-size:13px;font-family:inherit;box-sizing:border-box}
        .modal-box textarea{min-height:80px;resize:vertical}
        .checklist-item{display:flex;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid #F1F5F9}
        .checklist-item .ci-cat{font-size:10px;color:#64748B;background:#F1F5F9;padding:2px 8px;border-radius:4px;min-width:80px;text-align:center}
        .checklist-item .ci-text{flex:1;font-size:13px}
        .checklist-item .ci-status{padding:4px 12px;border-radius:4px;font-size:11px;font-weight:600;cursor:pointer;border:1px solid #E2E8F0}
        .ci-pending{background:#fff;color:#64748B}
        .ci-compliant{background:#D1FAE5;color:#065F46;border-color:#D1FAE5}
        .ci-non-compliant{background:#FEE2E2;color:#991B1B;border-color:#FEE2E2}
        .ci-na{background:#F1F5F9;color:#94A3B8;border-color:#F1F5F9}
        .empty-state{text-align:center;padding:40px;color:#94A3B8}
        </style>

        <div style="margin-bottom:20px">
          <a href="{{BASE_PATH}}/" class="brzo-btn brzo-btn-outline">&#x2190; Dashboard</a>
        </div>

        <div class="card" style="background:linear-gradient(135deg,#0A1628,#1B2A4A);color:#fff;border:none;margin-bottom:20px">
          <div style="display:flex;align-items:center;gap:16px">
            <div style="width:56px;height:56px;border-radius:12px;background:rgba(255,255,255,.15);display:flex;align-items:center;justify-content:center;font-size:28px">&#x1F3ED;</div>
            <div>
              <h2 style="margin:0;color:#fff;font-size:20px">BRZO / Seveso Dienst</h2>
              <p style="margin:4px 0 0;font-size:12px;color:rgba(255,255,255,.7)">MAPP, ARIE, Veiligheidsrapport, VBS Tracker, Inspecties &amp; Noodscenario's</p>
            </div>
          </div>
        </div>

        <!-- Stats -->
        <div class="brzo-grid" id="brzoStats"></div>

        <!-- Tabs -->
        <div class="brzo-tabs">
          <div class="brzo-tab active" onclick="switchTab('mapp')">&#x1F4C4; MAPP</div>
          <div class="brzo-tab" onclick="switchTab('arie')">&#x1F4CA; ARIE</div>
          <div class="brzo-tab" onclick="switchTab('veiligheidsrapport')">&#x1F6E1;&#xFE0F; Veiligheidsrapport</div>
          <div class="brzo-tab" onclick="switchTab('vbs')">&#x1F4C8; VBS Tracker</div>
          <div class="brzo-tab" onclick="switchTab('inspectie')">&#x1F50D; Inspectie</div>
          <div class="brzo-tab" onclick="switchTab('noodscenario')">&#x1F6A8; Noodscenario's</div>
        </div>

        <!-- MAPP Panel -->
        <div class="brzo-panel active" id="panel-mapp">
          <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">
            <h2 style="margin:0;font-size:16px;color:#0A1628">Major Accident Prevention Policy</h2>
            <button class="brzo-btn brzo-btn-primary" onclick="openMappModal()">+ Nieuwe MAPP</button>
          </div>
          <div id="mappList"></div>
        </div>

        <!-- ARIE Panel -->
        <div class="brzo-panel" id="panel-arie">
          <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">
            <h2 style="margin:0;font-size:16px;color:#0A1628">Algemene Risicoanalyse</h2>
            <div style="display:flex;gap:8px">
              <button class="brzo-btn brzo-btn-outline" onclick="loadArieCrossRef()">&#x1F504; Stoffen & Scenario's</button>
              <button class="brzo-btn brzo-btn-primary" onclick="openArieModal()">+ Nieuwe ARIE</button>
            </div>
          </div>
          <div id="arieList"></div>
        </div>

        <!-- Veiligheidsrapport Panel -->
        <div class="brzo-panel" id="panel-veiligheidsrapport">
          <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">
            <h2 style="margin:0;font-size:16px;color:#0A1628">Veiligheidsrapport (Upper Tier)</h2>
            <button class="brzo-btn brzo-btn-primary" onclick="openSRModal()">+ Nieuw Rapport</button>
          </div>
          <div class="card" style="border-left:4px solid #F59E0B;padding:12px;margin-bottom:16px">
            <p style="font-size:12px;color:#92400E">&#x26A0;&#xFE0F; Veiligheidsrapporten zijn alleen beschikbaar voor <strong>upper tier</strong> BRZO-bedrijven (conform artikel 9 BRZO 2015).</p>
          </div>
          <div id="srList"></div>
        </div>

        <!-- VBS Tracker Panel -->
        <div class="brzo-panel" id="panel-vbs">
          <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">
            <h2 style="margin:0;font-size:16px;color:#0A1628">VBS-elementen Compliance Tracker</h2>
            <button class="brzo-btn brzo-btn-primary" onclick="initVbsCompliance()">&#x1F504; Initialiseren</button>
          </div>
          <div id="vbsTracker"></div>
        </div>

        <!-- Inspectie Panel -->
        <div class="brzo-panel" id="panel-inspectie">
          <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">
            <h2 style="margin:0;font-size:16px;color:#0A1628">BRZO Inspectie Voorbereiding</h2>
            <button class="brzo-btn brzo-btn-primary" onclick="createInspection()">&#x2795; Nieuwe Checklist</button>
          </div>
          <div id="inspList"></div>
        </div>

        <!-- Noodscenario Panel -->
        <div class="brzo-panel" id="panel-noodscenario">
          <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">
            <h2 style="margin:0;font-size:16px;color:#0A1628">Noodscenario Planning</h2>
            <button class="brzo-btn brzo-btn-primary" onclick="openScenarioModal()">+ Nieuw Scenario</button>
          </div>
          <div id="scenList"></div>
        </div>

        <!-- Modals -->
        <div class="modal-bg" id="modalMapp">
          <div class="modal-box">
            <h3>&#x1F4C4; Nieuwe MAPP</h3>
            <label>Bedrijfsnaam *</label><input id="mappCompany" placeholder="Phoenix Metals B.V.">
            <label>Inrichting ID</label><input id="mappEstab" placeholder="BV-1234">
            <label>BRZO Tier</label><select id="mappTier"><option value="lower">Lower Tier</option><option value="upper">Upper Tier</option></select>
            <label>Veiligheidsdoelstellingen (JSON array)</label>
            <textarea id="mappObjectives" placeholder='["Doel 1", "Doel 2"]'></textarea>
            <label>Beleidspunten (JSON array)</label>
            <textarea id="mappPolicy" placeholder='["Beleid 1", "Beleid 2"]'></textarea>
            <div style="display:flex;gap:8px;margin-top:16px;justify-content:flex-end">
              <button class="brzo-btn brzo-btn-outline" onclick="closeModal('modalMapp')">Annuleren</button>
              <button class="brzo-btn brzo-btn-primary" onclick="createMapp()">Aanmaken</button>
            </div>
          </div>
        </div>

        <div class="modal-bg" id="modalArie">
          <div class="modal-box">
            <h3>&#x1F4CA; Nieuwe ARIE</h3>
            <label>Bedrijfsnaam *</label><input id="arieCompany" placeholder="Phoenix Metals B.V.">
            <label>Inrichting ID</label><input id="arieEstab" placeholder="BV-1234">
            <label>Scope</label><input id="arieScope" placeholder="Alle BRZO-installaties">
            <label>Methodologie</label><input id="arieMethod" placeholder="HAZOP, LOPA, Bow-Tie">
            <div style="display:flex;gap:8px;margin-top:16px;justify-content:flex-end">
              <button class="brzo-btn brzo-btn-outline" onclick="closeModal('modalArie')">Annuleren</button>
              <button class="brzo-btn brzo-btn-primary" onclick="createArie()">Aanmaken</button>
            </div>
          </div>
        </div>

        <div class="modal-bg" id="modalSR">
          <div class="modal-box">
            <h3>&#x1F6E1;&#xFE0F; Nieuw Veiligheidsrapport</h3>
            <label>Bedrijfsnaam *</label><input id="srCompany" placeholder="Phoenix Metals B.V.">
            <label>Inrichting ID</label><input id="srEstab" placeholder="BV-1234">
            <div class="card" style="border-left:4px solid #F59E0B;padding:12px;margin-top:12px">
              <p style="font-size:12px;color:#92400E">Dit rapport combineert MAPP + ARIE. Koppel bestaande MAPP en ARIE via ID's na aanmaak.</p>
            </div>
            <div style="display:flex;gap:8px;margin-top:16px;justify-content:flex-end">
              <button class="brzo-btn brzo-btn-outline" onclick="closeModal('modalSR')">Annuleren</button>
              <button class="brzo-btn brzo-btn-primary" onclick="createSR()">Aanmaken (Upper Tier)</button>
            </div>
          </div>
        </div>

        <div class="modal-bg" id="modalScenario">
          <div class="modal-box">
            <h3>&#x1F6A8; Nieuw Noodscenario</h3>
            <label>Titel *</label><input id="scTitle" placeholder="Bv. HF-lekkage opslagtank">
            <label>Type</label><select id="scType"><option value="release">Stoflekkage</option><option value="fire">Brand</option><option value="explosion">Explosie</option><option value="bleve">BLEVE</option><option value="toxic">Toxische wolk</option></select>
            <label>Beschrijving</label><textarea id="scDesc" placeholder="Beschrijf het scenario..."></textarea>
            <label>Installatie referentie</label><input id="scInst" placeholder="TK-001">
            <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px">
              <div><label>Ernst</label><select id="scSev"><option value="low">Laag</option><option value="medium" selected>Medium</option><option value="high">Hoog</option><option value="extreme">Extreem</option></select></div>
              <div><label>Waarschijnlijkheid</label><select id="scProb"><option value="very_low">Zeer laag</option><option value="low" selected>Laag</option><option value="medium">Medium</option><option value="high">Hoog</option><option value="very_high">Zeer hoog</option></select></div>
            </div>
            <label>Evacuatieplan (JSON)</label><textarea id="scEvac" placeholder='["Stap 1","Stap 2"]'></textarea>
            <label>Bestrijdingsplan (JSON)</label><textarea id="scResp" placeholder='["Stap 1","Stap 2"]'></textarea>
            <div style="display:flex;gap:8px;margin-top:16px;justify-content:flex-end">
              <button class="brzo-btn brzo-btn-outline" onclick="closeModal('modalScenario')">Annuleren</button>
              <button class="brzo-btn brzo-btn-primary" onclick="createScenario()">Aanmaken</button>
            </div>
          </div>
        </div>

        <div class="modal-bg" id="modalView">
          <div class="modal-box" style="max-width:800px">
            <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px">
              <h3 id="viewTitle" style="margin:0"></h3>
              <button class="brzo-btn brzo-btn-outline" onclick="closeModal('modalView')">&#x2715;</button>
            </div>
            <div id="viewContent" style="max-height:70vh;overflow-y:auto"></div>
          </div>
        </div>

        <script>
        const BP = '{{BASE_PATH}}';

        function switchTab(tab) {
          document.querySelectorAll('.brzo-tab').forEach((t,i) => {
            t.classList.toggle('active', t.textContent.toLowerCase().includes(tab.substring(0,4)));
          });
          document.querySelectorAll('.brzo-panel').forEach(p => p.classList.remove('active'));
          const panel = document.getElementById('panel-' + tab);
          if (panel) panel.classList.add('active');
          // Load data on tab switch
          if (tab === 'mapp') loadMapp();
          else if (tab === 'arie') loadArie();
          else if (tab === 'veiligheidsrapport') loadSR();
          else if (tab === 'vbs') loadVbsTracker();
          else if (tab === 'inspectie') loadInspections();
          else if (tab === 'noodscenario') loadScenarios();
        }

        function openModal(id) { document.getElementById(id).classList.add('active'); }
        function closeModal(id) { document.getElementById(id).classList.remove('active'); }

        function showView(title, html) {
          document.getElementById('viewTitle').textContent = title;
          document.getElementById('viewContent').innerHTML = html;
          openModal('modalView');
        }

        async function loadStats() {
          try {
            const [m, a, s, v, i, e] = await Promise.all([
              fetch(BP+'/api/brzo/mapp').then(r=>r.json()),
              fetch(BP+'/api/brzo/arie').then(r=>r.json()),
              fetch(BP+'/api/brzo/safety-report').then(r=>r.json()),
              fetch(BP+'/api/brzo/vbs-compliance').then(r=>r.json()),
              fetch(BP+'/api/brzo/inspection').then(r=>r.json()),
              fetch(BP+'/api/brzo/scenarios').then(r=>r.json())
            ]);
            document.getElementById('brzoStats').innerHTML =
              '<div class="brzo-stat"><div class="val">'+m.length+'</div><div class="lbl">MAPP</div></div>'+
              '<div class="brzo-stat"><div class="val">'+a.length+'</div><div class="lbl">ARIE</div></div>'+
              '<div class="brzo-stat"><div class="val">'+s.length+'</div><div class="lbl">Veiligheidsrapporten</div></div>'+
              '<div class="brzo-stat"><div class="val" style="color:'+(v.overall_compliance_pct>=80?'#059669':v.overall_compliance_pct>=50?'#D97706':'#DC2626')+'">'+v.overall_compliance_pct+'%</div><div class="lbl">VBS Compliance</div></div>'+
              '<div class="brzo-stat"><div class="val">'+i.length+'</div><div class="lbl">Inspecties</div></div>'+
              '<div class="brzo-stat"><div class="val">'+e.length+'</div><div class="lbl">Noodscenario\'s</div></div>';
          } catch(e) { console.error(e); }
        }

        // ── MAPP ──
        async function loadMapp() {
          const rows = await fetch(BP+'/api/brzo/mapp').then(r=>r.json());
          if (!rows.length) { document.getElementById('mappList').innerHTML='<div class="empty-state"><p>Geen MAPP documenten. Maak de eerste aan.</p></div>'; return; }
          document.getElementById('mappList').innerHTML = rows.map(m =>
            '<div class="brzo-card"><div style="display:flex;justify-content:space-between;align-items:center"><h3>'+m.title+'</h3><div style="display:flex;gap:6px">'+
            '<span class="badge badge-'+(m.status||'draft')+'">'+m.status+'</span>'+
            '<button class="brzo-btn brzo-btn-accent" onclick="genMappHtml('+m.id+')">HTML</button>'+
            '</div></div><div style="font-size:12px;color:#64748B;margin-top:4px">'+m.company_name+' | '+m.brzo_tier+' tier | v'+m.version+' | '+m.updated_at+'</div></div>'
          ).join('');
        }
        function openMappModal() { openModal('modalMapp'); }
        async function createMapp() {
          const obj = document.getElementById('mappObjectives').value.trim();
          const pol = document.getElementById('mappPolicy').value.trim();
          const data = { company_name: document.getElementById('mappCompany').value, establishment_id: document.getElementById('mappEstab').value,
            brzo_tier: document.getElementById('mappTier').value,
            safety_objectives: obj ? JSON.parse(obj) : [], policy_text: pol ? JSON.parse(pol) : [] };
          const r = await fetch(BP+'/api/brzo/mapp', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(data)});
          if (r.ok) { closeModal('modalMapp'); loadMapp(); loadStats(); } else alert('Fout bij aanmaken');
        }
        async function genMappHtml(id) {
          const r = await fetch(BP+'/api/brzo/mapp/'+id+'/html');
          const d = await r.json();
          const w = window.open('','_blank');
          w.document.write(d.html); w.document.close();
        }

        // ── ARIE ──
        async function loadArie() {
          const rows = await fetch(BP+'/api/brzo/arie').then(r=>r.json());
          if (!rows.length) { document.getElementById('arieList').innerHTML='<div class="empty-state"><p>Geen ARIE rapporten. Maak de eerste aan.</p></div>'; return; }
          document.getElementById('arieList').innerHTML = rows.map(a =>
            '<div class="brzo-card"><div style="display:flex;justify-content:space-between;align-items:center"><h3>'+a.title+'</h3><div style="display:flex;gap:6px">'+
            '<span class="badge badge-'+(a.status||'draft')+'">'+a.status+'</span>'+
            '<button class="brzo-btn brzo-btn-accent" onclick="genArieHtml('+a.id+')">HTML</button>'+
            '</div></div><div style="font-size:12px;color:#64748B;margin-top:4px">'+a.company_name+' | '+a.methodology+' | v'+a.version+'</div></div>'
          ).join('');
        }
        function openArieModal() { openModal('modalArie'); }
        async function createArie() {
          const data = { company_name: document.getElementById('arieCompany').value, establishment_id: document.getElementById('arieEstab').value,
            scope: document.getElementById('arieScope').value, methodology: document.getElementById('arieMethod').value };
          const r = await fetch(BP+'/api/brzo/arie', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(data)});
          if (r.ok) { closeModal('modalArie'); loadArie(); loadStats(); } else alert('Fout bij aanmaken');
        }
        async function loadArieCrossRef() {
          const d = await fetch(BP+'/api/brzo/arie/cross-reference').then(r=>r.json());
          let html = '<h4 style="color:#0A1628">Stoffenbibliotheek ('+d.substance_count+')</h4><table class="brzo-table"><thead><tr><th>Stof</th><th>CAS</th></tr></thead><tbody>';
          d.substance_library.forEach(s => html += '<tr><td>'+s.substance_name+'</td><td>'+(s.cas_number||'')+'</td></tr>');
          html += '</tbody></table>';
          html += '<h4 style="color:#0A1628;margin-top:16px">Risicoscenario\'s ('+d.scenario_count+')</h4><table class="brzo-table"><thead><tr><th>Code</th><th>Titel</th></tr></thead><tbody>';
          d.risk_scenarios.forEach(s => html += '<tr><td>'+s.code+'</td><td>'+s.title+'</td></tr>');
          html += '</tbody></table>';
          showView('ARIE Cross-Reference', html);
        }
        async function genArieHtml(id) {
          const r = await fetch(BP+'/api/brzo/arie/'+id+'/html');
          const d = await r.json();
          const w = window.open('','_blank'); w.document.write(d.html); w.document.close();
        }

        // ── Veiligheidsrapport ──
        async function loadSR() {
          const rows = await fetch(BP+'/api/brzo/safety-report').then(r=>r.json());
          if (!rows.length) { document.getElementById('srList').innerHTML='<div class="empty-state"><p>Geen veiligheidsrapporten.</p></div>'; return; }
          document.getElementById('srList').innerHTML = rows.map(s =>
            '<div class="brzo-card"><div style="display:flex;justify-content:space-between;align-items:center"><h3>'+s.title+'</h3><div style="display:flex;gap:6px">'+
            '<span class="badge badge-'+(s.status||'draft')+'">'+s.status+'</span>'+
            '<button class="brzo-btn brzo-btn-accent" onclick="genSRHtml('+s.id+')">HTML</button>'+
            '</div></div><div style="font-size:12px;color:#64748B;margin-top:4px">'+s.company_name+' | MAPP: '+(s.mapp_id||'-')+' | ARIE: '+(s.arie_id||'-')+' | v'+s.version+'</div></div>'
          ).join('');
        }
        function openSRModal() { openModal('modalSR'); }
        async function createSR() {
          const data = { company_name: document.getElementById('srCompany').value, establishment_id: document.getElementById('srEstab').value, brzo_tier: 'upper' };
          const r = await fetch(BP+'/api/brzo/safety-report', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(data)});
          if (r.ok) { closeModal('modalSR'); loadSR(); loadStats(); } else { const d = await r.json(); alert(d.error || 'Fout'); }
        }
        async function genSRHtml(id) {
          const r = await fetch(BP+'/api/brzo/safety-report/'+id+'/html');
          const d = await r.json();
          const w = window.open('','_blank'); w.document.write(d.html); w.document.close();
        }

        // ── VBS Tracker ──
        async function loadVbsTracker() {
          const d = await fetch(BP+'/api/brzo/vbs-compliance').then(r=>r.json());
          const color = d.overall_compliance_pct >= 80 ? '#10B981' : d.overall_compliance_pct >= 50 ? '#F59E0B' : '#EF4444';
          let html = '<div class="brzo-grid" style="margin-bottom:16px">';
          html += '<div class="brzo-stat"><div class="val" style="color:'+color+'">'+d.overall_compliance_pct+'%</div><div class="lbl">Overall Compliance</div></div>';
          html += '<div class="brzo-stat"><div class="val" style="color:'+(d.total_gaps>0?'#EF4444':'#10B981')+'">'+d.total_gaps+'</div><div class="lbl">Open Gaps</div></div></div>';
          html += '<table class="brzo-table"><thead><tr><th>Code</th><th>Element</th><th>Compliance</th><th>Status</th><th>Review</th></tr></thead><tbody>';
          d.elements.forEach(e => {
            const pct = e.compliance_pct || 0;
            const c = pct >= 80 ? '#10B981' : pct >= 50 ? '#F59E0B' : '#EF4444';
            const st = e.status || 'not_started';
            const stLabel = {not_started:'Niet gestart',in_progress:'In uitvoering',compliant:'Compliant',non_compliant:'Niet compliant'}[st] || st;
            html += '<tr><td><strong>'+e.code+'</strong></td><td>'+e.name_nl+'</td>'+
              '<td><div style="display:flex;align-items:center;gap:8px"><div class="vbs-bar" style="width:80px"><div class="vbs-bar-fill" style="width:'+pct+'%;background:'+c+'"></div></div><span style="font-weight:600;color:'+c+'">'+pct+'%</span></div></td>'+
              '<td>'+stLabel+'</td><td style="font-size:12px;color:#64748B">'+(e.next_review || '-')+'</td></tr>';
          });
          html += '</tbody></table>';
          document.getElementById('vbsTracker').innerHTML = html;
        }
        async function initVbsCompliance() {
          const r = await fetch(BP+'/api/brzo/vbs-compliance/init', {method:'POST'});
          if (r.ok) loadVbsTracker(); else alert('Fout bij initialiseren');
        }

        // ── Inspectie ──
        let currentInspId = null;
        async function loadInspections() {
          const rows = await fetch(BP+'/api/brzo/inspection').then(r=>r.json());
          if (!rows.length) { document.getElementById('inspList').innerHTML='<div class="empty-state"><p>Geen inspectie checklists. Maak de eerste aan.</p></div>'; return; }
          document.getElementById('inspList').innerHTML = rows.map(ins =>
            '<div class="brzo-card"><div style="display:flex;justify-content:space-between;align-items:center"><h3>'+ins.title+'</h3><div style="display:flex;gap:6px">'+
            '<span class="badge badge-'+(ins.status||'draft')+'">'+ins.status+'</span>'+
            '<span style="font-size:12px;font-weight:600;color:#1B2A4A">Score: '+ins.score+'%</span>'+
            '<button class="brzo-btn brzo-btn-outline" onclick="openChecklist('+ins.id+')">Checklist</button>'+
            '</div></div><div style="font-size:12px;color:#64748B;margin-top:4px">'+ins.inspection_type+' | '+ins.created_at+'</div></div>'
          ).join('');
        }
        async function createInspection() {
          const r = await fetch(BP+'/api/brzo/inspection', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({title:'BRZO Inspectie '+new Date().toISOString().slice(0,10)})});
          if (r.ok) { loadInspections(); loadStats(); } else alert('Fout bij aanmaken');
        }
        async function openChecklist(id) {
          currentInspId = id;
          const ins = await fetch(BP+'/api/brzo/inspection/'+id).then(r=>r.json());
          let items = [];
          try { items = JSON.parse(ins.items) || []; } catch(e) { items = []; }
          let html = '<div style="margin-bottom:12px;font-size:14px;font-weight:600;color:#0A1628">Score: '+ins.score+'%</div>';
          items.forEach(item => {
            const st = item.status || 'pending';
            const stClass = st === 'compliant' ? 'ci-compliant' : st === 'non_compliant' ? 'ci-non-compliant' : st === 'na' ? 'ci-na' : 'ci-pending';
            html += '<div class="checklist-item">'+
              '<span class="ci-cat">'+(item.category||'')+'</span>'+
              '<span class="ci-text">'+item.item+'</span>'+
              '<span class="ci-status '+stClass+'" onclick="cycleItem('+item.id+',\\''+st+'\\')">'+st.toUpperCase()+'</span>'+
              '</div>';
          });
          showView(ins.title, html);
        }
        async function cycleItem(itemId, current) {
          const next = current === 'pending' ? 'compliant' : current === 'compliant' ? 'non_compliant' : 'na';
          const r = await fetch(BP+'/api/brzo/inspection/'+currentInspId+'/item', {
            method:'PUT', headers:{'Content-Type':'application/json'}, body: JSON.stringify({item_id: itemId, status: next})
          });
          if (r.ok) openChecklist(currentInspId);
        }

        // ── Noodscenario's ──
        async function loadScenarios() {
          const rows = await fetch(BP+'/api/brzo/scenarios').then(r=>r.json());
          if (!rows.length) { document.getElementById('scenList').innerHTML='<div class="empty-state"><p>Geen noodscenario\'s.</p></div>'; return; }
          document.getElementById('scenList').innerHTML = rows.map(s => {
            const sc = s.risk_score >= 50 ? '#EF4444' : s.risk_score >= 20 ? '#F59E0B' : '#10B981';
            return '<div class="brzo-card" style="border-left:4px solid '+sc+'"><div style="display:flex;justify-content:space-between;align-items:center"><h3>'+s.title+'</h3><div style="display:flex;gap:6px">'+
              '<span style="font-weight:700;color:'+sc+'">Risk: '+s.risk_score+'</span>'+
              '<span class="badge badge-'+(s.status||'draft')+'">'+s.status+'</span>'+
              '<button class="brzo-btn brzo-btn-accent" onclick="genScenarioHtml('+s.id+')">HTML</button>'+
              '</div></div><div style="font-size:12px;color:#64748B;margin-top:4px">'+s.scenario_type+' | Ernst: '+s.severity+' | Waarschijnlijkheid: '+s.probability+' | '+s.installation_ref+'</div></div>';
          }).join('');
        }
        function openScenarioModal() { openModal('modalScenario'); }
        async function createScenario() {
          const title = document.getElementById('scTitle').value.trim();
          if (!title) { alert('Titel is verplicht'); return; }
          const ev = document.getElementById('scEvac').value.trim();
          const rp = document.getElementById('scResp').value.trim();
          const data = { title, scenario_type: document.getElementById('scType').value,
            description: document.getElementById('scDesc').value, installation_ref: document.getElementById('scInst').value,
            severity: document.getElementById('scSev').value, probability: document.getElementById('scProb').value,
            evacuation_plan: ev ? JSON.parse(ev) : [], response_plan: rp ? JSON.parse(rp) : [] };
          const r = await fetch(BP+'/api/brzo/scenarios', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(data)});
          if (r.ok) { closeModal('modalScenario'); loadScenarios(); loadStats(); } else alert('Fout bij aanmaken');
        }
        async function genScenarioHtml(id) {
          const r = await fetch(BP+'/api/brzo/scenarios/'+id+'/html');
          const d = await r.json();
          const w = window.open('','_blank'); w.document.write(d.html); w.document.close();
        }

        // Close modals on backdrop click
        document.querySelectorAll('.modal-bg').forEach(m => {
          m.addEventListener('click', e => { if (e.target === m) m.classList.remove('active'); });
        });

        // Init
        loadStats();
        loadMapp();
        </script>
        '''
        return _page(body, page_title='BRZO / Seveso Dienst', page_subtitle='FASE 3 — MAPP, ARIE, Veiligheidsrapport, VBS Tracker, Inspecties & Noodscenario\'s', active='brzo')

    # ── MAPP API ──
    app.add_url_rule(BASE_PATH + '/api/brzo/mapp', view_func=_mapp_list, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/mapp', view_func=_mapp_create, methods=['POST'])
    app.add_url_rule(BASE_PATH + '/api/brzo/mapp/<int:mid>', view_func=_mapp_get, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/mapp/<int:mid>', view_func=_mapp_update, methods=['PUT'])
    app.add_url_rule(BASE_PATH + '/api/brzo/mapp/<int:mid>/html', view_func=_mapp_generate_html, methods=['GET'])

    # ── ARIE API ──
    app.add_url_rule(BASE_PATH + '/api/brzo/arie', view_func=_arie_list, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/arie', view_func=_arie_create, methods=['POST'])
    app.add_url_rule(BASE_PATH + '/api/brzo/arie/<int:aid>', view_func=_arie_get, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/arie/<int:aid>', view_func=_arie_update, methods=['PUT'])
    app.add_url_rule(BASE_PATH + '/api/brzo/arie/cross-reference', view_func=_arie_cross_reference, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/arie/<int:aid>/html', view_func=_arie_generate_html, methods=['GET'])

    # ── Veiligheidsrapport API ──
    app.add_url_rule(BASE_PATH + '/api/brzo/safety-report', view_func=_safety_report_list, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/safety-report', view_func=_safety_report_create, methods=['POST'])
    app.add_url_rule(BASE_PATH + '/api/brzo/safety-report/<int:srid>/html', view_func=_safety_report_generate_html, methods=['GET'])

    # ── VBS Compliance API ──
    app.add_url_rule(BASE_PATH + '/api/brzo/vbs-compliance', view_func=_vbs_compliance_dashboard, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/vbs-compliance/init', view_func=_vbs_compliance_init, methods=['POST'])
    app.add_url_rule(BASE_PATH + '/api/brzo/vbs-compliance/<int:vid>', view_func=_vbs_compliance_update, methods=['PUT'])
    app.add_url_rule(BASE_PATH + '/api/brzo/vbs-compliance/action-items', view_func=_vbs_compliance_action_items, methods=['GET'])

    # ── Inspectie API ──
    app.add_url_rule(BASE_PATH + '/api/brzo/inspection', view_func=_brzo_inspection_list, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/inspection', view_func=_brzo_inspection_create, methods=['POST'])
    app.add_url_rule(BASE_PATH + '/api/brzo/inspection/<int:iid>', view_func=_brzo_inspection_get, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/inspection/<int:iid>/item', view_func=_brzo_inspection_update_item, methods=['PUT'])
    app.add_url_rule(BASE_PATH + '/api/brzo/inspection/template', view_func=_brzo_inspection_template, methods=['GET'])

    # ── Noodscenario API ──
    app.add_url_rule(BASE_PATH + '/api/brzo/scenarios', view_func=_emergency_scenarios_list, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/scenarios', view_func=_emergency_scenario_create, methods=['POST'])
    app.add_url_rule(BASE_PATH + '/api/brzo/scenarios/<int:eid>', view_func=_emergency_scenario_get, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/scenarios/<int:eid>', view_func=_emergency_scenario_update, methods=['PUT'])
    app.add_url_rule(BASE_PATH + '/api/brzo/scenarios/matrix', view_func=_emergency_scenario_matrix, methods=['GET'])
    app.add_url_rule(BASE_PATH + '/api/brzo/scenarios/<int:eid>/html', view_func=_emergency_scenario_generate_html, methods=['GET'])
