#!/home/agent/venv/bin/python3
"""Generate personalised press-outreach e-mail drafts for Plappi.

A draft is created as a 'pending' item; nothing is sent until it's approved
(then marketing_cli.py approve → sends via lena-mail.py). Imported by the CLI.
"""
from __future__ import annotations

import sys
from datetime import date
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parent))
from marketing_lib import (
    run_claude, insert_item, get_item, get_target, list_targets,
    format_for_wa, wa_send, log,
)

# Plappi facts the model may use — keep claims tight and true.
PRODUCT_FACTS = """PRODUKT — Plappi:
- Displayloses, sprachgesteuertes Sprachlern-Gerät für zwei-/mehrsprachige Kinder (2–15 J.).
- 27 Sprachen, screen-free, privacy-first: Kinderdaten bleiben in der EU, kein KI-Training, DSGVO + EU-AI-Act.
- Wiener Startup (Plappi FlexCo i.G.). Kickstarter-Launch: 24.06.2026.
- Positionierung: europäische, datenschutz-erste Antwort auf Tonies/Yoto — aber für aktives Sprachenlernen.
- Methodik wissenschaftlich fundiert (peer-reviewed Studien zu früher Mehrsprachigkeit).
- Website/Warteliste: helloplappi.com"""

ANGLES = {
    "A": "TECH/EDTECH/STARTUP — privacy-first EU-Antwort auf Tonies/Yoto (Kinderdaten in EU, kein KI-Training, DSGVO/EU-AI-Act).",
    "B": "STARTUP-MEDIEN — österreichisches Hardware-Startup auf Kickstarter (Wiener FlexCo, 27 Sprachen, screen-free).",
    "C": "ELTERN/BILINGUAL/SPIELZEUG — bilingual erziehen ohne Bildschirm; Lösung für mehrsprachige Familien.",
}

SYSTEM_PROMPT = """Du bist die PR-Verantwortliche von Plappi und schreibst eine kurze, persönliche
Pitch-E-Mail an eine Redaktion/Journalist:in bzw. Podcast. Ziel: kostenlose redaktionelle
Berichterstattung bzw. (bei Reviewern) ein Testgerät-Interesse, bzw. (bei Podcasts) Gründer als Gast.

STIL:
- Deutsch, außer das Outlet ist englischsprachig (dann Englisch).
- Kurz: 110–170 Wörter. Journalist:innen-freundlich, kein Marketing-Geschwurbel, keine Buzzwords.
- Persönlicher Einstieg, der zeigt WARUM gerade dieses Outlet (1 Satz, auf den Angle gemünzt).
- 2–3 harte Fakten mit Substanz. Eine klare, einzelne Bitte (Ask).
- Launch-Datum nennen (24.06.2026) + Hinweis auf Material/Press-Kit/Demo auf Anfrage.
- KEINE erfundenen Zahlen/Auszeichnungen. Nur die gegebenen Fakten.
- Keine Grußformel mit Namen am Ende (Signatur wird automatisch angehängt) — schließe mit einem
  knappen Call-to-Action-Satz, KEIN 'Mit freundlichen Grüßen, ...'.

OUTPUT — exakt dieses Format, nichts sonst:
BETREFF: <prägnante Betreffzeile>
---
<E-Mail-Text>"""


def generate_press_email(target, extra_notes: str = "", model: str = "haiku"):
    angle_txt = ANGLES.get(target["angle"], "")
    is_podcast = target["platform"] == "podcast"
    is_reviewer = (target["wave"] == "B")
    ask = ("Anfrage: Gründer als Gast in der Show." if is_podcast else
           "Anfrage: Testgerät + Hands-on-Review zum Launch." if is_reviewer else
           "Anfrage: redaktionelle Vorberichterstattung / Aufnahme in die Launch-Coverage.")
    user = f"""{PRODUCT_FACTS}

OUTLET: {target['name']} ({target['url'] or target['contact'] or ''})
ANGLE: {angle_txt}
ART DER BITTE: {ask}
BESONDERHEIT/NOTIZ: {target['rules'] or '(keine)'} {extra_notes}

Schreib die Pitch-E-Mail nach Stilvorgabe und Format."""
    raw = run_claude(user, SYSTEM_PROMPT, model=model, label="press_outreach")
    subject, body = _split(raw, target)
    return subject, body, user


def _split(raw: str, target):
    subject, body = None, raw
    lines = raw.splitlines()
    if lines and lines[0].upper().startswith("BETREFF:"):
        subject = lines[0].split(":", 1)[1].strip()
        rest = lines[1:]
        if rest and rest[0].strip() == "---":
            rest = rest[1:]
        body = "\n".join(rest).strip()
    if not subject:
        subject = f"Plappi (Kickstarter 24.06.) — {target['angle']}-Pitch"
    return subject, body


