"""
Pytest Configuration and Fixtures
"""
import pytest
import asyncio
import sys
from typing import Generator


@pytest.fixture(scope="session")
def event_loop() -> Generator:
    """Create an instance of the default event loop for the test session."""
    loop = asyncio.get_event_loop_policy().new_event_loop()
    yield loop
    loop.close()


@pytest.fixture
def client():
    """Create test client with lifespan context manager.

    This ensures app.state.orchestrator and app.state.encryption are initialized.
    """
    from fastapi.testclient import TestClient
    from main import app

    # Use context manager to trigger lifespan events (startup/shutdown)
    with TestClient(app) as test_client:
        yield test_client


@pytest.fixture
def valid_key_hash() -> str:
    """Return a valid key hash for testing."""
    # SHA-256 produces 32 bytes, which is 44 chars in base64 (with padding)
    return "sha256:eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg="


@pytest.fixture
def sample_namespace_id() -> str:
    """Return a sample namespace ID for testing."""
    return "ns-12345678abcdef12345678abcdef12"


@pytest.fixture
def sample_session_data(sample_namespace_id, valid_key_hash) -> dict:
    """Return sample session creation data."""
    return {
        "namespace_id": sample_namespace_id,
        "key_hash": valid_key_hash,
        "device_type": "pwa",
        "client_version": "1.0.0",
    }


@pytest.fixture
def sample_task_data() -> dict:
    """Return sample task creation data."""
    return {
        "type": "student_observation",
        "intent_text": "Notiz zu Max: heute wiederholt gestoert",
        "parameters": {
            "student_name": "Max",
            "observation": "wiederholt gestoert",
        },
    }


@pytest.fixture
def sample_audio_bytes() -> bytes:
    """Return sample audio data for testing."""
    import numpy as np

    # Generate 80ms of silence at 24kHz
    samples = np.zeros(1920, dtype=np.int16)  # 24000 * 0.08 = 1920 samples
    return samples.tobytes()


@pytest.fixture
def sample_voice_command_texts() -> list:
    """Return sample voice command texts for testing."""
    return [
        "Notiz zu Max: heute wiederholt gestoert",
        "Erinner mich morgen an Hausaufgabenkontrolle",
        "Erstelle Arbeitsblatt mit 3 Lueckentexten",
        "Elternbrief wegen wiederholter Stoerungen",
        "Nachricht an 8a: Hausaufgaben bis Mittwoch",
        "10 Minuten Einstieg, 5 Aufgaben",
        "Vokabeltest mit Loesungen",
        "Ueberschriften groesser",
        "Alles auf eine Seite, Drucklayout A4",
        "Operatoren-Checkliste fuer diese Aufgabe",
    ]
