"""FastAPI application entry point."""

import logging
import sys
from contextlib import asynccontextmanager
from pathlib import Path

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

from app.config import settings
from app.middleware import ErrorHandlingMiddleware
from app.routers import admin, face, garment, health, segmentation, user, vton


def setup_logging() -> None:
    """Configure structured logging for the application."""
    log_format = "%(asctime)s %(levelname)-8s %(name)s — %(message)s"
    logging.basicConfig(
        level=logging.INFO,
        format=log_format,
        datefmt="%Y-%m-%d %H:%M:%S",
        handlers=[logging.StreamHandler(sys.stdout)],
        force=True,
    )
    # Quieten noisy libraries
    logging.getLogger("httpx").setLevel(logging.WARNING)
    logging.getLogger("httpcore").setLevel(logging.WARNING)
    logging.getLogger("insightface").setLevel(logging.WARNING)
    logging.getLogger("onnxruntime").setLevel(logging.WARNING)


@asynccontextmanager
async def lifespan(app: FastAPI):
    setup_logging()
    logger = logging.getLogger(__name__)
    logger.info("Starting OOTD POC Server (LLM=%s, Mannequin=%s)",
                settings.LLM_PROVIDER, settings.MANNEQUIN_MODE)

    upload_dir = Path(settings.UPLOAD_DIR)
    for sub in ("faces", "originals", "ghost_mannequin", "segmentation", "vton"):
        (upload_dir / sub).mkdir(parents=True, exist_ok=True)

    from app.dependencies import get_segmentation_service
    get_segmentation_service()

    yield

    logger.info("Shutting down OOTD POC Server")


app = FastAPI(
    title="OOTD POC Server",
    version="0.2.0",
    lifespan=lifespan,
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=[
        "https://three.lgesmartmirror.com",
    ],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
app.add_middleware(ErrorHandlingMiddleware)

app.include_router(health.router)
app.include_router(user.router)
app.include_router(garment.router)
app.include_router(face.router)
app.include_router(admin.router)
app.include_router(segmentation.router)
app.include_router(vton.router)
app.mount("/storage", StaticFiles(directory=settings.UPLOAD_DIR), name="storage")

# Serve frontend demo app
frontend_dir = Path(__file__).resolve().parent.parent / "frontend"
if frontend_dir.exists():
    app.mount("/", StaticFiles(directory=str(frontend_dir), html=True), name="frontend")
