"""
neue-praesentation.py — kopiert das Master-Template in einen Zielordner und
macht es selfcontained. Ergebnis ist ein aufgeräumter Single-Folder mit nur
einer sichtbaren Datei oben (der HTML), alles andere liegt unter _runtime/.

Aufruf:
    python neue-praesentation.py "<Zielordner>" "<Titel>"

Beispiel:
    python neue-praesentation.py \
        "<anwender-vault>/02 Projekte/<Projekt>/Termine/<YYYY-MM-DD Anlass>/Praesentation" \
        "Vorstellung Skill-Prototyp"

Ergebnis-Layout im Zielordner:
    <slug>.html                ← Doppelklick startet die Präsentation
    _runtime/
      ├── theme.css
      ├── deck-stage.js
      ├── app.js, slides-a.js, slides-b.js, tweaks-panel.js
      ├── assets/              (Logos lokal kopiert)
      ├── vendor/              (React + Mona Sans/Inter WOFF2)
      ├── src/                 (JSX-Quellen für Inhalts-Pflege)
      └── build.cmd / build.sh (Re-Build nach JSX-Änderungen)

Idee: Doppelklick auf <slug>.html startet die Präsentation, ohne Internet,
ohne Vault-Abhängigkeit. Versendbar als gezippter Ordner — _runtime/ muss
mitkommen, sonst lädt nichts.
"""

# --- Bundle-Pflicht-Sätze §1 (Wave I v0.17.0, Phase A) ---
# Pfad-Resolver-Standard (analog _cross_skill_evals/run_linkedin_wave_h_evals.py):
#   BUNDLE_ROOT = Path(__file__).resolve().parent.parent.parent.parent
#     # .skills/neue-praesentation/scripts/file.py -> Repo-Root
#   SKILL_ROOT = BUNDLE_ROOT / ".skills" / "neue-praesentation"
#   FOUNDATION = BUNDLE_ROOT / "_lib" / "designsystem" / "templates" / "praesentation"
# Echte Umlaute (ä ö ü ß) durchgehend, keine ae/oe/ue/ss-Substitutionen.


from __future__ import annotations

import argparse
import re
import shutil
import sys
from pathlib import Path

HERE = Path(__file__).resolve().parent  # .skills/neue-praesentation/scripts/
BUNDLE_ROOT = HERE.parent.parent.parent  # Repo-Root
SKILL_ROOT = BUNDLE_ROOT / ".skills" / "neue-praesentation"
FOUNDATION = BUNDLE_ROOT / "_lib" / "designsystem" / "templates" / "praesentation"
LOGO_DIR = FOUNDATION / "assets"  # Default-Logos im Bundle, Anwender kann via Setup-Hook eigene überschreiben

LOGO_FILES = [
    "favicon.svg",
    "logo-primary.svg",
    "logo-dark.svg",
    "logo-with-claim.svg",
    "logo-inline.svg",
    "logo-inline-dark.svg",
]

# Dateien aus dem Master, die in _runtime/ landen
RUNTIME_FILES = [
    "theme.css",
    "theme-a4.css",  # Pflicht für A4-PDF-Mode; deck-stage.js lädt sie bei ?mode=a4 nach
    "deck-stage.js",
    "app.js",
    "slides-a.js",
    "slides-b.js",
    "tweaks-panel.js",
    "build.cmd",
    "build.sh",
]
RUNTIME_FOLDERS = ["vendor", "src"]


def slugify(title: str) -> str:
    s = title.strip().lower()
    s = re.sub(r"[äöüß]", lambda m: {"ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"}[m.group(0)], s)
    s = re.sub(r"×", "x", s)
    s = re.sub(r"[^a-z0-9\-_ ]+", "", s)
    s = re.sub(r"\s+", "-", s).strip("-")
    return s or "praesentation"


def copy_master(target: Path) -> None:
    """Master-Bundle nach Zielordner kopieren — alles außer HTML in _runtime/."""
    target.mkdir(parents=True, exist_ok=True)
    runtime = target / "_runtime"
    runtime.mkdir(exist_ok=True)

    # HTML kommt nach oben (mit umgebogenen Pfaden)
    shutil.copy2(FOUNDATION / "Praesentation Template.html", target / "Praesentation Template.html")

    # Plain files in _runtime/
    for name in RUNTIME_FILES:
        shutil.copy2(FOUNDATION / name, runtime / name)

    # Folders in _runtime/
    for fname in RUNTIME_FOLDERS:
        shutil.copytree(FOUNDATION / fname, runtime / fname, dirs_exist_ok=True)


