"""Impressum, Datenschutz, AGB & Widerruf für VidPuls (David Prechtel / KI Web Studio)."""

from __future__ import annotations

import html
from pathlib import Path
from typing import Mapping

from jam.operator_data import operator as operator_data
from jam.jampulse_brand import MINUTE_OFFER, PRODUCT_BRAND, SUBSCRIPTION_OFFER


def operator() -> dict[str, str]:
    return operator_data(product="vidpuls")


def _esc(s: str) -> str:
    return html.escape(s)


def legal_footer_links(*, prefix: str = "") -> str:
    p = prefix.rstrip("/")
    base = p or ""
    return (
        f'<a href="{base}/impressum">Impressum</a> · '
        f'<a href="{base}/datenschutz">Datenschutzerklärung</a> · '
        f'<a href="{base}/agb">AGB</a> · '
        f'<a href="{base}/widerruf">Widerruf</a>'
    )


def legal_css() -> str:
    return """
:root {
  --bg:#050508; --panel:#12101a; --line:rgba(255,255,255,.1);
  --text:#f4f0ff; --muted:#9ca3af; --accent:#a855f7;
}
* { box-sizing:border-box; }
body {
  margin:0; font-family:Segoe UI,system-ui,sans-serif;
  background:var(--bg); color:var(--text); line-height:1.6;
}
.legal-header {
  padding:1rem 1.25rem; border-bottom:1px solid var(--line);
  display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:.75rem;
}
.legal-header a.brand {
  color:var(--text); text-decoration:none; font-weight:800; font-size:1.05rem;
  background:linear-gradient(135deg,#a855f7,#ec4899);
  -webkit-background-clip:text; color:transparent;
}
.legal-main {
  max-width:760px; margin:0 auto; padding:1.5rem 1.25rem 2.5rem;
}
.legal-main h1 { font-size:1.55rem; margin:0 0 1rem; }
.legal-main h2 { font-size:1.05rem; margin:1.35rem 0 .5rem; color:var(--text); }
.legal-main p, .legal-main li { color:var(--muted); font-size:.92rem; }
.legal-main strong { color:var(--text); }
.legal-main a { color:var(--accent); }
.legal-main ul { padding-left:1.2rem; }
.meta-legal { font-size:.78rem !important; margin-top:2rem !important; opacity:.75; }
.legal-footer {
  text-align:center; padding:1.25rem; border-top:1px solid var(--line);
  font-size:.82rem; color:var(--muted);
}
.legal-footer a { color:var(--accent); text-decoration:none; margin:0 .15rem; }
"""


def legal_page(title: str, body_html: str, *, site_url: str) -> str:
    site = _esc(site_url.rstrip("/"))
    foot = legal_footer_links(prefix="")
    return f"""<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<title>{_esc(title)} – {PRODUCT_BRAND}</title>
<style>{legal_css()}</style>
</head>
<body>
<header class="legal-header">
  <a class="brand" href="/">{PRODUCT_BRAND}</a>
  <span style="font-size:.82rem;color:var(--muted)">KI Web Studio · David Prechtel</span>
</header>
<main class="legal-main">{body_html}</main>
<footer class="legal-footer">
  <a href="/">Start</a> · {foot}
</footer>
</body>
</html>"""


