import os
import sys

# Prevent multi-threading exhaustion on cPanel CloudLinux (RLIMIT_NPROC)
os.environ.setdefault("OPENBLAS_NUM_THREADS", "1")
os.environ.setdefault("MKL_NUM_THREADS", "1")
os.environ.setdefault("OMP_NUM_THREADS", "1")
os.environ.setdefault("VECLIB_MAXIMUM_THREADS", "1")
os.environ.setdefault("NUMEXPR_NUM_THREADS", "1")
os.environ.setdefault("NUMPY_NUM_THREADS", "1")

from fastapi import FastAPI, Request, Depends
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy.orm import Session

from app.config import settings
from app.database import init_db, get_db
from app.api.v1 import fleet, clothes, rembg, keys
from app.services.fleet_service import FleetService
from app.models.cloth import Cloth
from app.models.apikey import ApiKey

app = FastAPI(
    title=settings.PROJECT_NAME,
    description="Backend Platform for Virtual Try-On LiveMirror Kiosks & Apps with Lucy VTON 3.5",
    version=settings.VERSION
)

# Enable CORS for all clients (Android app, tablets, kiosk displays)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Mount static and templates
app.mount("/static", StaticFiles(directory=str(settings.STATIC_DIR)), name="static")
templates = Jinja2Templates(directory=str(settings.TEMPLATES_DIR))

# Include API v1 routers
app.include_router(fleet.router, prefix=f"{settings.API_V1_PREFIX}/fleet", tags=["Fleet Monitor"])
app.include_router(clothes.router, prefix=f"{settings.API_V1_PREFIX}/clothes", tags=["Cloth Management"])
app.include_router(rembg.router, prefix=f"{settings.API_V1_PREFIX}/rembg", tags=["Cloth Background Remover"])
app.include_router(keys.router, prefix=f"{settings.API_V1_PREFIX}/keys", tags=["Decart API Key Store"])

@app.on_event("startup")
def on_startup():
    init_db()

# Web Dashboard HTML Pages
@app.get("/")
def view_dashboard(request: Request, db: Session = Depends(get_db)):
    devices = FleetService.get_all_devices(db)
    stats = FleetService.get_fleet_stats(db)
    active_key = db.query(ApiKey).filter(ApiKey.is_active == True, ApiKey.provider == "decart").first()
    return templates.TemplateResponse(
        request=request,
        name="dashboard.html",
        context={
            "title": "Fleet Monitor",
            "devices": [d.to_dict() for d in devices],
            "stats": stats,
            "active_key": active_key.to_dict(mask_key=True) if active_key else None,
            "project_name": settings.PROJECT_NAME,
            "company_name": settings.COMPANY_NAME
        }
    )

@app.get("/clothes")
def view_clothes(request: Request, db: Session = Depends(get_db)):
    clothes_list = db.query(Cloth).order_by(Cloth.sort_order.asc(), Cloth.id.desc()).all()
    categories = sorted(list(set([c.category for c in clothes_list if c.category])))
    return templates.TemplateResponse(
        request=request,
        name="clothes.html",
        context={
            "title": "Cloth Management",
            "clothes": [c.to_dict() for c in clothes_list],
            "categories": categories,
            "project_name": settings.PROJECT_NAME,
            "company_name": settings.COMPANY_NAME
        }
    )

@app.get("/rembg")
def view_rembg(request: Request):
    return templates.TemplateResponse(
        request=request,
        name="rembg_studio.html",
        context={
            "title": "Cloth Remove Background Studio",
            "project_name": settings.PROJECT_NAME,
            "company_name": settings.COMPANY_NAME
        }
    )

@app.get("/keys")
def view_keys(request: Request, db: Session = Depends(get_db)):
    keys_list = db.query(ApiKey).order_by(ApiKey.id.desc()).all()
    return templates.TemplateResponse(
        request=request,
        name="apikeys.html",
        context={
            "title": "Decart API Key Store",
            "keys": [k.to_dict(mask_key=False) for k in keys_list],
            "project_name": settings.PROJECT_NAME,
            "company_name": settings.COMPANY_NAME
        }
    )
