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,
    convert_script_draft_to_candidate_draft,
)
from autoshorts.ideas.factory import CandidateDraft
from autoshorts.ideas.candidate import VideoCandidate


def _brief():
    return 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",
    )


def test_convert_script_draft_to_candidate_draft_preserves_content_strategy():
    brief = _brief()
    script = create_script_draft(brief)

    candidate_draft = convert_script_draft_to_candidate_draft(brief, script)

    assert isinstance(candidate_draft, CandidateDraft)
    assert candidate_draft.pillar == "ai_life_systems"
    assert candidate_draft.title == "AI weekly review routine"
    assert candidate_draft.platforms == ("youtube", "tiktok", "instagram")
    assert candidate_draft.duration_seconds == 35
    assert candidate_draft.hook == script.hook
    assert candidate_draft.script_outline == script.script_outline
    assert candidate_draft.visual_concept == script.visual_concept
    assert candidate_draft.caption == script.caption
    assert candidate_draft.cta == script.cta
    assert candidate_draft.hypothesis == "A human-approval AI routine creates saves because it gives viewers control without hype."
    assert candidate_draft.quality_score.average_quality == 8.0
    assert candidate_draft.quality_score.ai_slop_risk == 3
    assert candidate_draft.quality_score.policy_risk == "low"
    assert "Source brief: ai_life_systems-ai-weekly-review-routine" in candidate_draft.policy_notes
    assert "No-go inherited: fake earnings" in candidate_draft.policy_notes
    assert "Human approval remains explicit" in candidate_draft.policy_notes


def test_convert_script_draft_to_candidate_uses_existing_candidate_factory():
    brief = _brief()
    script = create_script_draft(brief)

    candidate = convert_script_draft_to_candidate(brief, script)

    assert isinstance(candidate, VideoCandidate)
    assert candidate.candidate_id == "ai_life_systems-ai-weekly-review-routine-35s"
    assert candidate.pillar == "ai_life_systems"
    assert candidate.title == "AI weekly review routine"
    assert candidate.hashtags == ("#AI", "#LifeSystems", "#Productivity")
    assert "Duration class: growth_short" in candidate.policy_notes


def test_convert_script_draft_to_candidate_rejects_invalid_script():
    brief = _brief()
    script = create_script_draft(brief, hook="")

    with pytest.raises(ValueError, match="hook is required"):
        convert_script_draft_to_candidate_draft(brief, script)


def test_convert_script_draft_to_candidate_rejects_mismatched_brief():
    brief = _brief()
    other_brief = create_content_brief(
        pillar_id="ai_life_systems",
        topic="AI calendar cleanup",
        audience_problem="My calendar is full of fake priorities.",
        payoff="one approval checkpoint for calendar changes",
    )
    script = create_script_draft(other_brief)

    with pytest.raises(ValueError, match="script draft does not belong to content brief"):
        convert_script_draft_to_candidate_draft(brief, script)