def impressum_html(*, site_url: str, op: Mapping[str, str] | None = None) -> str:
    o = op or operator()
    name = _esc(o["name"])
    brand = _esc(o["brand"])
    legal_form = _esc(o.get("legal_form", "Einzelunternehmen"))
    street = _esc(o["street"])
    zip_city = _esc(o["zip_city"])
    country = _esc(o.get("country", "Deutschland"))
    phone = _esc(o["phone"])
    email = _esc(o["email"])
    web = _esc(o.get("web", "https://ki-web-studio.de"))
    service = _esc(site_url.rstrip("/"))
    ust = _esc(o.get("ust_id", ""))
    paypal = _esc(o.get("paypal", ""))
    email_priv = _esc(o.get("email_private", ""))
    bank_block = ""
    if o.get("bank_iban"):
        bank_block = f"""
  <p><strong>Bankverbindung (Überweisungen)</strong></p>
  <p>
    Kontoinhaber: {_esc(o.get('bank_holder', o['name']))}<br />
    IBAN: {_esc(o.get('bank_iban', ''))}<br />
    {f"BIC: {_esc(o.get('bank_bic', ''))}<br />" if o.get('bank_bic') else ""}
    {f"Bank: {_esc(o.get('bank_name', ''))}" if o.get('bank_name') else ""}
  </p>"""
    return f"""
<h1>Impressum</h1>
<div class="legal-content">
  <p><strong>Angaben gemäß § 5 TMG</strong></p>
  <p>
    {name}<br />
    {brand}<br />
    {legal_form}<br />
    {street}<br />
    {zip_city}<br />
    {country}
  </p>
  <p><strong>Kontakt (schnelle elektronische Kontaktaufnahme)</strong></p>
  <p>
    Plattform: <a href="{service}">{service.replace("https://", "")}</a><br />
    Web: <a href="{web}" rel="noopener">{web.replace("https://", "")}</a><br />
    Telefon: <a href="tel:+4990703069987">{phone}</a><br />
    E-Mail: <a href="mailto:{email}">{email}</a><br />
    {f'PayPal / Shop: <a href="mailto:{paypal}">{paypal}</a><br />' if paypal else ''}
    {f'Alternativ: <a href="mailto:{email_priv}">{email_priv}</a>' if email_priv and email_priv != email else ''}
  </p>
  <p><strong>Umsatzsteuer-ID</strong></p>
  <p>USt-IdNr. gemäß § 27 a UStG:<br />{ust}</p>
  {bank_block}
  <p><strong>Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV</strong></p>
  <p>{name}, {street}, {zip_city}</p>
  <p><strong>Online-Dienst</strong></p>
  <p>
    <strong>{PRODUCT_BRAND}</strong> unter <a href="{service}">{service}</a> ist ein
    KI-gestützter Video-Service: Promo-Videos (60–120 Sek., bis 4K), Dialog Studio
    (3D-Figuren, Lip-Sync), Voiceover, Captions und optional Auto-Post-Vorbereitung
    für Social Media.
  </p>
  <p><strong>Haftung für Inhalte</strong></p>
  <p>
    Für von Nutzerinnen und Nutzern eingegebene Prompts und veröffentlichte Inhalte
    sind die jeweiligen Nutzer verantwortlich. Bei Rechtsverletzungen kontaktieren
    Sie uns unter <a href="mailto:{email}">{email}</a>.
  </p>
  <p><strong>Haftung für Links</strong></p>
  <p>
    Externe Links (z.&nbsp;B. Stripe, PayPal, TikTok, YouTube, Jami-Dating) führen
    zu Drittanbietern. Für deren Inhalte übernehmen wir keine Haftung.
  </p>
  <p><strong>Streitbeilegung</strong></p>
  <p>
    Wir sind nicht verpflichtet und nicht bereit, an Streitbeilegungsverfahren vor
    einer Verbraucherschlichtungsstelle teilzunehmen.
  </p>
  <p class="meta-legal"><em>Stand: Juni 2026 · Betreiber: David Prechtel / KI Web Studio</em></p>
</div>
"""


