#!/usr/bin/env python3
"""Erzeugt den klickbaren Prototyp als EINE Datei mit eingebetteten Daten.

Liest profil-deeg.json und referenzprojekte.json und schreibt zwei Dateien:
bob-prototyp.html (vollstaendige Seite, laeuft am Server mit Bildgenerierung) und
bob-artifact.html (dieselbe Seite ohne Rahmen, fuer die Veroeffentlichung als Artifact).
Laeuft ohne Server, ohne Internet, ohne Schluessel. Die Preisrechnung ist in
JavaScript nachgebaut und muss dieselben Werte liefern wie preisrechner.py.
"""
import base64, json, pathlib, re, sys

HIER = pathlib.Path(__file__).parent
P4 = HIER.parent

# Ein Mandant je Aufruf. Die Vorlage ist mandantenfaehig, weil alles Betriebliche
# im Profil steht — Name, Texte, Telefonnummer, Bandregel, Referenzdatei.
#   python3 bauen.py          -> deeg
#   python3 bauen.py demo     -> profil-demo.json, bob-demo.html
MANDANT = sys.argv[1] if len(sys.argv) > 1 else 'deeg'
profil = json.loads((P4 / f'profil-{MANDANT}.json').read_text(encoding='utf-8'))
refs = json.loads((P4 / profil.get('referenzdatei', f'referenzprojekte-{MANDANT}.json')
                   ).read_text(encoding='utf-8'))['projekte']

# Nur was der Prototyp braucht — haelt die Datei klein
schlank = [{k: r[k] for k in ('nr','name','objektart','front_stufe','arbeitsplatte',
            'nischenrueckwand','geraetesegment','besonderheiten','preis_brutto','front_text',
            'arbeitsplatte_text','url','bild','zuschnitt')} for r in refs]

def datenuri(name):
    roh = (HIER / name).read_bytes()
    return 'data:image/jpeg;base64,' + base64.b64encode(roh).decode()


# Die Aufzeichnung wird eingebettet, nicht verlinkt: Die Datei muss allein
# funktionieren, auch als Anhang in einer Mail. Der OpenAI-Schluessel liegt NICHT
# in dieser Datei und darf es nie — was verschickt wird, ist lesbar.
BEISPIEL = {'vorher': datenuri('beispiel-vorher.jpg'),
            'nachher': datenuri('beispiel-nachher.jpg')}

HTML = (HIER / 'vorlage.html').read_text(encoding='utf-8')
HTML = HTML.replace('/*__PROFIL__*/', json.dumps(profil, ensure_ascii=False))
HTML = HTML.replace('/*__REFS__*/', json.dumps(schlank, ensure_ascii=False))
HTML = HTML.replace('/*__BEISPIEL__*/', json.dumps(BEISPIEL))


def leckpruefung(html, mandant):
    """Bricht den Bau ab, wenn im Erzeugnis eines Mandanten Merkmale eines anderen
       stecken. „Anonymisiert" ist damit keine Zusage, sondern eine Pruefung, die
       durchfallen kann.

       Base64-Bloecke fliegen vorher raus: In zweihunderttausend Zeichen Bilddaten
       steht irgendwann zufaellig jede Vierbuchstabenfolge."""
    text = re.sub(r'data:[a-zA-Z/+.-]+;base64,[A-Za-z0-9+/=]+', '', html)
    funde = []
    for andere in sorted(P4.glob('profil-*.json')):
        m = andere.stem.removeprefix('profil-')
        if m == mandant:
            continue
        prof = json.loads(andere.read_text(encoding='utf-8'))
        marker = list(prof.get('merkmale', []))
        marker.append(prof.get('anzeigename'))
        marker += list(prof.get('platzhalter', {}).values())
        rd = P4 / (prof.get('referenzdatei') or '')
        if rd.is_file():
            for r in json.loads(rd.read_text(encoding='utf-8'))['projekte']:
                marker += [r.get('name'), r.get('url'), r.get('bild')]
        for s in sorted({str(x) for x in marker if x and len(str(x)) > 3}):
            if s in text:
                funde.append(f'{m}: „{s}"')
    return funde

ziel = HIER / ('bob-prototyp.html' if MANDANT == 'deeg' else f'bob-{MANDANT}.html')
lecks = leckpruefung(HTML, MANDANT)
if lecks:
    print(f'ABBRUCH — im Bau fuer „{MANDANT}" stecken fremde Merkmale:')
    for l in lecks:
        print('  ' + l)
    sys.exit(1)
ziel.write_text(HTML, encoding='utf-8')

# Die Artifact-Fassung ist dieselbe Seite ohne Seitenrahmen — den setzt die
# Veroeffentlichung selbst. Der Titel bleibt unveraendert: Er benennt das Artifact.
art = (f'<title>{profil.get("anzeigename", "Beratungsassistent Bob")}</title>' + HTML[HTML.index('</title>')+8:])
art = art.replace(':root{', 'html{background:var(--papier)}\n:root{', 1)
art = art.replace('</style></head><body>', '</style>', 1).replace('</script></body></html>', '</script>')
artziel = HIER / ('bob-artifact.html' if MANDANT == 'deeg' else f'bob-{MANDANT}-artifact.html')
artziel.write_text(art, encoding='utf-8')

print(f'{ziel.name}: {ziel.stat().st_size//1024} KB, {len(schlank)} Referenzen, '
      f'{len(profil["schritte"])-1} Fragen · {artziel.name} mitgeschrieben')
