"""
Adapter for REST API integration
For FastAPI/Flask integration
"""

from typing import Dict, Any, Optional
import asyncio


class APIAdapter:
    """
    Adapter that exposes the brain via HTTP API
"""

    def __init__(self, brain):
        self.brain = brain

    async def handle_message(self, request_data: Dict[str, Any]) -> Dict[str, Any]:
        """
        Handle incoming message from API

        Expected format:
        {
            "message": "user message",
            "user_id": "user_123",
            "session_id": "optional_session",
            "context": {"key": "value"}
        }
        """
        message = request_data.get("message", "").strip()
        user_id = request_data.get("user_id", "anonymous")
        session_id = request_data.get("session_id")
        context = request_data.get("context", {})

        if not message:
            return {
                "success": False,
                "error": "No message provided",
                "response": None
            }

        try:
            result = await self.brain.process(
                message=message,
                user_id=user_id,
                session_id=session_id,
                system_context=context.get("system_context")
            )

            return {
                "success": True,
                "response": result.response,
                "metadata": {
                    "intent": result.intent,
                    "used_tools": result.used_tools,
                    "confidence": result.confidence,
                    "tokens_used": result.tokens_used,
                    "processing_time": result.processing_time
                }
            }

        except Exception as e:
            return {
                "success": False,
                "error": str(e),
                "response": "Desculpe, ocorreu um erro ao processar sua mensagem."

            }

    async def handle_stream(self, request_data: Dict[str, Any]):
        """
        Handle streaming response

        Yields chunks of text as they are generated.
        """
        message = request_data.get("message", "").strip()
        user_id = request_data.get("user_id", "anonymous")
        session_id = request_data.get("session_id")

        if not message:
            yield {"type": "error", "content": "No message provided"}
            return

        try:
            async for chunk in self.brain.stream_process(
                message=message,
                user_id=user_id,
                session_id=session_id
            ):
                yield {"type": "chunk", "content": chunk}

            yield {"type": "done"}

        except Exception as e:
            yield {"type": "error", "content": str(e)}