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.rsi import calculate_rsi
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:
    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)}",
        )

    try:
        df = await fetcher.fetch(symbol=symbol, interval=timeframe)
    except RuntimeError as e:
        raise HTTPException(status_code=502, detail=str(e))

    rsi_series = calculate_rsi(df["close"], period=settings.RSI_PERIOD)
    signal = signal_generator.generate(symbol=symbol, rsi_series=rsi_series, timeframe=timeframe)

    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": "rsi_bot",
        "brain_bot_url": settings.BRAIN_BOT_URL,
        "rsi_params": {
            "period": settings.RSI_PERIOD,
            "oversold": settings.RSI_OVERSOLD,
            "overbought": settings.RSI_OVERBOUGHT,
        },
    }
