from autoshorts.config.pillars import (
    ContentPillar,
    DEFAULT_PILLARS,
    find_pillar,
    validate_candidate_against_pillars,
    validate_pillar_registry,
)
from autoshorts.ideas.candidate import VideoCandidate
from autoshorts.scripting.quality import ScriptQualityScore


def _score() -> ScriptQualityScore:
    return ScriptQualityScore(
        hook_strength=9,
        novelty=8,
        clarity=9,
        retention=8,
        ai_slop_risk=2,
        policy_risk="low",
    )


def _candidate(**overrides) -> VideoCandidate:
    data = {
        "candidate_id": "delivery-sms-trap-35s",
        "pillar": "text_delivery_scams",
        "title": "Delivery SMS Trap",
        "platforms": ("youtube", "tiktok"),
        "duration_seconds": 35,
        "hook": "This delivery text is designed to make you panic.",
        "script_outline": "Show a fake delivery SMS, reveal pressure as the red flag, then open the app yourself.",
        "visual_concept": "Phone SMS mockup with urgent fee, suspicious link, and screenshot checklist.",
        "caption": "If it makes you hurry, slow down.",
        "cta": "Follow for one red flag before you click.",
        "hashtags": ("#ScamAwareness", "#CyberSafety"),
        "quality_score": _score(),
        "policy_notes": ("No real brands, URLs, QR codes, or phone numbers",),
        "hypothesis": "Beginner delivery-scam screens create higher saves and family shares.",
    }
    data.update(overrides)
    return VideoCandidate(**data)


def test_default_registry_contains_digital_red_flags_positioning():
    pillar = find_pillar("text_delivery_scams", DEFAULT_PILLARS)

    assert pillar is not None
    assert "delivery" in pillar.positioning.casefold()
    assert any("one normal screen" in rule for rule in pillar.visual_rules)
    assert "beautiful AI visuals with no visible viewer pain" in pillar.no_go
    assert "youtube" in pillar.platform_fit


def test_default_registry_prioritizes_scam_self_defense_pillars_not_ai_workflow():
    pillar_ids = {pillar.pillar_id for pillar in DEFAULT_PILLARS}

    assert "text_delivery_scams" in pillar_ids
    assert "login_account_traps" in pillar_ids
    assert "payment_invoice_red_flags" in pillar_ids
    assert "marketplace_buyer_scams" in pillar_ids
    assert "fake_support_popup_scams" in pillar_ids
    assert "ai_life_systems" in pillar_ids  # legacy secondary pillar kept for backwards-compatible tooling


def test_pillar_registry_validation_rejects_duplicate_ids():
    first = ContentPillar(
        pillar_id="dup",
        audience="normal users",
        positioning="first",
        tone=("clear",),
        hook_patterns=("hook",),
        visual_rules=("rule",),
        no_go=("no",),
        platform_fit=("youtube",),
        monetization_angle="newsletter",
    )
    second = ContentPillar(
        pillar_id="dup",
        audience="normal users",
        positioning="second",
        tone=("clear",),
        hook_patterns=("hook",),
        visual_rules=("rule",),
        no_go=("no",),
        platform_fit=("youtube",),
        monetization_angle="newsletter",
    )

    result = validate_pillar_registry((first, second))

    assert result.is_valid is False
    assert "pillar ids must be unique" in result.errors


def test_candidate_passes_known_pillar_and_platform_fit():
    result = validate_candidate_against_pillars(_candidate(), DEFAULT_PILLARS)

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


def test_candidate_rejects_unknown_pillar():
    result = validate_candidate_against_pillars(
        _candidate(pillar="unknown_pillar"), DEFAULT_PILLARS
    )

    assert result.is_valid is False
    assert "unknown pillar: unknown_pillar" in result.errors


def test_candidate_rejects_platform_not_fit_for_pillar():
    registry = (
        ContentPillar(
            pillar_id="narrow",
            audience="specific audience",
            positioning="narrow test pillar",
            tone=("clear",),
            hook_patterns=("hook",),
            visual_rules=("rule",),
            no_go=("no",),
            platform_fit=("youtube",),
            monetization_angle="newsletter",
        ),
    )

    result = validate_candidate_against_pillars(
        _candidate(pillar="narrow", platforms=("youtube", "tiktok")), registry
    )

    assert result.is_valid is False
    assert "platform tiktok is not configured for pillar narrow" in result.errors


def test_registry_validation_rejects_empty_required_pillar_fields():
    pillar = ContentPillar(
        pillar_id="",
        audience="",
        positioning="",
        tone=(),
        hook_patterns=(),
        visual_rules=(),
        no_go=(),
        platform_fit=(),
        monetization_angle="",
    )

    result = validate_pillar_registry((pillar,))

    assert result.is_valid is False
    assert "pillar_id is required" in result.errors
    assert "audience is required" in result.errors
    assert "at least one hook pattern is required" in result.errors
    assert "at least one platform fit is required" in result.errors
