import os
from pathlib import Path
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 settings, BASE_DIR, UPLOAD_DIR
from app.database import engine, Base, SessionLocal
from app.services.seed_data import seed_database
from app.routers import auth_router, public_router, admin_router

# Lifespan context for database initialization & seeding
@asynccontextmanager
async def lifespan(app: FastAPI):
    # Startup: create tables and seed default admin, settings, and catalogue
    Base.metadata.create_all(bind=engine)
    db = SessionLocal()
    try:
        seed_database(db)
    finally:
        db.close()
    yield
    # Shutdown logic if any

app = FastAPI(
    title=settings.PROJECT_NAME,
    description=settings.PROJECT_DESCRIPTION,
    version=settings.VERSION,
    lifespan=lifespan
)

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

# Mount Uploads directory
app.mount("/uploads", StaticFiles(directory=str(UPLOAD_DIR)), name="uploads")

# Include Routers
app.include_router(auth_router)
app.include_router(public_router)
app.include_router(admin_router)

# Mount Frontend Static Assets
FRONTEND_DIR = BASE_DIR.parent / "frontend"
if FRONTEND_DIR.exists():
    # Mount css and js
    if (FRONTEND_DIR / "css").exists():
        app.mount("/css", StaticFiles(directory=str(FRONTEND_DIR / "css")), name="css")
    if (FRONTEND_DIR / "js").exists():
        app.mount("/js", StaticFiles(directory=str(FRONTEND_DIR / "js")), name="js")

    # Public Routes
    @app.get("/", response_class=FileResponse)
    async def serve_home():
        return FileResponse(FRONTEND_DIR / "index.html")

    @app.get("/product.html", response_class=FileResponse)
    async def serve_product():
        return FileResponse(FRONTEND_DIR / "product.html")

    # Admin Routes
    @app.get("/admin", response_class=FileResponse)
    @app.get("/admin/", response_class=FileResponse)
    async def serve_admin_index():
        return FileResponse(FRONTEND_DIR / "admin" / "index.html")

    @app.get("/admin/login", response_class=FileResponse)
    @app.get("/admin/login.html", response_class=FileResponse)
    async def serve_admin_login():
        return FileResponse(FRONTEND_DIR / "admin" / "login.html")

    @app.get("/admin/products", response_class=FileResponse)
    @app.get("/admin/products.html", response_class=FileResponse)
    async def serve_admin_products():
        return FileResponse(FRONTEND_DIR / "admin" / "products.html")

    @app.get("/admin/categories", response_class=FileResponse)
    @app.get("/admin/categories.html", response_class=FileResponse)
    async def serve_admin_categories():
        return FileResponse(FRONTEND_DIR / "admin" / "categories.html")

    @app.get("/admin/settings", response_class=FileResponse)
    @app.get("/admin/settings.html", response_class=FileResponse)
    async def serve_admin_settings():
        return FileResponse(FRONTEND_DIR / "admin" / "settings.html")

@app.get("/health")
async def health_check():
    return {"status": "healthy", "service": "Nathji Marketing B2B API"}
