from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.exceptions import HTTPException, RequestValidationError
from starlette.exceptions import HTTPException as StarletteHTTPException
from app.routers import router
from app.handlers.errors import (
    http_exception_handler,
    request_validation_exception_handler,
    unhandled_exception_handler,
)
from app.middleware.request_id import RequestIdMiddleware
from app.utils.env import is_dev_env
from app.settings import settings
from app.scheduler.cleanup_preserved_handwriting import (
    start_scheduler,
    shutdown_scheduler,
)
from app.utils.logger import get_logger

logger = get_logger("main")

docs_enabled = is_dev_env()


@asynccontextmanager
async def lifespan(app: FastAPI):
    logger.info("Application starting...")
    start_scheduler()
    yield
    logger.info("Application shutting down...")
    shutdown_scheduler()


app = FastAPI(
    title=settings.APP_NAME,
    docs_url="/docs" if docs_enabled else None,
    redoc_url="/redoc" if docs_enabled else None,
    openapi_url="/openapi.json" if docs_enabled else None,
    lifespan=lifespan,
)
app.add_middleware(RequestIdMiddleware)

app.add_exception_handler(HTTPException, http_exception_handler)
app.add_exception_handler(StarletteHTTPException, http_exception_handler)
app.add_exception_handler(RequestValidationError, request_validation_exception_handler)
app.add_exception_handler(Exception, unhandled_exception_handler)

app.include_router(router)
