"""LSEG Credit Analytics — FastAPI application."""
import asyncio
import logging
from contextlib import asynccontextmanager

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse
from pathlib import Path
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.errors import RateLimitExceeded
from slowapi.middleware import SlowAPIMiddleware
from slowapi.util import get_remote_address

from app.config import settings
from app.dependencies import run_sync
from app.services.registry import ServiceRegistry

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

limiter = Limiter(key_func=get_remote_address, default_limits=["120/minute"])

registry = ServiceRegistry()


async def _warm_bond_cache() -> None:
    """Fetch and cache bond data at startup so the first real request isn't the slow one."""
    try:
        await run_sync(registry.lseg_bond_service.get_all_bonds)
        logger.info("LSEG: bond cache pre-warmed")
    except Exception:
        logger.exception("LSEG: bond cache pre-warm failed — will retry on first request")


@asynccontextmanager
async def lifespan(app: FastAPI):
    registry.initialize()
    app.state.registry = registry
    logger.info("LSEG Credit API ready — data path: %s", settings.lseg_data_path)
    registry.lseg_bond_service.start_background_load()
    yield
    logger.info("LSEG Credit API shutting down")


app = FastAPI(title="LSEG Credit Analytics API", version="1.0.0", lifespan=lifespan)

app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
app.add_middleware(SlowAPIMiddleware)
app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.cors_origin_list,
    allow_credentials=False,
    allow_methods=["*"],
    allow_headers=["*"],
)

from app.routers.lseg_credit import router as lseg_credit_router
from app.routers.peer_curve import router as peer_curve_router

app.include_router(lseg_credit_router, prefix="/api/lseg-credit", tags=["lseg-credit"])
app.include_router(peer_curve_router, prefix="/api/lseg-credit", tags=["peer-curve"])


@app.get("/api/health")
async def health():
    return {"status": "ok"}


@app.get("/")
async def ui():
    return FileResponse(Path(__file__).parents[2] / "test-ui.html")
