#!/usr/bin/env python3
"""Baut die vier launchfertigen One-Shot-Ads (1080x1080) fuer weinor Partnershop v2.

Foto = Genspark/Nano-Banana-Basis. Typo = deterministisch gerendert (Chrome headless)
mit den echten Brand-Fonts DM Serif Display + Manrope und den Prototyp-Tokens.
So sind Umlaute, Kontrast und Safe-Zone garantiert statt vom Modell gewuerfelt.
"""
import base64
import mimetypes
import os
import subprocess
import sys

W = os.path.dirname(os.path.abspath(__file__))
OUT = os.path.join(W, "out")
CHROME = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"

INK = "#06233c"
INK2 = "#0d3656"
PAPER = "#fbfaf7"
RED = "#d71920"
SAND = "#eee9df"

CTA = "Zugang anfordern"
MICRO = "Freischaltung in 24 h &middot; kostenfrei f&uuml;r weinor Fachpartner"


def data_uri(path):
    mime = mimetypes.guess_type(path)[0] or "image/jpeg"
    with open(path, "rb") as fh:
        return "data:%s;base64,%s" % (mime, base64.b64encode(fh.read()).decode())


FONT_CSS = open(os.path.join(W, "gf", "gf-local.css"), encoding="utf-8").read()
LOGO = data_uri(os.path.join(W, "refs", "logo-weinor-crop.png"))

BASE_CSS = """
%(fonts)s
* { margin:0; padding:0; box-sizing:border-box; }
html, body { width:1080px; height:1080px; overflow:hidden; }
body { font-family:'Manrope',Arial,sans-serif; -webkit-font-smoothing:antialiased; }
.creative { width:1080px; height:1080px; display:flex; flex-direction:column; background:%(paper)s; }

/* --- Kopfband: Creme, Serif-Headline mit rotem kursivem Akzentwort --- */
.top { background:%(paper)s; padding:56px 72px 34px; flex:0 0 auto; }
.kicker { font-size:23px; font-weight:700; letter-spacing:.15em; text-transform:uppercase;
          color:%(ink)s; display:flex; align-items:center; gap:14px; margin-bottom:22px; }
.kicker::before { content:''; width:34px; height:5px; background:%(red)s; display:block; }
h1 { font-family:'DM Serif Display',Georgia,serif; font-weight:400; color:%(ink)s;
     font-size:%(h1size)spx; line-height:1.04; letter-spacing:-.012em; }
h1 i { font-style:italic; color:%(red)s; }

/* --- Buehne: das Foto --- */
.stage { flex:1 1 auto; position:relative; overflow:hidden; background:%(ink)s; }
.stage img { width:100%%; height:100%%; object-fit:cover; display:block; }

/* --- Fussband: Navy mit rotem CTA-Button --- */
.bottom { background:%(ink)s; padding:30px 72px 34px; flex:0 0 auto;
          display:flex; align-items:center; justify-content:space-between; gap:32px; }
.cta-col { display:flex; flex-direction:column; gap:13px; }
.cta { background:%(red)s; color:#fff; font-size:33px; font-weight:800; letter-spacing:-.005em;
       padding:20px 42px; border-radius:6px; display:inline-block; }
.micro { color:#e8edf2; font-size:21px; font-weight:600; letter-spacing:.005em; }
.logo { height:74px; width:auto; display:block; flex:0 0 auto; }
"""


def page(body_css, body_html, h1size=78):
    css = BASE_CSS % dict(fonts=FONT_CSS, paper=PAPER, ink=INK, red=RED, h1size=h1size)
    return ("<!doctype html><html lang='de'><head><meta charset='utf-8'>"
            "<style>%s\n%s</style></head><body>%s</body></html>"
            % (css, body_css, body_html))


def foot():
    return ("<div class='bottom'><div class='cta-col'>"
            "<span class='cta'>%s</span><span class='micro'>%s</span></div>"
            "<img class='logo' src='%s' alt='weinor'></div>" % (CTA, MICRO, LOGO))


def simple(kicker, headline, img, h1size=78):
    body = ("<div class='creative'>"
            "<div class='top'><div class='kicker'>%s</div><h1>%s</h1></div>"
            "<div class='stage'><img src='%s'></div>%s</div>"
            % (kicker, headline, data_uri(img), foot()))
    return page("", body, h1size)