def copy_logos(target: Path) -> None:
    """Logos in _runtime/assets/ kopieren — selfcontained Export."""
    assets = target / "_runtime" / "assets"
    assets.mkdir(exist_ok=True)
    missing = []
    for f in LOGO_FILES:
        src = LOGO_DIR / f
        if src.exists():
            shutil.copy2(src, assets / f)
        else:
            missing.append(f)
    if missing:
        print(f"  Warnung: nicht gefunden in {LOGO_DIR}: {', '.join(missing)}")


def rewrite_html(target: Path, title: str) -> Path:
    """HTML-Pfade umbiegen: alles auf _runtime/ relativ, Datei nach <slug>.html benennen."""
    html_src = target / "Praesentation Template.html"
    html_text = html_src.read_text(encoding="utf-8")

    # Title
    html_text = re.sub(
        r"<title>.*?</title>",
        f"<title>{title}</title>",
        html_text,
        count=1,
    )

    # Foundation-Bundle-Pfade auf _runtime/-Layout umbiegen
    # (Template-HTML wurde in Phase A Schritt 3c bereits auf assets/ relativ normalisiert,
    # hier zusätzlich um _runtime/ präfixen für den Anwender-Output-Layout)
    replacements = {
        # Favicon: vom Foundation-relativen Pfad ins Output-_runtime/assets/
        'href="assets/favicon.svg"': 'href="_runtime/assets/favicon.svg"',
        # LOGO_BASE: vom Foundation-relativen Pfad ins Output-_runtime/assets/
        'window.LOGO_BASE = "assets/"': 'window.LOGO_BASE = "_runtime/assets/"',
        # CSS, JS, Vendor — alles bekommt _runtime/-Präfix
        'href="theme.css': 'href="_runtime/theme.css',
        'src="deck-stage.js"': 'src="_runtime/deck-stage.js"',
        'src="vendor/react.production.min.js"': 'src="_runtime/vendor/react.production.min.js"',
        'src="vendor/react-dom.production.min.js"': 'src="_runtime/vendor/react-dom.production.min.js"',
        'src="tweaks-panel.js"': 'src="_runtime/tweaks-panel.js"',
        'src="slides-a.js"': 'src="_runtime/slides-a.js"',
        'src="slides-b.js"': 'src="_runtime/slides-b.js"',
        'src="app.js"': 'src="_runtime/app.js"',
    }
    for old, new in replacements.items():
        html_text = html_text.replace(old, new)

    # Datei umbenennen auf Slug
    new_name = f"{slugify(title)}.html"
    new_path = target / new_name
    new_path.write_text(html_text, encoding="utf-8")
    html_src.unlink()
    return new_path


def main() -> int:
    parser = argparse.ArgumentParser(description="Neue Präsentation aus Master-Template anlegen")
    # Benannte Args (vom Skill bevorzugt verwendet) — alle optional, mit Fallback auf positional
    parser.add_argument("--zielordner", dest="zielordner", help="Zielordner (wird angelegt, falls nicht vorhanden)")
    parser.add_argument("--titel", dest="titel", help="Titel der Präsentation")
    parser.add_argument("--designsystem", dest="designsystem", default="warm-navigator",
                        help="Designsystem-Slug (Default: warm-navigator)")
    parser.add_argument("--datum", dest="datum", help="Datum YYYY-MM-DD (Default: heute, nur informativ)")
    # Rückwärtskompatible positionale Args
    parser.add_argument("target", nargs="?", help="(positional, alt) Zielordner")
    parser.add_argument("title", nargs="?", help="(positional, alt) Titel der Präsentation")
    args = parser.parse_args()

    # Benannte Args haben Vorrang, sonst Fallback auf positionale
    zielordner = args.zielordner or args.target
    titel = args.titel or args.title
    if not zielordner or not titel:
        parser.error("Bitte --zielordner und --titel angeben (oder positional Zielordner und Titel).")

    if args.designsystem and args.designsystem.lower() not in {"warm-navigator", "warm_navigator"}:
        print(f"Hinweis: Designsystem '{args.designsystem}' angefordert. Aktuell ist nur 'warm-navigator' verdrahtet.")
        print("Skill nimmt Warm Navigator als Fallback.")

    target = Path(zielordner).resolve()
    if target.exists() and any(target.iterdir()):
        print(f"Zielordner ist nicht leer: {target}")
        print("Abbruch — bitte leeren Ordner angeben oder Inhalt manuell entfernen.")
        return 2

    print(f"Lege Präsentation an: {target}")
    print(f"Titel: {titel}")

    copy_master(target)
    copy_logos(target)
    html = rewrite_html(target, titel)

    print()
    print(f"Fertig. Doppelklick auf:  {html.name}")
    print(f"Liegt in:  {html.parent}")
    print(f"Slide-Inhalte editierbar in:  {html.parent / '_runtime' / 'src'}")
    return 0


if __name__ == "__main__":
    sys.exit(main())
