#!/usr/bin/env python3
"""Baut SupplierPulse_QAF_Compare_V7.html: V6-Head/Style byte-identisch übernommen,
Body um Template-Status/Review/Plausibilität/i18n/JSON-Export erweitert,
Scripts (SheetJS, ECharts, Palette, Core v7, Engine, App-UI v7) base64-inlined.
Self-contained, kein CDN, keine externen Requests."""
import base64
import re
from pathlib import Path

ROOT = Path(__file__).parent
v6 = (ROOT / 'input/SupplierPulse_QAF_Compare_V6.html').read_text(encoding='utf-8')

# --- Head + Style aus V6 (bis vor </style>) ---
marker = '</style></head><body>'
head = v6.split(marker)[0]

EXTRA_CSS = """
/* --- V7 (KAR-824): Review/Plausibilität/i18n --- */
.chip{display:inline-block;padding:1px 7px;border-radius:9px;font-size:10.5px;font-weight:700;vertical-align:1px}
.chip.ok{background:#e3efe3;color:#3C6A3C}.chip.warn{background:#fdf3d7;color:#8a6d1a}
.chip.rev{background:#fbe4df;color:#C0392B}.chip.err{background:#C0392B;color:#fff}
.chip.inf{background:#e6edef;color:#5B6B73}.chip.new{background:#e0f0f5;color:#037493}.chip.rem{background:#eee;color:#777}
ul.rvw{list-style:none;margin:6px 0;padding:0}
ul.rvw li{padding:5px 10px;border-left:3px solid #E6EDEF;margin:3px 0;background:#fafcfc;font-size:12.5px}
ul.rvw li.rev{border-color:#C0392B}ul.rvw li.err{border-color:#C0392B;background:#fbe4df}
ul.rvw li.warn{border-color:#d9a91a}ul.rvw li.ok{border-color:#3C6A3C}
ul.rvw li.new{border-color:#037493}ul.rvw li.rem{border-color:#999}
.mono{font-family:ui-monospace,Consolas,monospace;font-size:11px}
#langbtn{min-width:36px}
#sum-meta td:first-child{color:var(--mut);width:190px}
#sum-diff td.c,#sum-onetime td.c{white-space:nowrap}
/* --- V9: Same-Value-Markierung + Nicht-verfügbar-Platzhalter --- */
tr.same td,td.same{color:var(--mut)}
tr.same{background:#fafbfb}
.chip.same{background:#eef2f2;color:#8a969b;font-weight:800}
.para.na{border-color:#c2ccd1;color:var(--mut)}
/* --- V10: kanonischer View --- */
.chip.scen{background:#f0e8f5;color:#6b4d80}
#mixbanner{background:#fbe4df;border:1px solid #C0392B;color:#C0392B;font-weight:700;padding:10px 14px;border-radius:8px;margin-bottom:10px}
.tip{cursor:help;color:var(--pet);font-size:12px}
td.chg{color:#8a3b2a}
#master td:first-child{color:var(--mut);width:190px}
.pgrid{display:flex;flex-wrap:wrap;gap:8px 18px;margin-top:6px}
.pgrid .pctl{display:flex;align-items:center;gap:6px;font-size:12px}
.pgrid input{width:80px;padding:3px 6px;border:1px solid #cfd8db;border-radius:5px}
#cmpbar select,#proc-cmp-body select{padding:3px 6px;border:1px solid #cfd8db;border-radius:5px;max-width:280px}
#vol-table input[type=number]{width:110px}
"""

