from pathlib import Path

import pytest

from autoshorts.content.brief import create_content_brief
from autoshorts.content.script_draft import create_script_draft
from autoshorts.content.to_candidate import convert_script_draft_to_candidate
from autoshorts.preview.package import (
    ContentPreviewApprovalPackage,
    build_content_preview_approval_package,
    render_content_preview_approval_text,
    validate_content_preview_approval_package,
)
from autoshorts.rendering.preview import build_html_preview
from autoshorts.rendering.shot_plan import create_shot_plan
from autoshorts.rendering.manifest import build_render_manifest
from autoshorts.social.draft import build_social_media_draft
from autoshorts.social.review import render_social_media_draft_review


def _draft_and_review():
    brief = create_content_brief(
        pillar_id="ai_life_systems",
        topic="AI weekly review routine",
        audience_problem="I use AI tools but still lose control of priorities.",
        payoff="a 10-minute Sunday review that keeps AI as assistant, not boss",
    )
    script = create_script_draft(brief)
    candidate = convert_script_draft_to_candidate(brief, script)
    manifest = build_render_manifest(create_shot_plan(script))
    preview = build_html_preview(manifest)
    draft = build_social_media_draft(candidate, preview)
    return draft, render_social_media_draft_review(draft)


def test_build_content_preview_approval_package_combines_video_and_social_review(tmp_path):
    draft, review_text = _draft_and_review()
    video_path = tmp_path / "preview.mp4"
    video_path.write_bytes(b"fake mp4")

    package = build_content_preview_approval_package(
        draft=draft,
        preview_video_path=video_path,
        social_review_text=review_text,
    )

    assert isinstance(package, ContentPreviewApprovalPackage)
    assert package.candidate_id == "ai_life_systems-ai-weekly-review-routine-35s"
    assert package.preview_video_path == str(video_path)
    assert package.social_review_text == review_text
    assert package.approval_language == "de"
    assert package.final_video_language == "en"
    assert package.approval_commands == (
        "Freigabe YouTube",
        "Freigabe TikTok",
        "Freigabe Instagram",
        "Freigabe alle",
        "Ablehnen",
        "Ändern: <requested change>",
    )
    assert package.requires_human_approval is True
    assert package.side_effects == ()
    assert package.external_calls == ()


def test_validate_content_preview_approval_package_accepts_valid_package(tmp_path):
    draft, review_text = _draft_and_review()
    video_path = tmp_path / "preview.mp4"
    video_path.write_bytes(b"fake mp4")

    result = validate_content_preview_approval_package(
        build_content_preview_approval_package(
            draft=draft,
            preview_video_path=video_path,
            social_review_text=review_text,
        )
    )

    assert result.is_valid is True
    assert result.errors == ()


def test_build_content_preview_approval_package_rejects_missing_video(tmp_path):
    draft, review_text = _draft_and_review()

    with pytest.raises(ValueError, match="preview video path must exist"):
        build_content_preview_approval_package(
            draft=draft,
            preview_video_path=tmp_path / "missing.mp4",
            social_review_text=review_text,
        )


def test_validate_content_preview_approval_package_rejects_side_effects_and_action_language(tmp_path):
    draft, review_text = _draft_and_review()
    video_path = tmp_path / "preview.mp4"
    video_path.write_bytes(b"fake mp4")
    package = build_content_preview_approval_package(
        draft=draft,
        preview_video_path=video_path,
        social_review_text=review_text,
    )
    unsafe = ContentPreviewApprovalPackage(
        candidate_id=package.candidate_id,
        preview_video_path=package.preview_video_path,
        social_review_text="Post this now",
        approval_commands=package.approval_commands,
        approval_language=package.approval_language,
        final_video_language=package.final_video_language,
        requires_human_approval=False,
        side_effects=("send_telegram",),
        external_calls=("telegram",),
    )

    result = validate_content_preview_approval_package(unsafe)

    assert result.is_valid is False
    assert "human approval is required" in result.errors
    assert "content preview packages must not have side effects" in result.errors
    assert "content preview packages must not call external tools" in result.errors
    assert "social_review_text must not contain publish/post action language" in result.errors


def test_render_content_preview_approval_text_is_telegram_safe_and_references_video(tmp_path):
    draft, review_text = _draft_and_review()
    video_path = tmp_path / "preview.mp4"
    video_path.write_bytes(b"fake mp4")
    package = build_content_preview_approval_package(
        draft=draft,
        preview_video_path=video_path,
        social_review_text=review_text,
    )

    text = render_content_preview_approval_text(package)

    assert text.startswith("## Content Preview Review")
    assert f"Video preview: {video_path}" in text
    assert "Approval preview language: de" in text
    assert "Final video language: en" in text
    assert "Freigabe alle" in text
    assert "## Social Media Draft Review" in text
    assert "publish" not in text.casefold()
    assert "post" not in text.casefold()
    assert len(text) < 4096
