from __future__ import annotations

from typing import Any

import httpx
import pytest
from fastapi.testclient import TestClient

from src.main import app


class FakeResponse:
    def __init__(self, payload: Any, status_code: int = 200) -> None:
        self._payload = payload
        self.status_code = status_code

    def json(self) -> Any:
        return self._payload

    def raise_for_status(self) -> None:
        if self.status_code >= 400:
            request = httpx.Request("GET", "https://example.test")
            response = httpx.Response(self.status_code, request=request)
            raise httpx.HTTPStatusError("error", request=request, response=response)


class FakeClient:
    def __init__(self, response: FakeResponse | None = None, fail: bool = False) -> None:
        self.response = response
        self.fail = fail

    async def get(self, *_args, **_kwargs) -> FakeResponse:
        if self.fail:
            raise httpx.ConnectError("boom")
        if self.response is None:
            return FakeResponse({})
        return self.response

    async def aclose(self) -> None:
        return None


@pytest.fixture
def client() -> TestClient:
    return TestClient(app)
