"""Pytest configuration — fixtures shared across all tests."""

from __future__ import annotations

from collections.abc import AsyncIterator
from typing import Any

import pytest
from httpx import ASGITransport, AsyncClient

from {{ cookiecutter.project_name }}.config.settings import settings


@pytest.fixture(autouse=True)
def mock_settings(monkeypatch) -> None:
    """Override settings with safe test defaults (no real DB/SMTP/etc)."""
    monkeypatch.setattr(settings, "environment", "dev")
    monkeypatch.setattr(settings, "ip_whitelist", ["127.0.0.1", "::1"])


@pytest.fixture
async def client() -> AsyncIterator[AsyncClient]:
    """HTTPX AsyncClient bound to the FastAPI app (no network)."""
    from main import app

    transport = ASGITransport(app=app)
    async with AsyncClient(transport=transport, base_url="http://test") as ac:
        yield ac


{% if cookiecutter.use_auth == "yes" and cookiecutter.use_db == "yes" %}
@pytest.fixture
async def create_user() -> Any:
    """Factory: create a user in the test DB."""
    from {{ cookiecutter.project_name }}.db.models.user import User
    from {{ cookiecutter.project_name }}.services.auth_service import AuthService

    async def _create(username: str = "tester", password: str = "password123") -> User:
        hashed = AuthService.hash_password(password)
        return await User.create(username=username, email=f"{username}@test.local", hashed_password=hashed)

    return _create


@pytest.fixture
async def auth_client(create_user) -> AsyncIterator[AsyncClient]:
    """HTTPX client with a valid bearer token pre-set."""
    from main import app

    await create_user()
    transport = ASGITransport(app=app)
    async with AsyncClient(transport=transport, base_url="http://test") as ac:
        resp = await ac.post("/api/v1/auth/login", json={"username": "tester", "password": "password123"})
        token = resp.json()["access_token"]
        ac.headers["Authorization"] = f"Bearer {token}"
        yield ac
{% endif %}