from dotenv import load_dotenv
load_dotenv()
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from starlette.middleware.sessions import SessionMiddleware
from src.config.settings import settings
from src.core.logger import get_logger
from src.presentation.api.v1.auth.routes import router as auth_router
from src.presentation.api.oauth_routes import router as oauth_router
from src.presentation.api.v1.applications.routes import router as applications_router
from src.presentation.api.v1.rbac.routes import router as rbac_router
from src.presentation.api.v1.merchants.routes import router as merchants_router
from src.presentation.api.v1.merchant_categories.routes import router as merchant_categories_router
from src.presentation.api.v1.products.routes import router as products_router
from src.presentation.api.v1.merchant_risk.routes import router as merchant_risk_router
from src.presentation.api.v1.merchants.offers.routes import router as merchant_offers_router
from src.presentation.api.v1.merchant_category_mails.routes import router as merchant_category_mails_router
from src.presentation.api.v1.kw_capping.routes import router as kw_capping_router
from src.presentation.api.v1.legal_charges.routes import router as legal_charges_router
from src.presentation.api.v1.users.routes import router as users_router

logger = get_logger()

def create_app() -> FastAPI:
    app = FastAPI(title=settings.PROJECT_NAME, version="1.0.0")

    app.add_middleware(
        CORSMiddleware,
        allow_origins=[settings.FRONTEND_APP_URL, "http://localhost:3000", "http://127.0.0.1:3000"],
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

    # Secure HTTP sessions for OAuth CSRF state protection
    app.add_middleware(SessionMiddleware, secret_key=settings.SECRET_KEY)

    app.include_router(auth_router, prefix="/api/v1")
    app.include_router(oauth_router, prefix="/api")
    app.include_router(applications_router, prefix="/api/v1/applications")
    app.include_router(rbac_router, prefix="/api/v1/rbac")
    app.include_router(merchants_router, prefix="/api/v1")
    app.include_router(merchant_categories_router, prefix="/api/v1/merchant-categories")
    app.include_router(products_router, prefix="/api/v1")
    app.include_router(merchant_risk_router, prefix="/api/v1")
    app.include_router(merchant_offers_router, prefix="/api/v1/merchant/offers")
    app.include_router(merchant_category_mails_router, prefix="/api/v1/merchant-category-mails")
    app.include_router(kw_capping_router, prefix="/api/v1/kw-capping")
    app.include_router(legal_charges_router, prefix="/api/v1/legal-charges")
    app.include_router(users_router, prefix="/api/v1/users")

    @app.on_event("startup")
    async def startup_event():
        logger.info(f"Starting {settings.PROJECT_NAME} API in {settings.ENVIRONMENT} mode.")

    @app.get("/health")
    def health_check():
        return {"status": "healthy"}

    return app

app = create_app()

if __name__ == "__main__":
    import uvicorn
    uvicorn.run("src.main:app", host="0.0.0.0", port=8000, reload=True)
