from __future__ import annotations

import logging

from fastapi import APIRouter, HTTPException
from pydantic import BaseModel

from brain_client.client import brain_client
from config.settings import settings
from data.fetcher import fetcher
from indicators.macd import calculate_macd
from strategy.signal_generator import signal_generator

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

VALID_TIMEFRAMES = {"1m", "3m", "5m", "15m", "30m", "1h", "4h", "1d"}


class AnalyzeRequest(BaseModel):
    symbol: str
    timeframe: str = "5m"


@router.post("/analyze")
async def analyze(request: AnalyzeRequest) -> dict:
    """
    1. جلب klines من Binance
    2. حساب MACD
    3. توليد الإشارة
    4. إرسال لـ Brain Bot (BUY/SELL فقط)
    5. إعادة النتيجة الكاملة
    """
    symbol = request.symbol.upper()
    timeframe = request.timeframe.lower()

    if timeframe not in VALID_TIMEFRAMES:
        raise HTTPException(
            status_code=400,
            detail=f"إطار زمني غير صالح: {timeframe}. المتاح: {sorted(VALID_TIMEFRAMES)}",
        )

    # 1. جلب البيانات
    try:
        df = await fetcher.fetch(symbol=symbol, interval=timeframe)
    except RuntimeError as e:
        raise HTTPException(status_code=502, detail=str(e))

    # 2. حساب MACD
    macd_df = calculate_macd(
        close=df["close"],
        fast=settings.MACD_FAST,
        slow=settings.MACD_SLOW,
        signal=settings.MACD_SIGNAL,
    )

    # 3. توليد الإشارة
    signal = signal_generator.generate(symbol=symbol, macd_df=macd_df, timeframe=timeframe)

    # 4. إرسال لـ Brain Bot (BUY/SELL فقط)
    sent = False
    if signal.action != "HOLD":
        sent = await brain_client.send_signal(signal.to_brain_payload())

    return signal.to_response_dict(sent_to_brain=sent)


@router.get("/health")
async def health() -> dict:
    return {
        "status": "ok",
        "bot": "macd_bot",
        "brain_bot_url": settings.BRAIN_BOT_URL,
        "macd_params": {
            "fast": settings.MACD_FAST,
            "slow": settings.MACD_SLOW,
            "signal": settings.MACD_SIGNAL,
        },
    }
