"""Impressum & Datenschutz für Jami (David Prechtel / KI Web Studio)."""

from __future__ import annotations

import html
from typing import Mapping


def impressum_html(op: Mapping[str, str], *, site_url: str = "") -> str:
    name = html.escape(op["name"])
    brand = html.escape(op.get("brand", "Jami"))
    legal_form = html.escape(op.get("legal_form", "Einzelunternehmen"))
    street = html.escape(op["street"])
    zip_city = html.escape(op["zip_city"])
    country = html.escape(op.get("country", "Deutschland"))
    phone = html.escape(op["phone"])
    email = html.escape(op["email"])
    web = html.escape(op.get("web", "https://ki-web-studio.de"))
    service = html.escape((site_url or op.get("service_url") or op.get("web", "")).rstrip("/") or web)
    ust = html.escape(op.get("ust_id", ""))
    paypal = html.escape(op.get("paypal", ""))
    email_priv = html.escape(op.get("email_private", ""))
    bank_block = ""
    if op.get("bank_iban"):
        bic_line = (
            f"<br />BIC: {html.escape(op.get('bank_bic', ''))}" if op.get("bank_bic") else ""
        )
        bank_block = (
            f"<p><strong>Bankverbindung</strong></p><p>"
            f"Kontoinhaber: {html.escape(op.get('bank_holder', op['name']))}<br />"
            f"IBAN: {html.escape(op.get('bank_iban', ''))}{bic_line}</p>"
        )
    return f"""
<h1>Impressum</h1>
<div class="legal-content" id="impressum-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: <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 / Plattform</strong></p>
  <p>
    <strong>Jami-Dating</strong> unter <a href="{service}">{service}</a> ist eine Dating-Plattform
    zum Kennenlernen. Chats finden ausschließlich zwischen registrierten Nutzerinnen und Nutzern
    statt – ohne Chat-Moderatoren.
  </p>
  <p><strong>Haftung für Inhalte</strong></p>
  <p>
    Für nutzergenerierte Inhalte (Profile, Fotos, Nachrichten) sind die jeweiligen Nutzer
    verantwortlich. Bei Rechtsverletzungen kontaktieren Sie uns unter {email}.
  </p>
  <p><strong>Haftung für Links</strong></p>
  <p>
    Externe Links (z.&nbsp;B. Stripe, PayPal) 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</em></p>
</div>
"""