def datenschutz_html(*, site_url: str, op: Mapping[str, str] | None = None) -> str:
    o = op or operator()
    name = _esc(o["name"])
    street = _esc(o["street"])
    zip_city = _esc(o["zip_city"])
    email = _esc(o["email"])
    phone = _esc(o["phone"])
    site = _esc(site_url.rstrip("/"))
    return f"""
<h1>Datenschutzerklärung</h1>
<div class="legal-content">
  <p><strong>1. Überblick</strong></p>
  <p>
    Diese Erklärung gilt für <strong>{PRODUCT_BRAND}</strong> unter
    <a href="{site}">{site}</a> sowie das zugehörige Video-Studio. Wir verarbeiten
    personenbezogene Daten nur, soweit dies für den Betrieb (Video-Erstellung,
    Zahlung, Lizenzverwaltung) erforderlich ist oder Sie eingewilligt haben.
  </p>

  <p><strong>2. Verantwortlicher</strong></p>
  <p>
    {name} · KI Web Studio / {PRODUCT_BRAND}<br />
    {street}, {zip_city}<br />
    Tel. <a href="tel:+4990703069987">{phone}</a><br />
    E-Mail: <a href="mailto:{email}">{email}</a>
  </p>

  <p><strong>3. Welche Daten wir verarbeiten</strong></p>
  <ul>
    <li><strong>Dialog Studio:</strong> eingegebene Dialogtexte, Stimmenwahl, generierte MP4/MP3</li>
    <li><strong>Generierte Videos:</strong> lokal auf Ihrem Gerät bzw. beim Hosting des Studios gespeichert</li>
    <li><strong>Lizenz &amp; Käufe:</strong> Produkt-ID, Kaufdatum, ggf. Stripe-Session-ID oder PayPal-Referenz zur Freischaltung</li>
    <li><strong>Zahlungen:</strong> über Stripe Checkout oder PayPal – Zahlungsdaten verarbeitet der Zahlungsdienstleister</li>
    <li><strong>E-Mail:</strong> optional bei Checkout (Stripe) oder bei manueller Freischaltung (PayPal/Überweisung)</li>
    <li><strong>Technisch:</strong> Server-Logfiles (IP, Zeitstempel, URL) beim Hosting; im WLAN-Modus kann das Studio lokal ohne Cloud laufen</li>
  </ul>

  <p><strong>4. Zwecke &amp; Rechtsgrundlagen (Art. 6 DSGVO)</strong></p>
  <ul>
    <li>Bereitstellung von Video-Generierung &amp; Studio: <em>Vertragserfüllung</em> (lit. b)</li>
    <li>Lizenzprüfung nach Kauf: <em>Vertragserfüllung</em> (lit. b)</li>
    <li>Missbrauchsprävention &amp; Betrieb: <em>berechtigtes Interesse</em> (lit. f)</li>
    <li>Stripe/PayPal-Abwicklung: <em>Vertragserfüllung</em> (lit. b)</li>
  </ul>

  <p><strong>5. Hosting (Cloudflare)</strong></p>
  <p>
    Die Website kann bei <strong>Cloudflare, Inc.</strong> gehostet werden (Pages, Functions).
    Dabei können technische Zugriffsdaten in Logfiles anfallen. Rechtsgrundlage:
    Art. 6 Abs. 1 lit. f DSGVO.
    <a href="https://www.cloudflare.com/privacypolicy/" target="_blank" rel="noopener noreferrer">Cloudflare Datenschutz</a>
  </p>

  <p><strong>6. Zahlungsdienst Stripe</strong></p>
  <p>
    Käufe und Abos laufen über <strong>Stripe Checkout</strong> (Karte, PayPal, Klarna,
    Apple/Google Pay, Amazon Pay, SEPA u.&nbsp;a.). Anbieter: Stripe Payments Europe Ltd.
    Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO.
    <a href="https://stripe.com/de/privacy" target="_blank" rel="noopener noreferrer">Stripe Datenschutz</a>
  </p>

  <p><strong>7. PayPal (direkt oder über Stripe)</strong></p>
  <p>
    Bei PayPal-Zahlung verarbeitet PayPal die Zahlungsdaten nach eigenen Richtlinien.
    <a href="https://www.paypal.com/de/webapps/mpp/ua/privacy-full" target="_blank" rel="noopener noreferrer">PayPal Datenschutz</a>
  </p>

  <p><strong>8. KI-Dienste &amp; APIs</strong></p>
  <p>
    Zur Video-Erstellung können externe KI-Dienste genutzt werden, z.&nbsp;B.:
    <strong>ElevenLabs</strong> (Sprachsynthese), <strong>PixVerse/OpenAI</strong> (Video/Skript),
    <strong>Edge TTS</strong> (Fallback-Stimmen). Dabei werden Dialogtexte/Prompts an diese
    Anbieter übermittelt. Lip-Sync (Rhubarb) und 3D-Rendering laufen lokal auf dem Studio-Rechner.
    Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO (Dienstleistung).
    <a href="https://elevenlabs.io/privacy" target="_blank" rel="noopener noreferrer">ElevenLabs Datenschutz</a>
  </p>

  <p><strong>9. Partner-Hinweis Jami-Dating</strong></p>
  <p>
    Im Dialog Studio kann ein Werbehinweis auf <a href="https://www.jami-dating.de" target="_blank" rel="noopener">Jami-Dating</a>
    erscheinen (Cross-Promo). Beim Klick verlassen Sie VidPuls; es gelten die Datenschutzbestimmungen von Jami-Dating.
  </p>

  <p><strong>10. Social-Media Auto-Post</strong></p>
  <p>
    Optional öffnet das Studio Upload-Seiten (TikTok, YouTube, Instagram) im Browser.
    Es werden keine Zugangsdaten bei uns gespeichert – Sie loggen sich direkt beim
    jeweiligen Anbieter ein.
  </p>

  <p><strong>11. Schriftarten (Google Fonts)</strong></p>
  <p>
    Beim Laden können Schriftarten von Google Fonts abgerufen werden; dabei kann Ihre
    IP-Adresse an Google übermittelt werden. Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO.
    <a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Google Datenschutz</a>
  </p>

  <p><strong>12. Speicherdauer</strong></p>
  <p>
    Lizenz- und Kaufdaten bleiben für die Vertragsabwicklung gespeichert. Videos und
    Prompts auf Ihrem Gerät können Sie jederzeit lokal löschen. Gesetzliche
    Aufbewahrungspflichten (z.&nbsp;B. Rechnungen) bleiben unberührt.
  </p>

  <p><strong>13. Ihre Rechte</strong></p>
  <p>
    Auskunft, Berichtigung, Löschung, Einschränkung, Datenübertragbarkeit, Widerspruch –
    kontaktieren Sie uns unter <a href="mailto:{email}">{email}</a>.
  </p>

  <p><strong>14. Beschwerderecht</strong></p>
  <p>
    Sie können sich bei einer Datenschutz-Aufsichtsbehörde beschweren, z.&nbsp;B. beim
    Bayerischen Landesamt für Datenschutzaufsicht (BayLDA).
  </p>

  <p class="meta-legal"><em>Stand: Juni 2026 · Plattform: {site}</em></p>
</div>
"""


