from __future__ import annotations

import pytest

from firecrawl_client.exceptions import (
    FirecrawlBadRequest,
    FirecrawlServerError,
    FirecrawlTimeout,
)
from firecrawl_client.retry import with_retry


def test_retries_on_server_error_then_succeeds():
    calls = {"n": 0}

    @with_retry(max_attempts=3, max_wait=0.1)
    def flaky():
        calls["n"] += 1
        if calls["n"] < 3:
            raise FirecrawlServerError(f"500 attempt {calls['n']}")
        return "ok"

    assert flaky() == "ok"
    assert calls["n"] == 3


def test_retries_on_timeout_then_raises_after_max():
    calls = {"n": 0}

    @with_retry(max_attempts=3, max_wait=0.1)
    def always_timeout():
        calls["n"] += 1
        raise FirecrawlTimeout("dead")

    with pytest.raises(FirecrawlTimeout):
        always_timeout()
    assert calls["n"] == 3


def test_no_retry_on_bad_request():
    calls = {"n": 0}

    @with_retry(max_attempts=3, max_wait=0.1)
    def bad():
        calls["n"] += 1
        raise FirecrawlBadRequest("400 invalid")

    with pytest.raises(FirecrawlBadRequest):
        bad()
    assert calls["n"] == 1