def draft_for_target(target_id: int, auto_send: bool = False, model: str = "haiku",
                     extra_notes: str = "") -> int:
    t = get_target(target_id)
    if not t:
        raise SystemExit(f"target {target_id} not found")
    subject, body, prompt = generate_press_email(t, extra_notes, model)
    iid = insert_item(target_id=t["id"], channel="press", type_="press_email",
                      platform=t["platform"], subject=subject, body=body,
                      disclosure=None, scheduled_for=date.today().isoformat(),
                      thread_ref=subject, prompt_used=prompt, model_used=model)
    log(f"press draft #{iid} → {t['name']}")
    if auto_send:
        wa_send(format_for_wa(get_item(iid), t))
    return iid


def draft_wave(wave: str, auto_send: bool = False, model: str = "haiku") -> list[int]:
    ids = []
    for t in list_targets(channel="press", wave=wave, status="active"):
        try:
            ids.append(draft_for_target(t["id"], auto_send=auto_send, model=model))
        except Exception as e:
            log(f"draft_wave err target={t['id']}: {e}")
    return ids


# ──────────────────────────────────────────────────────────────────────────
# Approved FIXED template (deterministic merge) — used by `blast`.
# Sends exactly what Nemanja reviewed; only hook/angle/ask vary per outlet.
# Includes his contact block + helloplappi.com link.
# ──────────────────────────────────────────────────────────────────────────
KS_LINE_DE = "Kickstarter-Launch: 24. Juni 2026. Alles zum Produkt: https://helloplappi.com"
KS_LINE_EN = "Kickstarter launch: 24 June 2026. Everything about the product: https://helloplappi.com"

PRODUCT_DE = ("Plappi ist ein displayloses, sprachgesteuertes Lerngerät für Kinder von 2–15 Jahren: "
              "Es führt personalisierte Gespräche und erzählt bilinguale Geschichten, die Kinder zum "
              "aktiven Sprechen bringen — ganz ohne Bildschirm. 27 Sprachen, Made in Austria.")
PRODUCT_EN = ("Plappi is a screen-free, voice-controlled learning companion for children aged 2–15. "
              "It holds personalised conversations and tells bilingual stories that get kids actively "
              "speaking — no screen involved. 27 languages, made in Austria.")

BREACT_DE = ("Hinter Plappi steht die Wiener BReact GmbH (Gründer Nemanja Klincov & Raphael Fakhir), "
             "ein KI-Unternehmen, dessen Technologie u. a. Verbund, Wien Energie, UNIQA und Stadtwerke "
             "Klagenfurt nutzen. Diese Datenschutz-Expertise steckt jetzt in einem Kinderprodukt: private "
             "Inference-Server, EU-Rechenzentren, kein KI-Training mit Kinderdaten — DSGVO- und "
             "EU-AI-Act-konform. Die Lernmethodik basiert auf über 75 peer-reviewed Studien zur "
             "bilingualen Sprachentwicklung.")
BREACT_EN = ("Plappi is built by Vienna-based BReact GmbH (founders Nemanja Klincov & Raphael Fakhir), "
             "an AI company whose technology is used by utilities and insurers like Verbund, Wien Energie "
             "and UNIQA. That privacy engineering now powers a kids' product: private inference servers, "
             "EU data centres, no AI training on children's data — GDPR- and EU-AI-Act-compliant. The "
             "method draws on 75+ peer-reviewed studies on bilingual language development.")

CONTACT_DE = ("Kontakt:\nNemanja Klincov — Gründer & CEO, Plappi (BReact GmbH)\n"
              "nemanja@breact.ai · https://helloplappi.com")
CONTACT_EN = ("Contact:\nNemanja Klincov — Founder & CEO, Plappi (BReact GmbH)\n"
              "nemanja@breact.ai · https://helloplappi.com")

CLOSE_DE = "Demo-Video, Pressebilder und O-Töne schicke ich gern — sag kurz Bescheid, was du brauchst."
CLOSE_EN = "Happy to send the demo video, press images and quotes — just let me know what you need."

