from contextlib import asynccontextmanager

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from app.config import get_settings
from app.database import Base, SessionLocal, engine, ensure_schema
from app.routers import admin, auth, catalog, crm, dashboard, events, finance, forms, gallery, media, public_catalog, public_company, reports, staff
from app.seed import seed_all
from app.routers.media import ensure_upload_dirs

settings = get_settings()


@asynccontextmanager
async def lifespan(_: FastAPI):
    Base.metadata.create_all(bind=engine)
    ensure_schema()
    ensure_upload_dirs()
    db = SessionLocal()
    try:
        seed_all(db)
    finally:
        db.close()
    yield


app = FastAPI(title=settings.app_name, lifespan=lifespan)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

for router in (
    auth.router,
    admin.router,
    crm.router,
    catalog.router,
    public_catalog.router,
    public_company.router,
    gallery.public_router,
    gallery.admin_router,
    events.router,
    staff.router,
    finance.router,
    forms.router,
    reports.router,
    dashboard.router,
    media.router,
):
    app.include_router(router, prefix="/api/v1")


@app.get("/health")
def health():
    return {"status": "ok", "app": settings.app_name}


@app.get("/")
def root():
    return {
        "app": settings.app_name,
        "health": "/health",
        "api": "/api/v1",
        "login": "/api/v1/auth/login",
    }
