"""Entry point for the admin backend FastAPI application."""

from __future__ import annotations

from time import perf_counter

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

from .config import settings
from .database import engine
from .models import Base
from .routers import (
    auth,
    dashboard,
    licenses,
    clients,
    logs,
    config,
    payments,
    notifications,
    maintenance,
    compliance,
    monitoring,
)
from .services import metrics_collector


def create_app() -> FastAPI:
    """Create and configure the FastAPI application."""
    app = FastAPI(
        title=settings.app_name,
        version="0.1.0",
        description="Administration backend for Web Sentinel",
        debug=settings.debug,
    )

    # Configure CORS for frontend access
    app.add_middleware(
        CORSMiddleware,
        allow_origins=[
            "http://localhost:5173",  # Vite dev server
            "http://localhost:3000",  # Alternative frontend port
            "http://127.0.0.1:5173",
            "http://127.0.0.1:3000",
            "https://admin.web-sentinel.taaazzz-prog.fr",  # Production frontend
        ],
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

    @app.middleware("http")
    async def collect_metrics(request: Request, call_next):  # type: ignore[override]
        metrics_collector.record_request_start()
        start = perf_counter()
        try:
            response = await call_next(request)
        except Exception:
            duration_ms = (perf_counter() - start) * 1000
            metrics_collector.record_request_exception(duration_ms)
            raise
        duration_ms = (perf_counter() - start) * 1000
        metrics_collector.record_request_end(response.status_code, duration_ms)
        return response

    @app.get("/health", tags=["system"])
    async def healthcheck() -> dict[str, str]:
        return {"status": "ok", "app": settings.app_name}

    @app.on_event("startup")
    def ensure_database_schema() -> None:
        """Create database tables on startup."""
        Base.metadata.create_all(bind=engine)

    # Routers
    app.include_router(auth.router, prefix="/api/v1/auth", tags=["auth"])
    app.include_router(dashboard.router, prefix='/api/v1/dashboard', tags=['dashboard'])
    app.include_router(licenses.router, prefix='/api/v1/licenses', tags=['licenses'])
    app.include_router(clients.router, prefix='/api/v1/clients', tags=['clients'])
    app.include_router(logs.router, prefix='/api/v1/logs', tags=['logs'])
    app.include_router(config.router, prefix='/api/v1/config', tags=['config'])
    app.include_router(monitoring.router, prefix='/api/v1/monitoring', tags=['monitoring'])
    app.include_router(payments.router, prefix='/api/v1/payments', tags=['payments'])
    app.include_router(notifications.router, prefix='/api/v1/notifications', tags=['notifications'])
    app.include_router(maintenance.router, prefix='/api/v1/maintenance', tags=['maintenance'])
    app.include_router(compliance.router, prefix='/api/v1/compliance', tags=['compliance'])

    return app


app = create_app()
