from contextlib import asynccontextmanager

from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse

from app.api.router import router
from app.core.config import settings
from app.core.logger import logger
from app.middleware.trusted_context import TrustedContextError
from app.services.upload_service import upload_service


@asynccontextmanager
async def lifespan(app: FastAPI):
    settings.validate_runtime()
    await upload_service.ensure_indexes_on_startup()
    logger.info(
        "Starting {app_name} env={environment} port={port}",
        app_name=settings.APP_NAME,
        environment=settings.resolved_environment(),
        port=settings.PORT,
    )
    yield


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

app.include_router(router)


@app.exception_handler(TrustedContextError)
async def trusted_context_error_handler(
    request: Request,
    exc: TrustedContextError,
) -> JSONResponse:
    return JSONResponse(
        status_code=401,
        content={
            "error": {
                "code": "TRUSTED_CONTEXT_REQUIRED",
                "message": str(exc),
            }
        },
    )


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


@app.get("/readyz")
async def root_readyz():
    from app.api.readiness import readiness_payload

    body, status_code = await readiness_payload()
    return JSONResponse(status_code=status_code, content=body)
