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.rendering.manifest import build_render_manifest
from autoshorts.rendering.preview import build_html_preview
from autoshorts.rendering.shot_plan import create_shot_plan
from autoshorts.social.draft import (
    SocialMediaDraft,
    build_social_media_draft,
    validate_social_media_draft,
)


def _candidate_and_preview():
    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)
    preview = build_html_preview(build_render_manifest(create_shot_plan(script)))
    return candidate, preview


def test_build_social_media_draft_creates_approval_first_post_draft():
    candidate, preview = _candidate_and_preview()

    draft = build_social_media_draft(candidate, preview)

    assert isinstance(draft, SocialMediaDraft)
    assert draft.candidate_id == "ai_life_systems-ai-weekly-review-routine-35s"
    assert draft.platforms == ("youtube", "tiktok", "instagram")
    assert draft.platform_labels == ("YouTube Shorts", "TikTok", "Instagram Reels")
    assert draft.title_variants == (
        "AI weekly review routine",
        "If AI runs your week, you have already lost control.",
    )
    assert draft.caption == candidate.caption
    assert draft.hashtags == ("#AI", "#LifeSystems", "#Productivity")
    assert draft.cta == candidate.cta
    assert draft.hook == candidate.hook
    assert draft.planned_duration_seconds == 35
    assert draft.preview_reference == "HTML timeline preview available"
    assert draft.preview_type == "html_timeline"
    assert draft.requires_human_approval is True
    assert draft.side_effects == ()
    assert "Quality average: 8.0" in draft.quality_risk_summary
    assert "AI-slop risk: 3" in draft.quality_risk_summary
    assert "Policy risk: low" in draft.quality_risk_summary


def test_validate_social_media_draft_accepts_default_draft():
    candidate, preview = _candidate_and_preview()

    result = validate_social_media_draft(build_social_media_draft(candidate, preview))

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


def test_build_social_media_draft_rejects_preview_for_different_script():
    candidate, preview = _candidate_and_preview()
    mismatched = type(preview)(
        script_id="other-script",
        title=preview.title,
        preview_type=preview.preview_type,
        html=preview.html,
        side_effects=preview.side_effects,
        external_calls=preview.external_calls,
    )

    with pytest.raises(ValueError, match="preview script_id must match candidate source brief"):
        build_social_media_draft(candidate, mismatched)


def test_validate_social_media_draft_rejects_missing_approval_and_side_effects():
    candidate, preview = _candidate_and_preview()
    draft = build_social_media_draft(candidate, preview)
    unsafe = SocialMediaDraft(
        candidate_id=draft.candidate_id,
        platforms=draft.platforms,
        platform_labels=draft.platform_labels,
        title_variants=draft.title_variants,
        caption=draft.caption,
        hashtags=draft.hashtags,
        cta=draft.cta,
        hook=draft.hook,
        planned_duration_seconds=draft.planned_duration_seconds,
        quality_risk_summary=draft.quality_risk_summary,
        preview_reference=draft.preview_reference,
        preview_type=draft.preview_type,
        requires_human_approval=False,
        side_effects=("platform_upload",),
    )

    result = validate_social_media_draft(unsafe)

    assert result.is_valid is False
    assert "human approval is required" in result.errors
    assert "social media drafts must not have side effects" in result.errors


def test_validate_social_media_draft_rejects_unsupported_platform_and_blank_fields():
    draft = SocialMediaDraft(
        candidate_id="",
        platforms=("linkedin",),
        platform_labels=("LinkedIn",),
        title_variants=(),
        caption="",
        hashtags=(),
        cta="",
        hook="",
        planned_duration_seconds=9,
        quality_risk_summary="",
        preview_reference="",
        preview_type="",
        requires_human_approval=True,
        side_effects=(),
    )

    result = validate_social_media_draft(draft)

    assert result.is_valid is False
    assert "candidate_id is required" in result.errors
    assert "unsupported platform: linkedin" in result.errors
    assert "at least one title variant is required" in result.errors
    assert "caption is required" in result.errors
    assert "at least one hashtag is required" in result.errors
    assert "cta is required" in result.errors
    assert "hook is required" in result.errors
    assert "planned_duration_seconds must be between 10 and 180" in result.errors
    assert "quality_risk_summary is required" in result.errors
    assert "preview_reference is required" in result.errors
    assert "preview_type is required" in result.errors
