"""B1-P provider snapshot extractor: no provider, network, or production writes."""

from types import SimpleNamespace

from src.integrations.project_intake_client import (
    provider_error_snapshot,
    provider_usage_snapshot,
)


def test_snapshot_keeps_only_rate_limit_headers_and_classifies_tokens():
    exc = SimpleNamespace(
        status_code=429,
        code="rate_limit_exceeded",
        request_id="req_test",
        message="Rate limit reached for tokens per min",
        response=SimpleNamespace(
            status_code=429,
            headers={
                "retry-after": "1",
                "x-ratelimit-limit-tokens": "200000",
                "x-ratelimit-remaining-tokens": "0",
                "authorization": "Bearer secret",
                "x-request-id": "req_test",
            },
        ),
    )
    snapshot = provider_error_snapshot(exc)
    assert snapshot["http_status"] == 429
    assert snapshot["error_code"] == "rate_limit_exceeded"
    assert snapshot["message_class"] == "tokens"
    assert snapshot["retry_after"] == "1"
    assert snapshot["headers"]["x-ratelimit-remaining-tokens"] == "0"
    assert "authorization" not in snapshot["headers"]
    assert snapshot["sdk_max_retries"] == 0


def test_snapshot_classifies_request_and_quota_messages():
    request_exc = SimpleNamespace(
        status_code=429,
        code="rate_limit_exceeded",
        request_id=None,
        message="Rate limit reached for requests",
        response=SimpleNamespace(headers={"x-ratelimit-remaining-requests": "0"}),
    )
    quota_exc = SimpleNamespace(
        status_code=429,
        code="insufficient_quota",
        request_id=None,
        message="You exceeded your current quota",
        response=None,
    )
    assert provider_error_snapshot(request_exc)["message_class"] == "requests"
    assert provider_error_snapshot(quota_exc)["message_class"] == "quota"


def test_usage_snapshot_omits_empty_fields():
    response = SimpleNamespace(
        usage=SimpleNamespace(
            prompt_tokens=8120,
            completion_tokens=640,
            total_tokens=8760,
            input_tokens=None,
            output_tokens=None,
        )
    )
    assert provider_usage_snapshot(response) == {
        "prompt_tokens": 8120,
        "completion_tokens": 640,
        "total_tokens": 8760,
    }
    assert provider_usage_snapshot(SimpleNamespace(usage=None)) is None
