"""Tests for src/voice/voice_commands.detect_voice_change."""
from __future__ import annotations

import pytest

from src.voice.voice_commands import detect_voice_change


class TestDetectVoiceChange:
    # --- positive cases (direct form) ---
    @pytest.mark.parametrize("text,expected", [
        ("schimbă vocea pe M5", "M5"),
        ("Schimbă vocea pe F3.", "F3"),
        ("vorbește cu vocea M1", "M1"),
        ("vorbește cu vocea F2", "F2"),
        ("voce M4", "M4"),
        ("Voce F5.", "F5"),
        ("treci pe vocea F1", "F1"),
        ("Echo, treci pe M2.", "M2"),
        ("voice M3", "M3"),
    ])
    def test_direct_form(self, text, expected):
        assert detect_voice_change(text) == expected

    # --- positive cases (word form, what Whisper actually produces) ---
    @pytest.mark.parametrize("text,expected", [
        ("schimbă vocea pe em cinci", "M5"),
        ("vorbește cu vocea em trei", "M3"),
        ("voce em unu", "M1"),
        ("schimbă vocea pe ef doi", "F2"),
        ("voce ef cinci", "F5"),
        ("vorbește cu vocea masculină cinci", "M5"),
        ("schimbă vocea pe feminină trei", "F3"),
        ("voce masculin patru", "M4"),
        ("schimbă vocea pe M cinci", "M5"),
        ("voce F două", "F2"),
    ])
    def test_word_form(self, text, expected):
        assert detect_voice_change(text) == expected

    # --- negative cases ---
    @pytest.mark.parametrize("text", [
        "",
        "cât este ora",
        "M5",                          # no trigger word
        "Salut Echo, sunt în M3",       # M3 here is a location/etc, no trigger
        "vocea ta este foarte bună",    # trigger but no voice id
        "schimbă te rog",               # trigger but no id
        "voce M6",                      # out of range
        "voce M0",                      # out of range
        "voce F8",                      # out of range
        "schimbă vocea pe șapte",       # digit out of range
    ])
    def test_no_match(self, text):
        assert detect_voice_change(text) is None