def split(kicker, headline, left, right, h1size=74):
    extra = """
.split { display:flex; width:100%; height:100%; }
.half { position:relative; width:50%; height:100%; overflow:hidden; }
.half img { width:100%; height:100%; object-fit:cover; object-position:center; }
.half.after img { object-position:72% center; filter:brightness(1.05) saturate(1.04); }
.half.before img { filter:grayscale(.72) brightness(.62) contrast(1.04); }
.tag { position:absolute; left:26px; top:26px; font-size:21px; font-weight:800;
       letter-spacing:.18em; text-transform:uppercase; color:#fff; padding:11px 20px;
       background:#0d3656; border-radius:4px; }
.tag.now { background:#d71920; }
.seam { width:6px; height:100%; background:#d71920; flex:0 0 auto; }
"""
    body = ("<div class='creative'>"
            "<div class='top'><div class='kicker'>%s</div><h1>%s</h1></div>"
            "<div class='stage'><div class='split'>"
            "<div class='half before'><img src='%s'><span class='tag'>Vorher</span></div>"
            "<div class='seam'></div>"
            "<div class='half after'><img src='%s'><span class='tag now'>Nachher</span></div>"
            "</div></div>%s</div>"
            % (kicker, headline, data_uri(left), data_uri(right), foot()))
    return page(extra, body, h1size)


def trust(kicker, headline, img, chips, h1size=74):
    micro = "Firmenlogo bereits hinterlegt &middot; kostenfrei f&uuml;r weinor Fachpartner"
    extra = """
.bottom { flex-direction:column; align-items:stretch; gap:24px; padding:28px 72px 32px; }
.chips { display:flex; align-items:center; gap:18px; flex-wrap:nowrap; }
.chip { color:#f3f6f9; font-size:23px; font-weight:700; display:flex; align-items:center; gap:11px;
        white-space:nowrap; }
.chip::before { content:''; width:11px; height:11px; border-radius:50%; background:#d71920;
                display:block; flex:0 0 auto; }
.row { display:flex; align-items:center; justify-content:space-between; gap:32px; }
"""
    chiphtml = "".join("<span class='chip'>%s</span>" % c for c in chips)
    body = ("<div class='creative'>"
            "<div class='top'><div class='kicker'>%s</div><h1>%s</h1></div>"
            "<div class='stage'><img src='%s'></div>"
            "<div class='bottom'><div class='chips'>%s</div>"
            "<div class='row'><div class='cta-col'>"
            "<span class='cta'>%s</span><span class='micro'>%s</span></div>"
            "<img class='logo' src='%s' alt='weinor'></div></div></div>"
            % (kicker, headline, data_uri(img), chiphtml, CTA, micro, LOGO))
    return page(extra, body, h1size)


def render(html, stem):
    os.makedirs(OUT, exist_ok=True)
    hp = os.path.join(OUT, stem + ".html")
    with open(hp, "w", encoding="utf-8") as fh:
        fh.write(html)
    png = os.path.join(OUT, stem + ".png")
    subprocess.run([CHROME, "--headless", "--disable-gpu", "--hide-scrollbars",
                    "--force-device-scale-factor=1", "--window-size=1080,1080",
                    "--default-background-color=ffffff",
                    "--screenshot=" + png, "file://" + hp],
                   check=True, capture_output=True)
    jpg = os.path.join(OUT, stem + ".jpg")
    subprocess.run(["magick", png, "-resize", "1080x1080!", "-quality", "88",
                    "-strip", "-interlace", "Plane", jpg], check=True, capture_output=True)
    kb = os.path.getsize(jpg) / 1024
    if kb > 300:
        for q in (82, 76, 70, 64):
            subprocess.run(["magick", png, "-resize", "1080x1080!", "-quality", str(q),
                            "-strip", "-interlace", "Plane", jpg], check=True, capture_output=True)
            kb = os.path.getsize(jpg) / 1024
            if kb <= 300:
                break
    return jpg, kb


B = os.path.join(W, "base")
JOBS = [
    ("oneshot-01-pain", simple(
        "F&uuml;r weinor Fachpartner",
        "Jeder tr&auml;gt <i>was anderes</i>?",
        os.path.join(B, "oneshot-base-a-pain.jpg"), 82)),
    ("oneshot-02-auftritt", simple(
        "weinor Partnershop",
        "Starker Auftritt.<br><i>Einfach</i> bestellt.",
        os.path.join(B, "oneshot-base-b-auftritt.jpg"), 80)),
    ("oneshot-03-vorher-nachher", split(
        "Workfashion &amp; Werbemittel",
        "Vom Gr&ouml;&szlig;enzettel <i>zum Auftritt</i>.",
        os.path.join(B, "oneshot-base-c-vorher.jpg"),
        os.path.join(B, "02-lifestyle-team.jpg"), 72)),
    ("oneshot-04-trust", trust(
        "weinor Partnerlinie",
        "Arbeit, die <i>Vertrauen</i> zeigt.",
        os.path.join(B, "05-detail-material.jpg"),
        ["MASCOT&reg;-Qualit&auml;t", "ab 1 St&uuml;ck", "Freischaltung in 24 h"], 74)),
]

if __name__ == "__main__":
    only = sys.argv[1] if len(sys.argv) > 1 else None
    for stem, html in JOBS:
        if only and only not in stem:
            continue
        jpg, kb = render(html, stem)
        print("%-30s %6.1f KB  %s" % (stem, kb, jpg))
