from __future__ import annotations

import logging
import time
from typing import Literal

from fastapi import APIRouter, HTTPException
from pydantic import BaseModel, Field

from execution_client.client import execution_client
from signals.aggregator import SignalAggregator
from stats.tracker import stats_tracker
from trades.tracker import trade_tracker

logger = logging.getLogger(__name__)
router = APIRouter()

_startup_time: float | None = None   # يُضبَط من main.py
_aggregator: SignalAggregator | None = None  # يُضبَط من main.py


def set_aggregator(agg: SignalAggregator) -> None:
    global _aggregator
    _aggregator = agg


# ─── نماذج البيانات ────────────────────────────────────────────────────────────

class AnalysisSignal(BaseModel):
    symbol: str
    action: Literal["BUY", "SELL"]
    confidence: float = Field(ge=0.0, le=1.0, description="درجة الثقة من 0.0 إلى 1.0")
    source: str = Field(min_length=1, description="اسم البوت المُرسِل")


# ─── نقاط النهاية ────────────────────────────────────────────────────────────

@router.post("/analysis_signal", status_code=202)
async def receive_analysis_signal(signal: AnalysisSignal) -> dict:
    """يستقبل إشارة من بوت تحليل ويضعها في مجمِّع الإشارات."""
    if _aggregator is None:
        raise HTTPException(status_code=503, detail="النظام لم يبدأ بعد")

    symbol = signal.symbol.upper()
    await _aggregator.receive(
        symbol=symbol,
        action=signal.action,
        confidence=signal.confidence,
        source=signal.source,
    )
    return {
        "status": "received",
        "symbol": symbol,
        "action": signal.action,
        "confidence": signal.confidence,
        "source": signal.source,
    }


@router.get("/stats")
async def get_stats() -> dict:
    """يُعيد إحصائيات التداول الحالية."""
    return stats_tracker.get_stats().to_dict()


@router.get("/trades")
async def get_open_trades() -> list:
    """يُعيد قائمة الصفقات المفتوحة حالياً."""
    return [t.to_dict() for t in trade_tracker.get_open_trades()]


@router.get("/health")
async def health() -> dict:
    """يُعيد حالة Brain Bot + حالة execution-bot."""
    uptime = int(time.time() - _startup_time) if _startup_time else 0
    exec_health = await execution_client.health_check()
    return {
        "status": "ok",
        "uptime_seconds": uptime,
        "open_trades": trade_tracker.count,
        "execution_bot": exec_health or {"status": "unreachable"},
    }
