from __future__ import annotations

from collections.abc import Mapping
from typing import cast

import httpx

from vibe.cli.plan_offer.ports.whoami_gateway import (
    WhoAmIGatewayError,
    WhoAmIGatewayUnauthorized,
    WhoAmIResponse,
)
from vibe.core.utils.http import build_ssl_context

WHOAMI_PATH = "/api/vibe/whoami"


class HttpWhoAmIGateway:
    def __init__(self, base_url: str) -> None:
        self._base_url = base_url.rstrip("/")

    async def whoami(self, api_key: str) -> WhoAmIResponse:
        url = f"{self._base_url}{WHOAMI_PATH}"
        headers = {"Authorization": f"Bearer {api_key}"}
        try:
            async with httpx.AsyncClient(verify=build_ssl_context()) as client:
                response = await client.get(url, headers=headers)
        except httpx.RequestError as exc:
            raise WhoAmIGatewayError() from exc

        if response.status_code in {httpx.codes.UNAUTHORIZED, httpx.codes.FORBIDDEN}:
            raise WhoAmIGatewayUnauthorized()
        if not response.is_success:
            raise WhoAmIGatewayError(f"Unexpected status {response.status_code}")

        payload = _safe_json(response) or {}
        return WhoAmIResponse.from_payload(payload)


def _safe_json(response: httpx.Response) -> Mapping[str, object] | None:
    try:
        data = response.json()
    except ValueError:
        return None
    return cast(Mapping[str, object], data) if isinstance(data, dict) else None
