"""Configuration pytest pour les tests voice."""

import pytest
import tempfile
import os
import numpy as np
from unittest.mock import Mock, patch
import wave
from io import BytesIO

from voice.voice_types import JawConfig
from voice.jaw_sync import JawSyncProcessor


@pytest.fixture
def temp_dir():
    """Répertoire temporaire pour les tests."""
    with tempfile.TemporaryDirectory() as tmp_dir:
        yield tmp_dir


@pytest.fixture
def jaw_config():
    """Configuration jaw sync par défaut pour tests."""
    return JawConfig(gain=1.0, smoothing=0.3, latency_ms=120)


@pytest.fixture
def jaw_processor(jaw_config):
    """Processeur jaw sync mocké."""
    return JawSyncProcessor(jaw_config)


@pytest.fixture
def mock_espeak():
    """Mock eSpeak-NG."""
    with patch("subprocess.run") as mock_run:
        # Mock version check
        mock_run.return_value.returncode = 0
        mock_run.return_value.stdout = "eSpeak NG version 1.50"
        mock_run.return_value.stderr = ""
        yield mock_run


@pytest.fixture
def sample_wav_data():
    """Données WAV de test (sinus 440Hz)."""
    sample_rate = 22050
    duration = 1.0  # 1 seconde
    frequency = 440.0  # La4

    t = np.linspace(0, duration, int(sample_rate * duration))
    audio_data = np.sin(2 * np.pi * frequency * t)

    # Convertit en int16
    audio_int16 = (audio_data * 32767).astype(np.int16)

    # Crée WAV en mémoire
    wav_buffer = BytesIO()
    with wave.open(wav_buffer, "wb") as wav_file:
        wav_file.setnchannels(1)  # mono
        wav_file.setsampwidth(2)  # 16-bit
        wav_file.setframerate(sample_rate)
        wav_file.writeframes(audio_int16.tobytes())

    wav_buffer.seek(0)
    return wav_buffer.getvalue()


@pytest.fixture
def sample_mp3_file(temp_dir):
    """Fichier MP3 de test."""
    # Crée un fichier MP3 factice (juste pour les tests de chemin)
    mp3_path = os.path.join(temp_dir, "test.mp3")
    with open(mp3_path, "wb") as f:
        f.write(b"fake mp3 data for testing")

    return mp3_path


@pytest.fixture
def mock_mqtt_client():
    """Client MQTT mocké."""
    client = Mock()
    client.connect.return_value = 0
    client.subscribe.return_value = (0, 1)
    client.publish.return_value.rc = 0
    return client


@pytest.fixture
def mock_audio_system():
    """Système audio mocké."""
    with patch("voice.audio.subprocess.run") as mock_run:
        # Mock pulseaudio check
        mock_run.return_value.returncode = 0
        mock_run.return_value.stdout = ""
        mock_run.return_value.stderr = ""
        yield mock_run