HOOK_DE = {
    "A": "{name} berichtet über Technologie mit gesellschaftlicher Relevanz — und bei KI-Spielzeug für Kinder geht es genau darum: Wo landen die Daten der Kinder?",
    "B": "{name} hat ein Auge für österreichische Gründungen mit echtem Tech-Kern — und Plappi kommt direkt aus einem.",
    "C": "{name} begleitet Familien bei genau den Alltagsfragen, für die Plappi gebaut wurde.",
}
HOOK_EN = {
    "A": "{name} covers technology that matters — and AI toys for kids raise exactly that question: where does children's data go?",
    "B": "{name} has an eye for startups with a real tech core — and Plappi comes straight out of one.",
    "C": "{name} speaks to families about exactly the everyday challenge Plappi was built for.",
}
ANGLE_DE = {
    "A": "Anders als Tonies oder Yoto, die Kinder vor allem berieseln, bringt Plappi sie zum Sprechen — und beantwortet die Frage, die Eltern bei KI-Spielzeug am meisten umtreibt: Wo landen die Daten meiner Kinder? Bei Plappi nie im KI-Training, ausschließlich auf EU-Servern.",
    "B": "Ein österreichisches Hardware-Startup, das aus einem etablierten KI-Unternehmen heraus entsteht und am 24. Juni auf Kickstarter geht — mit einem Produkt, das die Lücke zwischen reinen Sprach-Apps und passiven Vorlese-Boxen schließt.",
    "C": "Plappi ist für die vielen Familien, in denen ein Elternteil die eigene Sprache weitergeben will, aber zwischen Job und Alltag kaum Zeit findet. Es entstand aus genau dieser Frustration des Gründers, dessen Frau seine Muttersprache (Serbisch) nicht spricht — als Ergänzung, nicht als Ersatz für den Elternteil.",
}
ANGLE_EN = {
    "A": "Unlike Tonies or Yoto, which mostly keep kids listening, Plappi gets them speaking — and answers the question parents worry about most with AI toys: where does my child's data go? With Plappi, never into AI training, and only on EU servers.",
    "B": "An Austrian hardware startup spun out of an established AI company, launching on Kickstarter on 24 June — filling the gap between pure language apps and passive audio boxes.",
    "C": "Plappi is for the many families where one parent wants to pass on their language but barely finds the time between work and daily life. It grew out of exactly that frustration of the founder, whose wife doesn't speak his mother tongue (Serbian) — a complement, not a replacement for the parent.",
}
ASK_DE = {
    "A": "Hättet ihr Interesse an einer Vorberichterstattung zum Launch oder einem kurzen Gründer-Interview?",
    "A3": "Hättet ihr Interesse an einem Test bzw. einer Vorstellung — oder einem Gastbeitrag zum Thema mehrsprachig erziehen ohne Bildschirm?",
    "A4": "Hättet ihr Interesse an Nemanja als Gast? Die Gründer-Story (zwischen zwei Sprachwelten aufgewachsen) trifft genau euer Thema.",
}
ASK_EN = {
    "A": "Would you be interested in pre-launch coverage or a short founder interview?",
    "A3": "Would you be interested in a review/feature — or a guest piece on raising kids bilingual without screens?",
    "A4": "Would you be interested in having Nemanja as a guest? The founder story fits your theme exactly.",
}
SUBJ_DE = {
    "A": "Plappi: Wiener KI-Team bringt datenschutz-erstes Sprachgerät für Kinder — Kickstarter 24.06.",
    "B": "Österr. KI-Startup auf Kickstarter (24.06.): screen-freier Sprachbegleiter für Kinder",
    "C": "Mehrsprachig erziehen ohne Bildschirm — Plappi startet 24.06. auf Kickstarter",
}
SUBJ_EN = {
    "A": "Plappi: Vienna AI team launches privacy-first language device for kids — Kickstarter 24 June",
    "B": "Austrian AI startup on Kickstarter (24 June): screen-free language companion for kids",
    "C": "Raising kids bilingual without screens — Plappi launches 24 June on Kickstarter",
}


def build_templated_email(target):
    """Deterministic merge of the approved template for one target → (subject, body)."""
    lang = (target["language"] or "de").lower()
    angle = (target["angle"] or "C").strip()[:1].upper()
    if angle not in ("A", "B", "C"):
        angle = "C"
    wave = (target["wave"] or "A3").strip()
    name = target["name"]
    if lang == "en":
        parts = ["Hi,", HOOK_EN[angle].format(name=name), PRODUCT_EN, ANGLE_EN[angle],
                 BREACT_EN, KS_LINE_EN, ASK_EN.get(wave, ASK_EN["A"]), CLOSE_EN, CONTACT_EN]
        subj = SUBJ_EN.get(angle, SUBJ_EN["B"])
    else:
        parts = ["Hallo liebe Redaktion,", HOOK_DE[angle].format(name=name), PRODUCT_DE,
                 ANGLE_DE[angle], BREACT_DE, KS_LINE_DE, ASK_DE.get(wave, ASK_DE["A"]),
                 CLOSE_DE, CONTACT_DE]
        subj = SUBJ_DE.get(angle, SUBJ_DE["B"])
    return subj, "\n\n".join(parts)
