"""PROTOTYP — wegwerfen. Erzeugt je Firma aus ergebnis.json die gebrandeten
EV-Containeransichten und schreibt bilder.json. Danach bericht.html neu."""
import base64
import json
import os
import re
import subprocess
import tempfile
from concurrent.futures import ThreadPoolExecutor

import requests

from lauf import KEY, bericht

HIER = os.path.dirname(os.path.abspath(__file__))
MODELL = "gpt-image-2.5-sunburst"

# (Datei, Beschriftung, trägt EV-Logo)
ANSICHTEN = [
    ("absetzcontainer-grau-5cbm-seitenansicht-2", "Absetz 5 cbm · Seite", True),
    ("ev-absetzcontainer-5cbm-grau-3", "Absetz 5 cbm · Front", False),
    ("markdown-grauer-absetzcontainer-seitenansicht-2", "Absetz 7 cbm · Seite", True),
    ("absetzcontainer-grau-7cbm-frontansicht-3", "Absetz 7 cbm · Front", False),
    ("absetzcontainer-grau-10cbm-seitlich-2", "Absetz 10 cbm · Seite", True),
    ("grauer-10cbm-absetzcontainer-frontansicht-3", "Absetz 10 cbm · Front", False),
    ("ev-abrollcontainer-grau-12cbm-2", "Abroll 12 cbm · Seite", True),
    ("ev-abrollcontainer-12cbm-grau-3", "Abroll 12 cbm · Front", False),
    ("grauer-40cbm-abrollcontainer-seitenansicht-2", "Abroll 36 cbm · Seite", True),
    ("abrollcontainer-grau-40cbm-frontansicht-3", "Abroll 36 cbm · Front", False),
]

GLEICH = ("Alles andere bleibt exakt gleich: Perspektive, Bildausschnitt, Proportionen, Bauteile, "
          "Licht, Schatten und der Hintergrund (transparent). Die rot-weißen Warnstreifen bleiben unverändert.")


def prompt(farbe, mit_logo):
    if mit_logo:
        return (f"Bild 1 ist ein Container, Bild 2 ist ein Firmenlogo. Lackiere den Container aus Bild 1 in {farbe}. "
                "Auf der Seitenwand sitzt ein weißes rundes Logo mit Pfeilen: Ersetze genau dieses Logo durch das Logo aus Bild 2, "
                "an derselben Stelle und in ähnlicher Größe, als aufgeklebtes Schild mit ausreichend Kontrast zur Lackfarbe. " + GLEICH)
    return f"Lackiere den Container in {farbe}. Füge kein Logo und keine Schrift hinzu. " + GLEICH


def logo_png(url, ziel):
    r = requests.get(url, headers={"User-Agent": "Mozilla/5.0"}, timeout=30)
    if url.lower().split("?")[0].endswith(".svg") or "svg" in r.headers.get("Content-Type", ""):
        with tempfile.TemporaryDirectory() as d:
            p = os.path.join(d, "l.svg")
            open(p, "wb").write(r.content)
            subprocess.run(["qlmanage", "-t", "-s", "800", "-o", d, p], capture_output=True)
            os.replace(p + ".png", ziel)
    else:
        roh = ziel + ".roh"
        open(roh, "wb").write(r.content)
        subprocess.run(["sips", "-s", "format", "png", roh, "--out", ziel], capture_output=True)
        os.remove(roh)


def erzeugen(auftrag):
    slug, farbe, logo, datei, mit_logo = auftrag
    ziel = os.path.join(HIER, "gen", slug, datei + ".png")
    if os.path.exists(ziel):
        return auftrag, ziel
    # Vorlage auf Weiß legen: in den transparenten Pixeln stecken Farbwerte, die das Modell sonst als Geisterbild nachmalt
    from PIL import Image
    import io
    vorlage = Image.open(os.path.join(HIER, "ev", datei + ".webp")).convert("RGBA")
    weiss = Image.new("RGBA", vorlage.size, (255, 255, 255, 255))
    weiss.alpha_composite(vorlage)
    puffer = io.BytesIO()
    weiss.convert("RGB").save(puffer, "PNG")
    bilder = [("image[]", (datei + ".png", puffer.getvalue(), "image/png"))]
    if mit_logo:
        bilder.append(("image[]", ("logo.png", open(logo, "rb"), "image/png")))
    r = requests.post("https://api.openai.com/v1/images/edits", timeout=300,
                      headers={"Authorization": f"Bearer {KEY}"}, files=bilder,
                      data={"model": MODELL, "prompt": prompt(farbe, mit_logo), "size": "auto", "quality": "auto", "background": "transparent", "output_format": "png"})
    if not r.ok:
        return auftrag, "Fehler: " + r.text[:200]
    ergebnis = Image.open(io.BytesIO(base64.b64decode(r.json()["data"][0]["b64_json"])))
    ergebnis.resize(vorlage.size, Image.LANCZOS).save(ziel)
    return auftrag, ziel


if __name__ == "__main__":
    ergebnisse = json.load(open(os.path.join(HIER, "ergebnis.json")))
    auftraege = []
    import sys
    for name, r in ergebnisse.items():
        if len(sys.argv) > 1 and not any(a.lower() in name.lower() for a in sys.argv[1:]):
            continue
        if r.get("farbe_quelle") != "container" or not r.get("logo"):
            continue  # ohne Containerfoto: Farbe prüfen, nichts erzeugen
        slug = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-")
        os.makedirs(os.path.join(HIER, "gen", slug), exist_ok=True)
        logo = os.path.join(HIER, "gen", slug, "logo.png")
        if not os.path.exists(logo):
            logo_png(r["logo"]["url"], logo)
        auftraege += [(slug, r["farbe"], logo, d, l) for d, _, l in ANSICHTEN]
    print(f"{len(auftraege)} Bilder")
    ausgabe = {}
    with ThreadPoolExecutor(8) as pool:
        for (slug, _, _, datei, _), ziel in pool.map(erzeugen, auftraege):
            print(slug, datei, ziel if ziel.startswith("Fehler") else "ok", flush=True)
            ausgabe.setdefault(slug, {})[datei] = ziel
    json.dump(ausgabe, open(os.path.join(HIER, "bilder.json"), "w"), indent=2)
    open(os.path.join(HIER, "bericht.html"), "w").write(bericht(ergebnisse))
