from app.tts.dialogue import assign_voices, build_takes, parse_dialogue, timeline

SCRIPT = """Hero: என்னடி? யார் கொடுத்தது?
Wife: வங்கியிலிருந்து வந்திருக்கு.
Hero: இருபத்தைந்து லட்சமா?
Wife: ஆமா."""

def test_parse_dialogue():
    lines = parse_dialogue(SCRIPT)
    assert len(lines) == 4
    assert lines[0].speaker == "Hero"
    assert lines[2].text == "இருபத்தைந்து லட்சமா?"

def test_assign_voices_requires_every_speaker():
    lines = parse_dialogue(SCRIPT)
    mapped = assign_voices(lines, {
        "Hero": "CVOICE-TAM-M-AD-CHE-TEL-A50-001",
        "Wife": "CVOICE-TAM-F-AD-CHE-MLY-A50-001",
    })
    assert mapped[0].voice_id.startswith("CVOICE-")
    assert mapped[1].voice_id.startswith("CVOICE-")

def test_assign_voices_rejects_missing_speaker():
    lines = parse_dialogue(SCRIPT)
    try:
        assign_voices(lines, {"Hero": "CVOICE-TAM-M-AD-CHE-TEL-A50-001"})
        assert False
    except ValueError as exc:
        assert "Wife" in str(exc)

def test_timeline_uses_rendered_durations():
    lines = assign_voices(parse_dialogue(SCRIPT), {
        "Hero": "CVOICE-TAM-M-AD-CHE-TEL-A50-001",
        "Wife": "CVOICE-TAM-F-AD-CHE-MLY-A50-001",
    })
    takes = build_takes(lines)
    result = timeline(takes, {
        "LINE-001": 1200,
        "LINE-002": 900,
        "LINE-003": 1100,
        "LINE-004": 500,
    })
    assert result["items"][0]["start_ms"] == 0
    assert result["items"][0]["end_ms"] == 1200
    assert result["items"][1]["start_ms"] == 1450
    assert result["duration_ms"] == result["items"][-1]["end_ms"] + 250
