from autoshorts.audio.tts_plan import (
    TTSProviderPlan,
    build_default_truetrace_tts_plan,
    build_tts_ab_test_plan,
    validate_tts_provider_plan,
)


def test_build_default_truetrace_tts_plan_uses_edge_tts_without_gpu_or_external_api_key():
    plan = build_default_truetrace_tts_plan()

    assert plan.provider == "edge_tts"
    assert plan.voice == "en-GB-RyanNeural"
    assert plan.language == "en"
    assert plan.requires_local_gpu is False
    assert plan.blocks_video_gpu is False
    assert plan.requires_api_key is False
    assert plan.role == "voice_generation"
    assert plan.side_effects == ()
    assert plan.external_calls == ()


def test_build_tts_ab_test_plan_keeps_magpie_hosted_and_whisper_as_alignment_only():
    plan = build_tts_ab_test_plan()

    assert [candidate.provider for candidate in plan.candidates] == [
        "edge_tts",
        "nvidia_magpie_tts_multilingual",
        "whisper_alignment",
    ]
    magpie = plan.candidates[1]
    whisper = plan.candidates[2]
    assert magpie.requires_local_gpu is False
    assert magpie.blocks_video_gpu is False
    assert magpie.requires_api_key is True
    assert magpie.role == "voice_generation"
    assert whisper.role == "alignment_qa"
    assert whisper.provider != "tts"
    assert whisper.blocks_video_gpu is False
    assert plan.recommended_default_provider == "edge_tts"


def test_validate_tts_provider_plan_rejects_whisper_as_voice_generation_and_gpu_blocking_default():
    bad_whisper = TTSProviderPlan(
        provider="whisper",
        voice="base",
        language="en",
        role="voice_generation",
        requires_local_gpu=False,
        blocks_video_gpu=False,
        requires_api_key=False,
    )
    bad_gpu_default = TTSProviderPlan(
        provider="local_gpu_tts",
        voice="some-voice",
        language="en",
        role="voice_generation",
        requires_local_gpu=True,
        blocks_video_gpu=True,
        requires_api_key=False,
        default_for_phase="phase_1",
    )

    whisper_validation = validate_tts_provider_plan(bad_whisper)
    gpu_validation = validate_tts_provider_plan(bad_gpu_default)

    assert whisper_validation.is_valid is False
    assert "Whisper is STT/alignment, not TTS" in whisper_validation.errors
    assert gpu_validation.is_valid is False
    assert "phase-1 TTS must not block the local video GPU" in gpu_validation.errors
