import os
import uvicorn
import logging
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from app.config.DB import db_manager


# Logging configuration
logging.basicConfig(level=logging.INFO)

# Lifespan: DB connection management
@asynccontextmanager
async def lifespan(app: FastAPI):
    # Startup
    try:
        await db_manager.connect()
        logging.info("System Startup: Database ready.")
    except Exception as e:
        logging.critical(f"System Startup Failed: Could not connect to DB. Error: {e}")
        raise e
        
    yield 
    
    # Shutdown
    await db_manager.close()
    logging.info("System Shutdown: Database connection closed.")

# FastAPI App Initialize
app = FastAPI(title="AI Photo Editor API", lifespan=lifespan)

# CORS Middleware (To allow communication with frontend)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"], 
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Health Check
@app.get("/health")
async def health_check():
    try:
        await db_manager.client.admin.command('ping')
        return {"status": "online", "database": "connected"}
    except Exception:
        return {"status": "degraded", "database": "disconnected"}

# User Routes 
from app.modules.user.user_route import router as userRoute 

# register router
app.include_router(
    userRoute,
    prefix="/api"
)

# Routers
from app.modules.bgRemover.route import router as bg_remover_router
app.include_router(bg_remover_router, prefix="/api/editor", tags=["Background Remover"])

from app.modules.enhanceImage.route import router as enhance_router
app.include_router(enhance_router, prefix="/api/editor", tags=["Image Enhancer"])

# replace BG
from app.modules.replaceBG.replaceBG_route import router as replaceBgRoute
app.include_router(replaceBgRoute,prefix="/api/user",tags=["replaceBG"])

# subscription Plan route
from app.modules.subscription.subscription_route import router as subscription_router

app.include_router(
    subscription_router,
    prefix="/api"
)

from app.modules.user_subscription.user_subscription_router import router as user_subscription_router
app.include_router(
    user_subscription_router,
    prefix="/api"
)


# Production Entry Point
if __name__ == "__main__":
    port = int(os.getenv("PORT", 8000))
    # Production ke liye reload=False rakhein
    uvicorn.run("main:app", host="0.0.0.0", port=port, reload=False)