from contextlib import asynccontextmanager

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

from app.api.middleware import RequestLoggingMiddleware
from app.api.router import router
from app.core.database import close_db, connect_db
from app.core.env import env_str
from app.core.logger import logger
from app.workers import worker_manager


@asynccontextmanager
async def lifespan(app: FastAPI):
    logger.info("Service startup initiated")
    logger.info("Connecting to MongoDB")
    await connect_db()
    logger.info("MongoDB connected")
    await worker_manager.start()
    logger.info("Startup completed")
    yield
    logger.info("Service shutdown initiated")
    await worker_manager.stop()
    logger.info("Closing MongoDB connection")
    await close_db()
    logger.info("Shutdown completed")


app = FastAPI(
    title=env_str("APP_NAME", "Repo Docs Ingestion Service"),
    version=env_str("SERVICE_VERSION", "1.0.0"),
    lifespan=lifespan,
)

app.add_middleware(RequestLoggingMiddleware)


@app.exception_handler(Exception)
async def unhandled_exception_handler(request: Request, exc: Exception):
    logger.bind(path=request.url.path, error_type=type(exc).__name__).exception(
        "unhandled_exception"
    )
    return JSONResponse(status_code=500, content={"detail": "Internal Server Error"})


app.include_router(router)