"""Execute a private YouTube upload after exact hash-bound approval."""

from __future__ import annotations

import argparse
from dataclasses import asdict
import json
from pathlib import Path
from typing import Sequence, TextIO
import sys

from autoshorts.youtube.upload_only import (
    TOKEN_PATH,
    YouTubePrivateUploadPackage,
    execute_private_upload,
    load_token_scopes,
    package_path_for,
    validate_upload_token_scopes,
    warn_if_youtube_api_key_present,
)


def main(argv: Sequence[str] | None = None, *, stdout: TextIO | None = None) -> int:
    parser = argparse.ArgumentParser(description="Execute approved private YouTube upload.")
    parser.add_argument("candidate_id")
    parser.add_argument("--version")
    parser.add_argument("--approval", required=True)
    parser.add_argument("--token", default=str(TOKEN_PATH))
    parser.add_argument("--audit-dir", default="data/youtube_upload_audits")
    args = parser.parse_args(argv)
    out = stdout or sys.stdout
    warning = warn_if_youtube_api_key_present()
    if warning:
        print(warning, file=out)
    token_path = Path(args.token)
    if not token_path.exists():
        print(f"Token missing: {token_path}", file=out)
        return 2
    scopes = load_token_scopes(token_path)
    if not scopes.is_safe:
        print("Token unsafe; upload blocked.", file=out)
        print(scopes.message, file=out)
        return 3
    path = package_path_for(args.candidate_id, args.version)
    if not path.exists():
        print(f"Package not found: {path}", file=out)
        return 2
    package = YouTubePrivateUploadPackage.from_json(path.read_text(encoding="utf-8"))
    try:
        audit = execute_private_upload(package, args.approval, token_scopes=scopes.granted_scopes, audit_dir=args.audit_dir)
    except Exception as exc:
        print(f"Upload blocked/failed: {exc}", file=out)
        return 3
    print(f"YouTube Studio-Link: {audit.studio_link}", file=out)
    print(f"Video-ID: {audit.youtube_video_id}", file=out)
    print(f"Title: {audit.title}", file=out)
    print(package.description, file=out)
    print(f"Tags: {', '.join(audit.tags)}", file=out)
    print(f"Thumbnail-Status: {'uploaded' if audit.thumbnail_result else 'not set'}", file=out)
    print("privacyStatus=private", file=out)
    print(f"containsSyntheticMedia={audit.containsSyntheticMedia}", file=out)
    print(f"selfDeclaredMadeForKids={audit.selfDeclaredMadeForKids}", file=out)
    print("QA: upload-only scope, private status, hash approval, no comments, no analytics API.", file=out)
    print("JARVIS hat nicht veröffentlicht. Bitte im YouTube Studio prüfen und manuell veröffentlichen.", file=out)
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
