"""Approval-first package for final-near rendered videos."""

from __future__ import annotations

from dataclasses import dataclass
import re

from autoshorts.ideas.candidate import SUPPORTED_PLATFORMS, ValidationResult

_PLATFORM_LABELS = {
    "youtube": "YouTube Shorts",
    "tiktok": "TikTok",
    "instagram": "Instagram Reels",
}
_SHA256_RE = re.compile(r"^[a-fA-F0-9]{64}$")


@dataclass(frozen=True)
class FinalVideoApprovalPackage:
    candidate_id: str
    media_path: str
    checksum_sha256: str
    platforms: tuple[str, ...]
    platform_labels: tuple[str, ...]
    title_variants: tuple[str, ...]
    caption: str
    hashtags: tuple[str, ...]
    hook: str
    duration_seconds: int
    resolution: str
    quality_notes: str
    approval_language: str = "de"
    final_video_language: str = "en"
    requires_human_approval: bool = True
    side_effects: tuple[str, ...] = ()


def _is_blank(value: str) -> bool:
    return not (value or "").strip()


def build_truetrace_weird_email_final_approval_package(*, media_path: str, checksum_sha256: str) -> FinalVideoApprovalPackage:
    package = FinalVideoApprovalPackage(
        candidate_id="truetrace-ai-automation-quiet-rot-38s",
        media_path=media_path,
        checksum_sha256=checksum_sha256,
        platforms=("youtube", "tiktok"),
        platform_labels=("YouTube Shorts", "TikTok"),
        title_variants=(
            "Your AI Automation Works Until One Weird Email Arrives",
            "Why AI Automations Break When Real Life Shows Up",
        ),
        caption=(
            "Your AI automation does not need a smarter prompt first. It needs a simple plan for weird inputs: "
            "what goes through, what gets reviewed, and what must stop."
        ),
        hashtags=("#AI", "#AISystems", "#Workflow"),
        hook="Your AI automation works perfectly in the demo. Then one weird email arrives.",
        duration_seconds=37,
        resolution="1080x1920",
        quality_notes=(
            "Beginner-friendly weird-email framing; renderer-owned labels and captions; "
            "scene-specific text-free ChatGPT Image backgrounds; compact phrase-boundary subtitles."
        ),
        approval_language="de",
        final_video_language="en",
        requires_human_approval=True,
        side_effects=(),
    )
    validation = validate_final_video_approval_package(package)
    if not validation.is_valid:
        raise ValueError("; ".join(validation.errors))
    return package


def validate_final_video_approval_package(package: FinalVideoApprovalPackage) -> ValidationResult:
    errors: list[str] = []
    for field_name, value in {
        "candidate_id": package.candidate_id,
        "media_path": package.media_path,
        "checksum_sha256": package.checksum_sha256,
        "caption": package.caption,
        "hook": package.hook,
        "resolution": package.resolution,
        "quality_notes": package.quality_notes,
        "approval_language": package.approval_language,
        "final_video_language": package.final_video_language,
    }.items():
        if _is_blank(value):
            errors.append(f"{field_name} is required")

    if package.media_path and not package.media_path.endswith(".mp4"):
        errors.append("media_path must end with .mp4")
    if package.checksum_sha256 and not _SHA256_RE.match(package.checksum_sha256):
        errors.append("checksum_sha256 must be a 64-character hex string")
    if not package.platforms:
        errors.append("at least one platform is required")
    for platform in package.platforms:
        if platform not in SUPPORTED_PLATFORMS:
            errors.append(f"unsupported platform: {platform}")
    if len(package.platform_labels) != len(package.platforms):
        errors.append("platform_labels must match platforms")
    for platform, label in zip(package.platforms, package.platform_labels):
        expected = _PLATFORM_LABELS.get(platform)
        if expected is not None and label != expected:
            errors.append(f"platform label for {platform} must be {expected}")
    if not package.title_variants:
        errors.append("at least one title variant is required")
    elif any(_is_blank(title) for title in package.title_variants):
        errors.append("title variants must not be blank")
    if not package.hashtags:
        errors.append("at least one hashtag is required")
    elif any(_is_blank(hashtag) for hashtag in package.hashtags):
        errors.append("hashtags must not be blank")
    if not 10 <= package.duration_seconds <= 180:
        errors.append("duration_seconds must be between 10 and 180")
    if package.resolution != "1080x1920":
        errors.append("resolution must be 1080x1920")
    if package.approval_language != "de":
        errors.append("approval_language must be de")
    if package.final_video_language != "en":
        errors.append("final_video_language must be en")
    if not package.requires_human_approval:
        errors.append("human approval is required")
    if package.side_effects:
        errors.append("final video approval packages must not have side effects")
    return ValidationResult(is_valid=not errors, errors=tuple(errors))


def _platform_command(platform: str) -> str:
    if platform == "youtube":
        return "Freigabe YouTube"
    if platform == "tiktok":
        return "Freigabe TikTok"
    if platform == "instagram":
        return "Freigabe Instagram"
    return f"Freigabe {platform}"


def render_final_video_approval_review(package: FinalVideoApprovalPackage) -> str:
    validation = validate_final_video_approval_package(package)
    if not validation.is_valid:
        raise ValueError("; ".join(validation.errors))

    titles = "\n".join(f"- {title}" for title in package.title_variants)
    commands = "\n".join(
        f"- {command}"
        for command in (
            *(_platform_command(platform) for platform in package.platforms),
            "Freigabe alle",
            "Ablehnen",
            "Ändern: <gewünschte Änderung>",
        )
    )
    text = "\n".join(
        (
            "## Final Video Review",
            "",
            f"Candidate: {package.candidate_id}",
            f"Media: {package.media_path}",
            f"SHA256: {package.checksum_sha256}",
            f"Platforms: {', '.join(package.platform_labels)}",
            f"Language: final={package.final_video_language}, review={package.approval_language}",
            f"Duration: {package.duration_seconds}s",
            f"Resolution: {package.resolution}",
            "",
            "Hook:",
            package.hook,
            "",
            "Title variants:",
            titles,
            "",
            "Caption:",
            package.caption,
            "",
            f"Hashtags: {' '.join(package.hashtags)}",
            f"Quality notes: {package.quality_notes}",
            "Requires human approval: yes",
            "Side effects: none",
            "",
            "Approval commands:",
            commands,
        )
    )
    lowered = text.casefold()
    if "publish" in lowered or "post" in lowered:
        raise ValueError("final video review must not imply publishing")
    if len(text) > 4096:
        raise ValueError("final video review exceeds Telegram limit")
    return text
