import asyncio
from contextlib import asynccontextmanager

from fastapi import FastAPI
from fastapi.responses import JSONResponse

from app.api.readiness import readiness_payload
from app.api.router import router
from app.api.routes.internal_lucos import router as internal_lucos_router
from app.api.routes.internal_maintenance import router as internal_maintenance_router
from app.api.routes.internal_retrieve import (
    register_internal_retrieve_exception_handlers,
    router as internal_retrieve_router,
)
from app.core.config import settings
from app.qdrant.bootstrap import bootstrap_qdrant


@asynccontextmanager
async def lifespan(app: FastAPI):
    settings.validate_runtime()
    await asyncio.to_thread(bootstrap_qdrant)
    yield


app = FastAPI(
    title=settings.APP_NAME,
    version="1.0.0",
    lifespan=lifespan,
)

app.include_router(router)
app.include_router(internal_retrieve_router)
app.include_router(internal_lucos_router)
app.include_router(internal_maintenance_router)
register_internal_retrieve_exception_handlers(app)


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


@app.get("/readyz")
async def root_readyz():
    body, status_code = await readiness_payload()
    return JSONResponse(status_code=status_code, content=body)
