"""FastAPI app — middleware, exception handler, router register."""
import logging
from contextlib import asynccontextmanager

from fastapi import FastAPI, Request
from fastapi.exceptions import RequestValidationError
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import ORJSONResponse

from app.config import settings
from app.database import engine
from app.utils.exceptions import FlovyException

logger = logging.getLogger("flovy")
logging.basicConfig(level=logging.INFO)


@asynccontextmanager
async def lifespan(app: FastAPI):
    logger.info("Flovy başlıyor — env=%s", settings.app_env)
    yield
    await engine.dispose()
    logger.info("Flovy kapandı — DB pool dispose edildi.")


app = FastAPI(
    title="Flovy API",
    version="0.1.0",
    default_response_class=ORJSONResponse,
    lifespan=lifespan,
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # widget her domainde çalışır; tenant bazlı domain kontrolü router'da
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.exception_handler(FlovyException)
async def flovy_exception_handler(request: Request, exc: FlovyException):
    return ORJSONResponse(
        status_code=exc.status_code,
        content={
            "success": False,
            "error": {"code": exc.code, "message": exc.message},
        },
    )


@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    errors = exc.errors()
    first = errors[0]["msg"] if errors else "Geçersiz istek."
    return ORJSONResponse(
        status_code=422,
        content={
            "success": False,
            "error": {
                "code": "VALIDATION_FAILED",
                "message": first,
                "details": [
                    {"field": ".".join(str(p) for p in e["loc"][1:]), "message": e["msg"]}
                    for e in errors
                ],
            },
        },
    )


@app.exception_handler(Exception)
async def generic_exception_handler(request: Request, exc: Exception):
    logger.exception("Unhandled exception: %s", exc)
    return ORJSONResponse(
        status_code=500,
        content={
            "success": False,
            "error": {"code": "SERVER_ERROR", "message": "Sunucu hatası."},
        },
    )


@app.get("/health")
async def health():
    return {"success": True, "data": {"status": "ok", "env": settings.app_env}}


# --- Router register (modüller eklendikçe açılır) ---
from app.routers import (  # noqa: E402
    auth,
    knowledge,
    products,
    sessions,
    visitors,
    widget,
    widgets,
)

app.include_router(auth.router)
app.include_router(products.router)
app.include_router(widgets.router)
app.include_router(widget.router)
app.include_router(sessions.router)
app.include_router(visitors.router)
app.include_router(knowledge.router)
# from app.routers import orders, webhooks
