from pathlib import Path
import subprocess

from autoshorts.audio.edge_tts_adapter import EdgeTTSRequest, synthesize_edge_tts, validate_edge_tts_request
from autoshorts.audio.tts_plan import build_default_truetrace_tts_plan


def test_synthesize_edge_tts_builds_command_and_reports_explicit_side_effects(tmp_path):
    output_path = tmp_path / "voice.mp3"
    calls = []

    def fake_runner(command, *, capture_output, text, check):
        calls.append(command)
        output_path.write_bytes(b"fake mp3")
        return subprocess.CompletedProcess(command, 0, stdout="ok", stderr="")

    result = synthesize_edge_tts(
        EdgeTTSRequest(
            text="Most AI automations quietly rot.",
            tts_plan=build_default_truetrace_tts_plan(),
            output_path=str(output_path),
        ),
        runner=fake_runner,
    )

    assert output_path.exists()
    assert calls == [[
        "edge-tts",
        "--voice",
        "en-GB-RyanNeural",
        "--text",
        "Most AI automations quietly rot.",
        "--write-media",
        str(output_path),
    ]]
    assert result.output_path == str(output_path)
    assert result.voice == "en-GB-RyanNeural"
    assert result.side_effects == ("call_edge_tts", "write_audio")
    assert result.external_calls == ("edge-tts",)


def test_validate_edge_tts_request_rejects_bad_provider_blank_text_and_non_mp3(tmp_path):
    plan = build_default_truetrace_tts_plan()
    bad_provider = EdgeTTSRequest(
        text="valid text",
        tts_plan=plan.__class__(
            provider="nvidia_magpie_tts_multilingual",
            voice="default",
            language="en",
            role="voice_generation",
            requires_local_gpu=False,
            blocks_video_gpu=False,
            requires_api_key=True,
        ),
        output_path=str(tmp_path / "voice.mp3"),
    )
    blank_text = EdgeTTSRequest(text="", tts_plan=plan, output_path=str(tmp_path / "voice.mp3"))
    bad_suffix = EdgeTTSRequest(text="valid text", tts_plan=plan, output_path=str(tmp_path / "voice.wav"))

    assert "EdgeTTS adapter requires provider edge_tts" in validate_edge_tts_request(bad_provider).errors
    assert "text is required" in validate_edge_tts_request(blank_text).errors
    assert "output_path must end with .mp3" in validate_edge_tts_request(bad_suffix).errors
