from contextlib import asynccontextmanager
from pathlib import Path
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
from app.config import settings
from app.database import close_database, init_database
from app.routers import tenant, session, message, websocket, admin, handoff, auth, admin_agents

@asynccontextmanager
async def lifespan(app: FastAPI):
    # Startup logic: initialize and verify database connection / fallback
    await init_database()
    yield
    # Shutdown logic
    close_database()

app = FastAPI(
    title="Universal Chatbot Widget API",
    version="1.0.0",
    description="Multi-tenant chatbot backend service",
    lifespan=lifespan,
)

# CORS Middleware Setup
app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.allowed_origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Include routers
app.include_router(tenant.router)
app.include_router(session.router)
app.include_router(session.conversation_router)
app.include_router(message.router)
app.include_router(websocket.router)
app.include_router(admin.router)
app.include_router(handoff.router)
app.include_router(auth.router)
app.include_router(admin_agents.router)

# Mount static dist folder for widget bundle
dist_path = Path(__file__).resolve().parent.parent.parent / "widget" / "dist"
if dist_path.exists():
    app.mount("/dist", StaticFiles(directory=dist_path), name="dist")

@app.get("/")
async def root():
    return {"message": "Universal Chatbot Widget API running"}

@app.get("/admin", response_class=HTMLResponse)
async def serve_admin_dashboard():
    """Serves the Single Agent Operations Dashboard."""
    admin_path = Path(__file__).resolve().parent.parent.parent / "widget" / "admin.html"
    if admin_path.exists():
        return HTMLResponse(content=admin_path.read_text(encoding="utf-8"))
    return HTMLResponse(content="<h1>Admin Dashboard HTML not found</h1>", status_code=404)

@app.get("/demo", response_class=HTMLResponse)
async def serve_demo_page():
    """Serves the Visitor Chatbot Widget Demo Page."""
    demo_path = Path(__file__).resolve().parent.parent.parent / "widget" / "demo.html"
    if demo_path.exists():
        return HTMLResponse(content=demo_path.read_text(encoding="utf-8"))
    return HTMLResponse(content="<h1>Demo Widget HTML not found</h1>", status_code=404)
