"""FastAPI application entry point."""
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles

from app.config import settings
from app.database import init_db, close_db
from app.api import auth, olt, onu, customer, monitoring, alarm, pppoe, vlan, batch, backup, users, audit, dashboard, installer


@asynccontextmanager
async def lifespan(app: FastAPI):
    """Application lifecycle manager."""
    await init_db()
    # Initialize scheduler if needed
    from app.utils.scheduler import start_scheduler
    await start_scheduler()
    yield
    await close_db()


app = FastAPI(
    title=settings.APP_NAME,
    version=settings.APP_VERSION,
    description="Web Provisioning Platform for ZTE OLT C300/C320/C300 Mini",
    lifespan=lifespan,
    docs_url="/api/docs",
    redoc_url="/api/redoc",
    openapi_url="/api/openapi.json",
)

# CORS
app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.CORS_ORIGINS,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# API Routers
app.include_router(auth.router, prefix="/api/auth", tags=["Authentication"])
app.include_router(olt.router, prefix="/api/olt", tags=["OLT Management"])
app.include_router(onu.router, prefix="/api/onu", tags=["ONU Management"])
app.include_router(customer.router, prefix="/api/customers", tags=["Customer Management"])
app.include_router(monitoring.router, prefix="/api/monitoring", tags=["Monitoring"])
app.include_router(alarm.router, prefix="/api/alarms", tags=["Alarm Management"])
app.include_router(pppoe.router, prefix="/api/pppoe", tags=["PPPoE Management"])
app.include_router(vlan.router, prefix="/api/vlan", tags=["VLAN Management"])
app.include_router(batch.router, prefix="/api/batch", tags=["Batch Operations"])
app.include_router(backup.router, prefix="/api/backup", tags=["Backup System"])
app.include_router(users.router, prefix="/api/users", tags=["User Management"])
app.include_router(audit.router, prefix="/api/audit", tags=["Audit Log"])
app.include_router(dashboard.router, prefix="/api/dashboard", tags=["Dashboard"])
app.include_router(installer.router, prefix="/api/installer", tags=["Installer"])

# Health check
@app.get("/api/health")
async def health_check():
    return {"status": "ok", "version": settings.APP_VERSION}


@app.get("/")
async def root():
    return {
        "app": settings.APP_NAME,
        "version": settings.APP_VERSION,
        "docs": "/api/docs",
        "redoc": "/api/redoc",
    }