def agb_html(*, site_url: str, op: Mapping[str, str] | None = None) -> str:
    o = op or operator()
    email = _esc(o["email"])
    site = _esc(site_url.rstrip("/"))
    sub_m = SUBSCRIPTION_OFFER.get("monthly_eur", 19.99)
    sub_y = SUBSCRIPTION_OFFER.get("yearly_eur", 167.92)
    sub_y_list = SUBSCRIPTION_OFFER.get("yearly_list_eur", 239.88)
    single = MINUTE_OFFER.get("single_video_eur", 1.99)
    return f"""
<h1>Allgemeine Geschäftsbedingungen (AGB)</h1>
<div class="legal-content">
  <p><strong>1. Anbieter &amp; Geltungsbereich</strong></p>
  <p>
    Anbieter ist David Prechtel, KI Web Studio / {PRODUCT_BRAND}, Mühlfeldsiedlung 24,
    86660 Tapfheim („wir“). Diese AGB gelten für die Nutzung von {PRODUCT_BRAND} unter
    <a href="{site}">{site}</a> (Video-Studio, Landingpage, Checkout).
  </p>

  <p><strong>2. Leistung</strong></p>
  <p>
    {PRODUCT_BRAND} erstellt KI-gestützte Promo-Videos (ca. 60–120 Sekunden, bis 4K),
    inkl. Skript, Voiceover und Caption. Optional wird der Upload zu Social-Media-Plattformen
    vorbereitet (Browser-Hilfe, kein garantierter automatischer Publish ohne Ihre Bestätigung).
  </p>

  <p><strong>3. Preise</strong></p>
  <ul>
    <li>Gratis: 1 Video mit sichtbarem VidPuls-Wasserzeichen (ca. 60–120 Sek.)</li>
    <li>Einzelvideo ohne Wasserzeichen: {single:.2f} € (1 Video)</li>
    <li>VidPuls Pro Monat: {sub_m:.2f} €/Monat (unbegrenzt Videos ohne Wasserzeichen, Fair-Use)</li>
    <li>VidPuls Pro Jahr: {sub_y:.2f} €/Jahr (statt {sub_y_list:.2f} € – 30&nbsp;% günstiger)</li>
  </ul>
  <p>Alle Preise in Euro inkl. gesetzlicher MwSt., sofern anwendbar.</p>

  <p><strong>4. Vertragsschluss</strong></p>
  <p>
    Der Vertrag kommt zustande, wenn Sie ein Einzelvideo, Abo oder Pro-Paket über Stripe/PayPal abschließen
    und die Zahlung erfolgreich abgeschlossen wurde. Bei Überweisung/PayPal-Direktlink
    nach Freischaltung durch uns.
  </p>

  <p><strong>5. Digitale Inhalte &amp; Widerruf</strong></p>
  <p>
    Es handelt sich um digitale Dienstleistungen/Inhalte. Mit Beginn der Generierung
    nach Kauf erlischt das Widerrufsrecht, wenn Sie dem ausdrücklich zugestimmt haben
    (§ 356 Abs. 5 BGB). Details siehe <a href="/widerruf">Widerrufsbelehrung</a>.
  </p>

  <p><strong>6. Nutzungsrechte</strong></p>
  <p>
    Nach Bezahlung erhalten Sie ein einfaches, nicht-exklusives Nutzungsrecht an den
    generierten Videos für eigene Werbe-/Social-Media-Zwecke. Weiterverkauf der
    Roh-Vorlagen als Stock ohne eigenen Mehrwert ist nicht gestattet.
  </p>

  <p><strong>7. Pflichten der Nutzer</strong></p>
  <p>
    Sie dürfen keine rechtswidrigen, beleidigenden oder urheberrechtlich geschützten
    Inhalte ohne Berechtigung verarbeiten lassen. Sie stellen uns von Ansprüchen Dritter
    frei, die aus Ihren Prompts entstehen.
  </p>

  <p><strong>8. Verfügbarkeit</strong></p>
  <p>
    Wir bemühen uns um hohe Verfügbarkeit, garantieren jedoch keinen unterbrechungsfreien
    Betrieb. Wartung, API-Limits externer KI-Anbieter oder höhere Gewalt können zu
    Verzögerungen führen.
  </p>

  <p><strong>9. Haftung</strong></p>
  <p>
    Wir haften unbeschränkt bei Vorsatz und grober Fahrlässigkeit sowie bei Schäden
    aus der Verletzung von Leben, Körper oder Gesundheit. Im Übrigen haften wir nur bei
    Verletzung wesentlicher Vertragspflichten, begrenzt auf den vorhersehbaren Schaden.
  </p>

  <p><strong>10. Laufzeit Abo</strong></p>
  <p>
    Pro-Abos verlängern sich automatisch um den gewählten Zeitraum (Monat/Jahr), sofern
    nicht über Stripe gekündigt. Kündigung zum Periodenende über Ihr Stripe-Kundenportal
    oder per E-Mail an <a href="mailto:{email}">{email}</a>.
  </p>

  <p><strong>11. Schlussbestimmungen</strong></p>
  <p>Es gilt deutsches Recht. Gerichtsstand ist, soweit zulässig, der Sitz des Anbieters.</p>

  <p class="meta-legal"><em>Stand: Juni 2026 · {PRODUCT_BRAND}</em></p>
</div>
"""


