from __future__ import annotations

import logging

import httpx

from config.settings import settings

logger = logging.getLogger(__name__)

TIMEOUT = 5.0  # ثانية — لا نُجمِّد Brain Bot بسبب تأخر execution-bot


class ExecutionBotClient:
    """
    يتواصل مع execution-bot عبر HTTP.
    يستخدم httpx.AsyncClient مع timeout لكل طلب.
    """

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

    async def start(self) -> None:
        self._client = httpx.AsyncClient(
            base_url=settings.EXECUTION_BOT_URL,
            timeout=TIMEOUT,
        )
        logger.info(f"HTTP client متصل بـ execution-bot: {settings.EXECUTION_BOT_URL}")

    async def stop(self) -> None:
        if self._client:
            await self._client.aclose()
        logger.info("HTTP client أُغلق")

    async def get_price(self, symbol: str) -> float | None:
        """يجلب السعر من execution-bot. يُعيد None عند الفشل."""
        try:
            resp = await self._client.get("/price", params={"symbol": symbol})
            if resp.status_code == 200:
                data = resp.json()
                return float(data["price"])
            logger.warning(f"get_price({symbol}) → {resp.status_code}: {resp.text}")
        except httpx.TimeoutException:
            logger.warning(f"get_price({symbol}) timeout بعد {TIMEOUT}s")
        except Exception as e:
            logger.warning(f"get_price({symbol}) خطأ: {e}")
        return None

    async def send_signal(
        self, symbol: str, action: str, quantity: float
    ) -> bool:
        """يرسل أمر تداول لـ execution-bot. يُعيد True عند النجاح."""
        payload = {
            "token": settings.EXECUTION_BOT_TOKEN,
            "symbol": symbol,
            "action": action,
            "quantity": quantity,
        }
        try:
            resp = await self._client.post("/signal", json=payload)
            if resp.status_code == 202:
                logger.info(
                    f"أمر أُرسل لـ execution-bot: {action} {quantity} {symbol}"
                )
                return True
            logger.warning(
                f"send_signal({symbol}) → {resp.status_code}: {resp.text}"
            )
        except httpx.TimeoutException:
            logger.warning(f"send_signal({symbol}) timeout بعد {TIMEOUT}s")
        except Exception as e:
            logger.warning(f"send_signal({symbol}) خطأ: {e}")
        return False

    async def health_check(self) -> dict | None:
        """يتحقق من صحة execution-bot."""
        try:
            resp = await self._client.get("/health")
            if resp.status_code == 200:
                return resp.json()
        except Exception as e:
            logger.warning(f"health_check execution-bot فشل: {e}")
        return None


execution_client = ExecutionBotClient()