def datenschutz_html(op: Mapping[str, str], *, site_url: str) -> str:
    name = html.escape(op["name"])
    street = html.escape(op["street"])
    zip_city = html.escape(op["zip_city"])
    email = html.escape(op["email"])
    phone = html.escape(op["phone"])
    site = html.escape(site_url.rstrip("/"))
    return f"""
<h1>Datenschutzerklärung</h1>
<div class="legal-content" id="datenschutz-content">
  <p><strong>1. Überblick</strong></p>
  <p>
    Diese Erklärung gilt für die Dating-Plattform <strong>Jami</strong> unter
    <a href="{site}">{site}</a>. Wir verarbeiten personenbezogene Daten nur, soweit dies
    für den Betrieb (Registrierung, Profile, Chat, Coin-Käufe) erforderlich ist oder Sie
    eingewilligt haben.
  </p>

  <p><strong>2. Verantwortlicher</strong></p>
  <p>
    {name} · KI Web Studio / Jami<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>Konto:</strong> E-Mail-Adresse, Passwort (verschlüsselt gespeichert), Profildaten (Name, Alter, Stadt, Bio, Hobbys usw.)</li>
    <li><strong>Fotos:</strong> von Ihnen hochgeladene Bilder (öffentlich und optional privat nach Freundschaft)</li>
    <li><strong>Chat:</strong> Nachrichten zwischen Nutzerinnen und Nutzern, Lese-/Tipp-Status</li>
    <li><strong>Nutzung:</strong> Likes, Passes, Matches, Blockierungen, Coin-Stand, letzte Aktivität</li>
    <li><strong>Zahlungen:</strong> bei Coin-Kauf über Stripe (Zahlungsdaten verarbeitet Stripe, nicht von uns gespeichert)</li>
    <li><strong>Social Login (optional):</strong> bei Anmeldung über Google oder Facebook: Name, E-Mail-Adresse, Profilbild (vom jeweiligen Anbieter)</li>
    <li><strong>Technisch:</strong> Session-Token im Browser, Server-Logfiles beim Hosting</li>
    <li><strong>Optional:</strong> Push-Benachrichtigungen (nur wenn Sie zustimmen), Werbevideo für Gratis-Coins</li>
    <li><strong>Reaktivierungs-Mails:</strong> E-Mail-Adresse und Anzeigename (nur wenn Sie sich registriert haben und längere Zeit inaktiv sind)</li>
  </ul>

  <p><strong>4. Zwecke & Rechtsgrundlagen (Art. 6 DSGVO)</strong></p>
  <ul>
    <li>Bereitstellung der Plattform, Chat, Matches: <em>Vertragserfüllung</em> (lit. b)</li>
    <li>Anmeldung über Google/Facebook: <em>Vertragserfüllung</em> (lit. b) – nur wenn Sie diese Funktion nutzen</li>
    <li>Sicherheit, Missbrauchsprävention (Blockieren, Melden): <em>berechtigtes Interesse</em> (lit. f)</li>
    <li>Coin-Kauf & Abrechnung: <em>Vertragserfüllung</em> (lit. b)</li>
    <li>Technisch notwendige Cookies / localStorage (Login): <em>Vertragserfüllung</em> (lit. b)</li>
    <li>Optionale Push-Benachrichtigungen: <em>Einwilligung</em> (lit. a)</li>
    <li>Reaktivierungs-E-Mails an inaktive registrierte Nutzer: <em>berechtigtes Interesse</em> (lit. f) an der Nutzung des von Ihnen angelegten Kontos; Sie können dem jederzeit per E-Mail widersprechen</li>
  </ul>

  <p><strong>5. Hosting (Cloudflare)</strong></p>
  <p>
    Jami wird bei <strong>Cloudflare, Inc.</strong> gehostet (Pages, D1-Datenbank, Server-Funktionen).
    Dabei können technische Zugriffsdaten (IP-Adresse, Zeitstempel, aufgerufene URL, Browser-Kennung)
    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>
    Coin-Käufe können über <strong>Stripe Checkout</strong> bezahlt werden (Karte, SEPA u.&nbsp;a.).
    Anbieter: Stripe Payments Europe Ltd. Zahlungsdaten werden direkt an Stripe übermittelt.
    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 (über Stripe)</strong></p>
  <p>
    Sofern im Stripe-Konto freigeschaltet, kann PayPal als Zahlungsmethode im Stripe Checkout
    gewählt werden. Die Verarbeitung erfolgt über Stripe; PayPal-Daten unterliegen den
    Richtlinien von PayPal.
    <a href="https://www.paypal.com/de/webapps/mpp/ua/privacy-full" target="_blank" rel="noopener noreferrer">PayPal Datenschutz</a>
  </p>

  <p><strong>8. Anmeldung mit Google (OAuth)</strong></p>
  <p>
    Optional können Sie sich mit Ihrem Google-Konto anmelden. Anbieter:
    <strong>Google Ireland Limited</strong> / Google LLC. Dabei übermittelt Google an uns
    typischerweise Ihre E-Mail-Adresse, Ihren Anzeigenamen und ein Profilbild (sofern vorhanden).
    Google verarbeitet Daten nach eigenen Richtlinien. Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO
    (Kontoführung). Sie können stattdessen auch E-Mail/Passwort nutzen.
    <a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Google Datenschutz</a>
  </p>

  <p><strong>9. Anmeldung mit Facebook (Meta)</strong></p>
  <p>
    Optional können Sie sich mit Ihrem Facebook-Konto anmelden. Anbieter:
    <strong>Meta Platforms Ireland Limited</strong>. Dabei können Name, E-Mail-Adresse und
    Profilbild übermittelt werden (Berechtigungen: <em>public_profile</em>, <em>email</em>).
    Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO. Meta verarbeitet Daten eigenverantwortlich.
    <a href="https://www.facebook.com/privacy/policy/" target="_blank" rel="noopener noreferrer">Meta Datenschutzrichtlinie</a>
  </p>

  <p><strong>10. Schriftarten (Google Fonts)</strong></p>
  <p>
    Beim Laden der Seite 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 id="reactivation-email"><strong>11. Transaktions- & Reaktivierungs-E-Mails (Resend)</strong></p>
  <p>
    Für servicebezogene E-Mails (z.&nbsp;B. Erinnerung nach Registrierung ohne Rückkehr, optional
    Gratis-Coins-Geschenk) nutzen wir den Versanddienst <strong>Resend, Inc.</strong>
    (USA/EU je nach Region). Es wird nur Ihre bei Jami hinterlegte E-Mail-Adresse und der
    Anzeigename verwendet. Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO (Interesse an der Nutzung
    Ihres Kontos); Widerspruch jederzeit per E-Mail an uns. Kein Newsletter ohne separate Einwilligung.
    <a href="https://resend.com/legal/privacy-policy" target="_blank" rel="noopener noreferrer">Resend Datenschutz</a>
  </p>

  <p id="cookies"><strong>12. Cookies & Speicher im Browser</strong></p>
  <ul>
    <li><strong>Session (localStorage):</strong> Login-Token – für angemeldete Nutzung erforderlich</li>
    <li><strong>Referral (localStorage):</strong> Einladungslink, falls vorhanden</li>
    <li><strong>Cookie-Einstellungen:</strong> Ihre Wahl zu optionalen Diensten (über Cookie-Banner)</li>
  </ul>
  <p>Es setzen wir kein Google Analytics ein.</p>

  <p><strong>13. Speicherdauer</strong></p>
  <p>
    Profil- und Chatdaten bleiben gespeichert, solange Ihr Konto besteht. Nach Löschungswunsch
    werden personenbezogene Daten gelöscht, soweit keine gesetzlichen Aufbewahrungspflichten
    entgegenstehen (z.&nbsp;B. Zahlungsbelege).
  </p>

  <p><strong>14. Ihre Rechte</strong></p>
  <p>
    Auskunft, Berichtigung, Löschung, Einschränkung, Datenübertragbarkeit, Widerspruch –
    kontaktieren Sie uns unter <a href="mailto:{email}">{email}</a>.
    Konto löschen: E-Mail an uns mit Ihrer registrierten Adresse.
  </p>

  <p><strong>15. 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><strong>16. Mindestalter</strong></p>
  <p>Jami richtet sich an Personen ab <strong>18 Jahren</strong>.</p>

  <p><strong>17. Partner-Werbung VidPuls</strong></p>
  <p>
    Auf Jami kann ein Hinweis auf <strong>VidPuls</strong> (KI-Video-Service von David Prechtel /
    KI Web Studio, <a href="https://vidpuls.de" target="_blank" rel="noopener">vidpuls.de</a>)
    eingeblendet werden. Beim Klick verlassen Sie Jami-Dating; für VidPuls gelten dessen
    <a href="https://vidpuls.de/datenschutz" target="_blank" rel="noopener">Datenschutzerklärung</a>
    und Impressum dort.
  </p>

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


def test_checklist_text(*, site_url: str) -> str:
    site = site_url.rstrip("/")
    return f"""JAMI – TEST-CHECKLISTE