BODY = """</style></head><body><div class="wrap">

<header class="top"><h1 data-i18n="title">SupplierPulse · QAF-Vergleich</h1>
  <div><span class="src" id="srcline"></span>
    <button class="btn" id="langbtn" style="margin-left:10px;background:#5b6b73">EN</button>
    <button class="btn hidden" id="jsonbtn" data-i18n="json" style="margin-left:6px;background:#5b6b73">⬇ JSON-Export</button>
    <button class="btn hidden" id="pdfbtn" data-i18n="pdf" style="margin-left:6px">📄 PDF-Report</button>
    <button class="btn hidden" id="reload" data-i18n="reload" style="margin-left:6px;background:#5b6b73">Neu laden</button></div>
</header>

<div id="upload">
  <div id="dropall"><h2 style="color:var(--pet);margin:0 0 4px" data-i18n="drop_h">Zwei QAF-Dateien hierher ziehen</h2>
    <div class="hint" data-i18n="drop_hint">Drag &amp; Drop der beiden <b>.xlsx/.xlsm</b> — Auswertung startet automatisch.</div>
    <div class="slots"><div class="slot" id="slotB"><h3 data-i18n="slot_a">① QAF ALT (Vergabe / Basis)</h3><div class="fname">ALT-QAF ablegen</div><input type="file" accept=".xlsm,.xlsx"></div>
      <div class="slot" id="slotR"><h3 data-i18n="slot_b">② QAF NEU (RePricing / aktuell)</h3><div class="fname">NEU-QAF ablegen</div><input type="file" accept=".xlsm,.xlsx"></div></div>
    <div class="slots" style="margin-top:8px"><div class="slot" id="slotC"><h3>③ <span data-i18n="slot_opt">optional: weiterer Stand</span></h3><div class="fname">—</div><input type="file" accept=".xlsm,.xlsx"></div>
      <div class="slot" id="slotD"><h3>④ <span data-i18n="slot_opt">optional: weiterer Stand</span></h3><div class="fname">—</div><input type="file" accept=".xlsm,.xlsx"></div></div>
    <div style="text-align:center;margin-top:10px"><button class="btn hidden" id="startbtn" data-i18n-skip disabled>Vergleich starten</button>
      <button class="mini" id="clearall" data-i18n="clear_all" style="margin-left:10px">Alle entfernen</button></div>
    <div class="hint" id="manage-hint" style="margin-top:6px"></div>
    <div class="hint" data-i18n="local_note">Alles läuft lokal im Browser — keine Daten verlassen den Rechner.</div></div>
</div>

<div id="app" class="hidden">
  <div id="mixbanner" class="hidden"></div>
  <div class="para" id="tplstatus" style="margin-bottom:8px"></div>
  <div class="tabs"><div class="tab active" data-tab="meta" data-i18n="tab_meta">Tab 1 · Meta-Vergleich</div><div class="tab" data-tab="proc" data-i18n="tab_proc">Tab 2 · Prozessanalyse</div></div>

  <!-- ============ TAB 1 · kanonisch für alle QAF-Typen ============ -->
  <div id="tab-meta">
    <div class="cmpbar" id="cmpbar"></div>
    <div class="kpis" id="kpis"></div>
    <div class="para" id="kern"></div>
    <div id="reviewdetail" class="hidden"></div>

    <section id="sec-master"><h2 data-i18n="sec_master">Stammdaten &amp; Dateien</h2>
      <table id="master"><thead></thead><tbody></tbody></table></section>

    <section id="sec-form"><h2 data-i18n="sec_form">QAF-Übersicht (Form-Ansicht)</h2>
      <table id="formtable"><thead></thead><tbody></tbody></table>
      <div class="sub" id="form-note"></div></section>

    <section id="sec1"><h2>1 · Kostenstruktur</h2>
      <div class="sub" id="sec1-note"></div>
      <div id="c-cost" class="chart"></div></section>

    <section id="sec2"><h2 data-i18n="sec2">2 · Woher der Unterschied kommt (Brücke + Vergleichstabelle)</h2>
      <div id="c-water" class="chart" style="height:380px"></div>
      <table id="bridge-table"><thead></thead><tbody></tbody></table></section>

    <section id="sec3"><h2 data-i18n="sec3">3 · Produktionssicht / Raten</h2>
      <div id="sec3-body"></div>
      <div id="c-prod" class="chart" style="height:300px"></div>
      <div class="sub" id="sec3-note"></div></section>

    <section id="sec4"><h2>4 · Größte Preistreiber</h2>
      <div id="sec4-note"></div>
      <div id="c-mover" class="chart" style="height:220px"></div></section>

    <section id="sec5"><h2 data-i18n="sec5">5 · Hochrechnung &amp; Potenzial in € (interaktiv)</h2>
      <div id="sec5-note"></div>
      <div class="split"><div class="left"><table id="vol-table" class="vol-table"><thead></thead><tbody></tbody></table></div>
        <div class="right"><div id="c-year" class="chart" style="height:300px"></div></div></div>
      <div class="para" id="proj-summary"></div></section>

    <section id="sec6"><h2 data-i18n="sec6">6 · Verhandlung — Quick Wins &amp; Große Bringer</h2><div id="sec6-body"></div></section>
    <section id="sec7"><h2 data-i18n="sec7">7 · Die Hebel — und wie wir sie kontern</h2><div id="sec7-body"></div></section>
    <section id="sec8"><h2 data-i18n="sec8">8 · Anomalien &amp; Treiber (Master-Sätze im INPUT-Blatt)</h2><div id="sec8-body"></div></section>

    <section id="sec-onetime" class="hidden"><h2 data-i18n="onetime">Einmalzahlungen</h2>
      <table id="onetime-table"><thead></thead><tbody></tbody></table></section>

    <section id="sec-review"><h2 data-i18n="sec_review">Matching Review</h2><div id="review"></div></section>
    <section id="sec-plaus"><h2 data-i18n="sec_plaus">Plausibilitätscheck</h2><div id="plaus"></div></section>
    <section id="sec-ai"><h2 data-i18n="sec_ai">KI-Zusammenfassung (optional)</h2><div id="aibox"></div></section>
  </div>

  <!-- ============ TAB 2 · Prozessanalyse (alle QAF-Typen) ============ -->
  <div id="tab-proc" class="hidden">
    <section id="proc-cmp-sec"><h2 data-i18n="proc_cmp">Prozessvergleich (Fertigungskosten / MANUFACTURING COSTS)</h2>
      <div id="proc-cmp-body"></div></section>

    <section id="g60-editor-sec" class="hidden"><h2 data-i18n="proc_detail">Prozess-Kennzahlen (editierbar → Auswertung rechnet live)</h2>
      <div class="procbar"><b data-i18n="pos">Position:</b><select id="procPos"></select><b style="margin-left:12px" data-i18n="scn">Szenario:</b><select id="procScn"></select>
        <button class="mini" id="proc-reset" data-i18n="pos_reset" style="margin-left:auto">Position zurücksetzen</button></div>
      <div class="para" id="proc-head"></div>
      <div class="sub" data-i18n="g60_editor_note" style="margin-bottom:6px"></div>
      <table id="proc-table"><thead></thead><tbody></tbody></table>
      <div id="proc-charts"></div></section>

    <section id="scen-sec"><h2 data-i18n="scen_params">Szenario-Parameter (Bestandsaufnahme / Potential)</h2>
      <div id="scen-body"></div></section>
  </div>

  <div class="foot" data-i18n="foot">SupplierPulse · QAF-Vergleich · BMW-Palette · vertraulich (Lieferanten-Kalkulation) · Berechnung lokal im Browser.</div>
</div>

</div>
{SCRIPTS}
</body></html>
"""

SCRIPT_FILES = [
    'v6-extracted/lib-sheetjs.js',
    'v6-extracted/lib-echarts.js',
    'v7-src/mod-palette.js',
    'v7-src/mod-qaf-core.js',
    'v7-src/mod-qaf-engine.js',
    'v7-src/mod-app-ui-v10.js',
]

scripts = []
for f in SCRIPT_FILES:
    code = (ROOT / f).read_bytes()
    b64 = base64.b64encode(code).decode('ascii')
    scripts.append(f'<script src="data:text/javascript;base64,{b64}"></script>')

out = head + EXTRA_CSS + BODY.replace('{SCRIPTS}', '\n'.join(scripts))
dest = ROOT / 'SupplierPulse_QAF_Compare_V20.html'
dest.write_text(out, encoding='utf-8')

# Sicherheits-Check: keine externen Referenzen
externals = re.findall(r'(?:src|href)\s*=\s*"(?!data:)([^"]+)"', out)
externals = [e for e in externals if e.startswith(('http', '//'))]
print(f'V7 gebaut: {dest} ({dest.stat().st_size/1e6:.2f} MB)')
print(f'Externe Referenzen: {externals or "KEINE ✓"}')
print(f'Scripts inlined: {len(scripts)}')