def widerruf_html(*, site_url: str, op: Mapping[str, str] | None = None) -> str:
    o = op or operator()
    name = _esc(o["name"])
    street = _esc(o["street"])
    zip_city = _esc(o["zip_city"])
    email = _esc(o["email"])
    return f"""
<h1>Widerrufsbelehrung</h1>
<div class="legal-content">
  <p><strong>Widerrufsrecht</strong></p>
  <p>
    Sie haben das Recht, binnen <strong>vierzehn Tagen</strong> ohne Angabe von Gründen
    diesen Vertrag zu widerrufen. Die Frist beginnt ab dem Tag des Vertragsschlusses.
  </p>
  <p>
    Um Ihr Widerrufsrecht auszuüben, müssen Sie uns ({name}, {street}, {zip_city},
    E-Mail: <a href="mailto:{email}">{email}</a>) mittels einer eindeutigen Erklärung
    (z.&nbsp;B. E-Mail) informieren.
  </p>

  <p><strong>Folgen des Widerrufs</strong></p>
  <p>
    Wenn Sie widerrufen, erstatten wir alle Zahlungen unverzüglich und spätestens binnen
    vierzehn Tagen ab Eingang Ihrer Mitteilung über dasselbe Zahlungsmittel.
  </p>

  <p><strong>Vorzeitiges Erlöschen bei digitalen Inhalten</strong></p>
  <p>
    Das Widerrufsrecht erlischt bei Verträgen über digitale Inhalte, die nicht auf
    einem körperlichen Datenträger geliefert werden, wenn wir mit der Ausführung begonnen
    haben, nachdem Sie ausdrücklich zugestimmt haben, dass wir vor Ablauf der
    Widerrufsfrist beginnen, und Sie Ihre Kenntnis vom Erlöschen bestätigt haben
    (§ 356 Abs. 5 BGB). Beim Kauf eines Videos und Start der Generierung gilt dies
    entsprechend.
  </p>

  <p class="meta-legal"><em>Stand: Juni 2026</em></p>
</div>
"""


