from __future__ import annotations

import asyncio
import logging

from execution.executor import executor

logger = logging.getLogger(__name__)


class SignalQueueHandler:
    """قائمة انتظار تسلسلية لإشارات التداول."""

    def __init__(self) -> None:
        self._queue: asyncio.Queue[dict] = asyncio.Queue()
        self._task: asyncio.Task | None = None

    async def start(self) -> None:
        self._task = asyncio.create_task(self._consume(), name="signal-consumer")
        logger.info("مستهلك قائمة الإشارات بدأ")

    async def stop(self) -> None:
        if self._task:
            self._task.cancel()
            try:
                await self._task
            except asyncio.CancelledError:
                pass
        logger.info("مستهلك قائمة الإشارات توقف")

    async def enqueue(self, signal: dict) -> None:
        await self._queue.put(signal)
        logger.info(
            f"إشارة في قائمة الانتظار: {signal['action']} {signal['symbol']} | عمق القائمة={self._queue.qsize()}"
        )

    @property
    def queue_depth(self) -> int:
        return self._queue.qsize()

    async def _consume(self) -> None:
        while True:
            signal = await self._queue.get()
            try:
                result = await executor.execute(signal)
                logger.info(f"نتيجة التنفيذ: {result}")
            except Exception as e:
                logger.error(f"خطأ غير متوقع في المنفِّذ: {e} | الإشارة: {signal}")
            finally:
                self._queue.task_done()


signal_queue = SignalQueueHandler()