==================

Live: {site}

1) REGISTRIERUNG
   [ ] Neues Konto anlegen (E-Mail + Passwort)
   [ ] 100 Start-Coins sichtbar?
   [ ] Impressum / Datenschutz / AGB Links öffnen sich

2) ENTDECKEN (Swipe)
   [ ] Profile anzeigen (Foto, Hobbys, Stadt)
   [ ] Like / Pass / Super-Like
   [ ] Blockieren + Melden testen

3) CHAT
   [ ] Match oder direkt chatten
   [ ] Nachricht senden (Coins abziehen?)
   [ ] Fotos anklicken (frei) / gesperrt verpixelt
   [ ] Blockieren im Chat (oben rechts)

4) COINS & ZAHLUNG (Stripe LIVE)
   [ ] Shop → Paket wählen → „Jetzt freischalten“
   [ ] PayPal / Karte / Klarna testen (kleiner Betrag)
   [ ] Nach Zahlung: Coins gutgeschrieben?

5) RECHTLICHES (TMG)
   [ ] /impressum – § 5 TMG, Adresse, E-Mail, USt-IdNr.?
   [ ] /datenschutz – vollständiger Text?
   [ ] /agb – Coin-Regeln klar?

6) HAUPTSEITE
   [ ] Mitglieder-Zahl & Online-Anzeige

7) LIVE-BETRIEB
   [ ] /api/health → stripeMode: "live", push: true, email: true
   [ ] Keep-Alive-Cron aktiv (*/5 * * * *)
   [ ] Reaktivierungs-Mail (Resend) optional testen

Bei Fehlern: Seite mit Strg+F5 neu laden oder David melden.
Stripe LIVE – echte Zahlungen möglich.
"""
