from __future__ import annotations

import asyncio
import time

import pytest

from sync_state_machine.datasource.api.client import ApiClient


class _FakeResponse:
    status_code = 200

    def raise_for_status(self) -> None:
        return None

    def json(self) -> dict:
        return {"code": 200, "data": []}


class _FakeAsyncClient:
    def __init__(self) -> None:
        self.call_times: list[float] = []

    async def request(self, **kwargs):
        self.call_times.append(time.monotonic())
        return _FakeResponse()


@pytest.mark.asyncio
async def test_api_client_global_rate_limit_applies_to_concurrent_requests() -> None:
    client = ApiClient(
        base_url="http://example.com",
        uid="uid",
        secret="secret",
        rate_limit_max_requests=2,
        rate_limit_window_seconds=0.2,
    )
    fake_client = _FakeAsyncClient()
    client._client = fake_client

    await asyncio.gather(
        client.request("GET", "/ping"),
        client.request("GET", "/ping"),
        client.request("GET", "/ping"),
    )

    assert len(fake_client.call_times) == 3
    third_delay = fake_client.call_times[2] - fake_client.call_times[0]
    assert third_delay >= 0.15
