import logging
import time
from contextlib import asynccontextmanager

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

from app.api.admin_auth import router as admin_auth_router
from app.api.admin_crud import router as admin_crud_router
from app.api.benefits import router as benefits_router
from app.api.calendar import router as calendar_router
from app.api.children import router as children_router
from app.api.challenges import router as challenges_router
from app.api.coins import router as coins_router
from app.api.dashboard import router as dashboard_router
from app.api.daily_knowledge import router as daily_knowledge_router
from app.api.daily_math import router as daily_math_router
from app.api.daily_phrases import router as daily_phrases_router
from app.api.health import router as health_router
from app.api.schedule import router as schedule_router
from app.api.screen_time import router as screen_time_router
from app.api.tasks import router as tasks_router
from app.core.config import get_settings
from app.db.session import init_db

settings = get_settings()
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s %(message)s")
logger = logging.getLogger("familydashboard")


@asynccontextmanager
async def lifespan(app: FastAPI):
    init_db()
    yield


app = FastAPI(title=settings.app_name, lifespan=lifespan)

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


@app.middleware("http")
async def request_logging_middleware(request: Request, call_next):
    started = time.perf_counter()
    response = await call_next(request)
    elapsed_ms = round((time.perf_counter() - started) * 1000, 1)
    logger.info(
        "request method=%s path=%s status=%s duration_ms=%s",
        request.method,
        request.url.path,
        response.status_code,
        elapsed_ms,
    )
    if request.url.path.startswith("/api/"):
        response.headers["Cache-Control"] = "no-store, max-age=0"
        response.headers["Pragma"] = "no-cache"
    return response


@app.exception_handler(Exception)
async def generic_exception_handler(request: Request, exc: Exception):
    return JSONResponse(
        status_code=500,
        content={"error": {"code": "internal_error", "message": "Unerwarteter Serverfehler"}},
    )


app.include_router(health_router, prefix="/api", tags=["health"])
app.include_router(children_router, prefix="/api")
app.include_router(challenges_router, prefix="/api")
app.include_router(dashboard_router, prefix="/api")
app.include_router(tasks_router, prefix="/api")
app.include_router(coins_router, prefix="/api")
app.include_router(calendar_router, prefix="/api")
app.include_router(daily_phrases_router, prefix="/api")
app.include_router(daily_math_router, prefix="/api")
app.include_router(daily_knowledge_router, prefix="/api")
app.include_router(schedule_router, prefix="/api")
app.include_router(screen_time_router, prefix="/api")
app.include_router(benefits_router, prefix="/api")
app.include_router(admin_auth_router, prefix="/api")
app.include_router(admin_crud_router, prefix="/api")
