"""Gemini Flash Lite chat client — generateContent. Singleton (persistent httpx pool).

ARCHITECTURE §14: GemmaClient yalnız FlovyService'ten çağrılır. Hatalar sarmalanır.
"""
import logging

import httpx

from app.config import settings
from app.utils.exceptions import ExternalServiceError

logger = logging.getLogger("flovy")


class GemmaClient:
    def __init__(self) -> None:
        self._client: httpx.AsyncClient | None = None

    def _http(self) -> httpx.AsyncClient:
        if self._client is None:
            self._client = httpx.AsyncClient(timeout=30.0)
        return self._client

    async def generate(
        self,
        contents: list[dict],
        system_instruction: str | None = None,
        tools: list[dict] | None = None,
    ) -> dict:
        """Ham Gemini generateContent yanıtını döner (ResponseParser ayrıştırır)."""
        if not settings.gemini_api_key:
            raise ExternalServiceError("AI_NOT_CONFIGURED", "AI servisi yapılandırılmamış.", 503)

        payload: dict = {"contents": contents}
        if system_instruction:
            payload["systemInstruction"] = {"parts": [{"text": system_instruction}]}
        if tools:
            payload["tools"] = [{"functionDeclarations": tools}]

        url = f"{settings.gemma_endpoint}/models/{settings.gemma_model}:generateContent"
        try:
            resp = await self._http().post(
                url, params={"key": settings.gemini_api_key}, json=payload
            )
            resp.raise_for_status()
            return resp.json()
        except httpx.TimeoutException as e:
            raise ExternalServiceError(
                "AI_TIMEOUT", "AI yanıt vermedi, tekrar deneyin.", 503
            ) from e
        except (httpx.HTTPStatusError, httpx.HTTPError) as e:
            logger.error("Gemini API hata: %s", e)
            raise ExternalServiceError(
                "AI_ERROR", "AI servisi geçici olarak kullanılamıyor.", 503
            ) from e

    async def aclose(self) -> None:
        if self._client is not None:
            await self._client.aclose()
            self._client = None


_gemma_client = GemmaClient()


def get_gemma_client() -> GemmaClient:
    return _gemma_client
