from autoshorts.audio.subtitles import (
    SubtitleCue,
    SubtitleStyle,
    build_hormozi_subtitle_track,
    validate_subtitle_track,
)


def test_build_hormozi_subtitle_track_chunks_text_into_renderer_owned_safe_cues():
    track = build_hormozi_subtitle_track(
        "Most AI automations do not fail dramatically. They quietly rot when the workflow has no exception path.",
        total_duration_seconds=8,
    )

    assert track.renderer_owned is True
    assert track.style == SubtitleStyle.hormozi_inspired()
    assert track.side_effects == ()
    assert track.external_calls == ()
    assert track.cues[0].start_ms == 0
    assert track.cues[-1].end_ms == 8000
    assert all(2 <= len(cue.text.split()) <= 5 for cue in track.cues)
    assert all(cue.active_word in cue.text.upper().split() for cue in track.cues)
    assert all(cue.max_lines == 2 for cue in track.cues)
    assert all(cue.renderer_owned for cue in track.cues)


def test_build_hormozi_subtitle_track_uses_continuous_timing_and_emphasis_metadata():
    track = build_hormozi_subtitle_track(
        "Prompt is not system. Workflow boundaries create reliable automation.",
        total_duration_seconds=6,
    )

    previous_end = 0
    for cue in track.cues:
        assert cue.start_ms == previous_end
        assert cue.end_ms > cue.start_ms
        assert cue.emphasis_color == track.style.accent_color
        previous_end = cue.end_ms
    assert previous_end == 6000


def test_validate_subtitle_track_rejects_non_renderer_owned_and_overcrowded_cues():
    cue = SubtitleCue(
        text="THIS CUE HAS FAR TOO MANY WORDS",
        start_ms=0,
        end_ms=1000,
        active_word="TOO",
        renderer_owned=False,
    )
    track = build_hormozi_subtitle_track("short valid text", total_duration_seconds=2).with_cues((cue,))

    validation = validate_subtitle_track(track)

    assert validation.is_valid is False
    assert "subtitle cue 1 must be renderer-owned" in validation.errors
    assert "subtitle cue 1 must contain 2..5 words" in validation.errors


def test_build_hormozi_subtitle_track_rejects_blank_text_and_bad_duration():
    for text, duration in [("", 3), ("valid text", 0)]:
        try:
            build_hormozi_subtitle_track(text, total_duration_seconds=duration)
        except ValueError as exc:
            assert str(exc)
        else:
            raise AssertionError("expected ValueError")
