from __future__ import annotations

import logging
from contextlib import asynccontextmanager
from typing import AsyncGenerator

import uvicorn
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from api.routes import router
from brain_client.client import brain_client
from config.settings import settings
from data.fetcher import fetcher

logging.basicConfig(
    level=settings.LOG_LEVEL,
    format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s",
    datefmt="%Y-%m-%dT%H:%M:%S",
)
logger = logging.getLogger(__name__)


@asynccontextmanager
async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
    logger.info(f"MACD Bot يبدأ | المنفذ={settings.PORT}")
    await fetcher.start()
    await brain_client.start()
    logger.info(
        f"MACD Bot جاهز | "
        f"MACD({settings.MACD_FAST},{settings.MACD_SLOW},{settings.MACD_SIGNAL}) | "
        f"Brain Bot → {settings.BRAIN_BOT_URL}"
    )
    yield
    logger.info("MACD Bot يتوقف...")
    await brain_client.stop()
    await fetcher.stop()
    logger.info("MACD Bot توقف بنجاح")


app = FastAPI(
    title="MACD Analysis Bot",
    description="بوت تحليل MACD — يولد إشارات BUY/SELL/HOLD ويرسلها لـ Brain Bot",
    version="1.0.0",
    lifespan=lifespan,
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

app.include_router(router)


if __name__ == "__main__":
    uvicorn.run(
        "main:app",
        host=settings.HOST,
        port=settings.PORT,
        reload=False,
        log_level=settings.LOG_LEVEL.lower(),
    )