def write_legal_pages(root: Path, *, site_url: str) -> list[Path]:
    root = Path(root)
    root.mkdir(parents=True, exist_ok=True)
    pages = {
        "impressum.html": ("Impressum", impressum_html(site_url=site_url)),
        "datenschutz.html": ("Datenschutzerklärung", datenschutz_html(site_url=site_url)),
        "agb.html": ("AGB", agb_html(site_url=site_url)),
        "widerruf.html": ("Widerruf", widerruf_html(site_url=site_url)),
    }
    written: list[Path] = []
    for filename, (title, body) in pages.items():
        out = root / filename
        out.write_text(legal_page(title, body, site_url=site_url), encoding="utf-8")
        written.append(out)
    return written


def legal_html_for_path(path: str, *, site_url: str) -> str | None:
    """HTML für Studio-Server (/impressum, /datenschutz, …)."""
    key = path.split("?")[0].rstrip("/") or "/"
    routes: dict[str, tuple[str, str]] = {
        "/impressum": ("Impressum", impressum_html(site_url=site_url)),
        "/datenschutz": ("Datenschutzerklärung", datenschutz_html(site_url=site_url)),
        "/agb": ("AGB", agb_html(site_url=site_url)),
        "/widerruf": ("Widerruf", widerruf_html(site_url=site_url)),
    }
    for suffix in (".html",):
        if key.endswith(suffix):
            key = key[: -len(suffix)]
    entry = routes.get(key)
    if not entry:
        return None
    title, body = entry
    return legal_page(title, body, site_url=site_url)
