"""
ytshorts pipeline orchestrator.

Usage:
    python3 main.py                    # one video, random theme
    python3 main.py --theme "revenge"  # specific theme
    python3 main.py --stem my_slug     # deterministic output name
    python3 main.py --dry-run          # story + audio only, skip render
"""
import argparse
import json
import sys
from datetime import datetime, timezone
from pathlib import Path

from config import LOGS_DIR, OUTPUT_DIR
from story import generate_story, save_story
from tts import generate_tts
from render import render_short


def _log(stem: str, data: dict) -> None:
    entry = {"stem": stem, "ts": datetime.now(timezone.utc).isoformat(), **data}
    log_file = LOGS_DIR / "runs.jsonl"
    with log_file.open("a") as f:
        f.write(json.dumps(entry) + "\n")


def run(theme: str | None = None, stem: str | None = None, dry_run: bool = False) -> Path | None:
    print("── Story generation ──────────────────────────")
    story = generate_story(theme)
    story, stem = save_story(story, stem)
    print(f"  Title  : {story['title']}")
    print(f"  Words  : {len(story['story'].split())}")
    print(f"  Source : {story['source']}")
    print(f"  Stem   : {stem}")

    print("\n── TTS + subtitles ───────────────────────────")
    mp3, ass, duration = generate_tts(story["story"], stem)
    print(f"  Audio  : {mp3}  ({duration:.1f}s)")
    print(f"  ASS    : {ass}")

    if dry_run:
        print("\n[dry-run] Skipping render.")
        _log(stem, {"title": story["title"], "duration": duration, "status": "dry-run"})
        return None

    print("\n── Render ────────────────────────────────────")
    output = render_short(mp3, ass, duration, stem)
    size_mb = output.stat().st_size / 1_048_576
    print(f"  Output : {output}  ({size_mb:.1f} MB)")

    _log(stem, {
        "title": story["title"],
        "description": story["description"],
        "hashtags": story["hashtags"],
        "duration": duration,
        "output": str(output),
        "size_mb": round(size_mb, 2),
        "status": "ok",
    })

    print("\n── Done ──────────────────────────────────────")
    print(f"  {output}")
    return output


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="YouTube Shorts pipeline")
    parser.add_argument("--theme", help="Story theme")
    parser.add_argument("--stem", help="Output filename stem (default: timestamp)")
    parser.add_argument("--dry-run", action="store_true", help="Skip video render")
    args = parser.parse_args()

    try:
        result = run(theme=args.theme, stem=args.stem, dry_run=args.dry_run)
        sys.exit(0)
    except Exception as e:
        print(f"\n[ERROR] {e}", file=sys.stderr)
        sys.exit(1)
