"""
Pytest Fixtures für Alerts Agent Tests.

Stellt eine SQLite In-Memory Datenbank für Tests bereit.
Verwendet StaticPool damit alle Connections dieselbe DB sehen.
"""
import pytest
from sqlalchemy import create_engine, event
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool
from fastapi import FastAPI
from fastapi.testclient import TestClient

# Import der Basis und Modelle - WICHTIG: Modelle müssen vor create_all importiert werden
from classroom_engine.database import Base
# Import aller Modelle damit sie bei Base registriert werden
from alerts_agent.db import models as alerts_models  # noqa: F401
from alerts_agent.api.routes import router


# SQLite In-Memory für Tests mit StaticPool (dieselbe Connection für alle)
SQLALCHEMY_TEST_DATABASE_URL = "sqlite:///:memory:"

test_engine = create_engine(
    SQLALCHEMY_TEST_DATABASE_URL,
    connect_args={"check_same_thread": False},
    poolclass=StaticPool,  # Wichtig: Gleiche DB für alle Connections
)


@event.listens_for(test_engine, "connect")
def set_sqlite_pragma(dbapi_connection, connection_record):
    """SQLite Foreign Key Constraints aktivieren."""
    cursor = dbapi_connection.cursor()
    cursor.execute("PRAGMA foreign_keys=ON")
    cursor.close()


TestSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=test_engine)


@pytest.fixture(scope="function")
def test_db():
    """
    Erstellt eine frische Test-Datenbank für jeden Test.
    """
    # Tabellen erstellen
    Base.metadata.create_all(bind=test_engine)

    db = TestSessionLocal()
    try:
        yield db
    finally:
        db.close()
        # Tabellen nach dem Test löschen
        Base.metadata.drop_all(bind=test_engine)


def override_get_db():
    """Test-Database-Dependency - verwendet dieselbe Engine."""
    db = TestSessionLocal()
    try:
        yield db
    finally:
        db.close()


@pytest.fixture(scope="function")
def client(test_db):
    """
    TestClient mit überschriebener Datenbank-Dependency.
    """
    from alerts_agent.db.database import get_db

    app = FastAPI()
    app.include_router(router, prefix="/api")

    # Dependency Override
    app.dependency_overrides[get_db] = override_get_db

    with TestClient(app) as test_client:
        yield test_client

    # Cleanup
    app.dependency_overrides.clear()


@pytest.fixture
def sample_alert_data():
    """Beispieldaten für Alert-Tests."""
    return {
        "title": "Neue Inklusions-Richtlinie",
        "url": "https://example.com/inklusion",
        "snippet": "Das Kultusministerium hat neue Richtlinien...",
        "topic_label": "Inklusion Bayern",
    }


@pytest.fixture
def sample_feedback_data():
    """Beispieldaten für Feedback-Tests."""
    return {
        "is_relevant": True,
        "reason": "Sehr relevant für Schulen",
        "tags": ["wichtig", "inklusion"],
    }
