"""
GOLS – Hire2Exit | AI Avatar Video System
FastAPI Backend Entry Point
"""

import os
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse

from app.config import cfg
from app.middleware.auth import LoggingMiddleware
from app.routes import auth, avatars, projects, videos, analytics, settings, ai
from app.repository.store import init_store
from app.utils.logger import log

ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
FRONTEND = os.path.join(ROOT, "frontend")


@asynccontextmanager
async def lifespan(app: FastAPI):
    log.info("GOLS Hire2Exit starting …")
    init_store()
    yield
    log.info("GOLS Hire2Exit stopped.")


app = FastAPI(
    title="GOLS Hire2Exit – AI Avatar Studio",
    version="2.0.0",
    docs_url="/api/docs",
    redoc_url=None,
    lifespan=lifespan,
)

app.add_middleware(CORSMiddleware,
    allow_origins=cfg.CORS_ORIGINS,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
app.add_middleware(LoggingMiddleware)

# ── API Routers ────────────────────────────────────────────────
app.include_router(auth.router,      prefix="/api/auth",      tags=["Auth"])
app.include_router(avatars.router,   prefix="/api/avatars",   tags=["Avatars"])
app.include_router(projects.router,  prefix="/api/projects",  tags=["Projects"])
app.include_router(videos.router,    prefix="/api/videos",    tags=["Videos"])
app.include_router(analytics.router, prefix="/api/analytics", tags=["Analytics"])
app.include_router(settings.router,  prefix="/api/settings",  tags=["Settings"])
app.include_router(ai.router,        prefix="/api/ai",        tags=["AI Language"])

# ── Static assets ──────────────────────────────────────────────
app.mount("/static", StaticFiles(directory=os.path.join(FRONTEND, "static")), name="static")

# ── Serve uploaded files for preview ──────────────────────────
uploads_dir = os.path.join(ROOT, "backend", cfg.UPLOAD_DIR)
os.makedirs(uploads_dir, exist_ok=True)
app.mount("/uploads", StaticFiles(directory=uploads_dir), name="uploads")

# ── Frontend pages ─────────────────────────────────────────────
PAGES = ["login", "dashboard", "studio", "projects", "videos", "analytics", "settings"]

@app.get("/", include_in_schema=False)
async def root():
    return FileResponse(os.path.join(FRONTEND, "login.html"))

@app.get("/{page}.html", include_in_schema=False)
async def serve_page(page: str):
    if page in PAGES:
        return FileResponse(os.path.join(FRONTEND, f"{page}.html"))
    return FileResponse(os.path.join(FRONTEND, "login.html"))

@app.get("/health")
async def health():
    return {"status": "ok", "service": "GOLS Hire2Exit", "version": "2.0.0"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run("main:app", host=cfg.HOST, port=cfg.PORT, reload=cfg.DEBUG)
