# Trigger uvicorn reload with updated QA service
import os
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import traceback
from app.core.logging import app_logger
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
from app.core.config import settings

os.makedirs("uploads/da_lite", exist_ok=True)
os.makedirs("uploads/dispatch", exist_ok=True)
os.makedirs("uploads/body_types", exist_ok=True)
os.makedirs("uploads/models", exist_ok=True)
os.makedirs("uploads/features", exist_ok=True)
os.makedirs("uploads/seat_configs", exist_ok=True)
os.makedirs("uploads/seating_layouts", exist_ok=True)
os.makedirs("uploads/dealer_features", exist_ok=True)
os.makedirs("uploads/dealer_requests", exist_ok=True)
os.makedirs("uploads/maintenance", exist_ok=True)


 
# ── ROUTER IMPORTS ────────────────────────────────────
# Import modular API routers. Each module represents a distinct business domain.
from app.modules.auth.routes          import router as auth_router
from app.modules.rm_master.routes     import router as rm_router
from app.modules.vendor.routes        import router as vendor_router
from app.modules.store.routes         import router as store_router
from app.modules.procurement.routes   import router as procurement_router
from app.modules.procurement.engine_routes import router as procurement_engine_router
from app.modules.inventory.routes     import router as inventory_router
from app.modules.station.routes       import router as station_router
from app.modules.bom.routes           import router as bom_router
from app.modules.maintenance.routes   import router as maintenance_router

from contextlib import asynccontextmanager
from app.core.startup import run_startup_seeds

# ── LIFESPAN (AUTOMATED STARTUP SEEDS) ────────────────
@asynccontextmanager
async def lifespan(app: FastAPI):
    # Automatically verify and seed essential database roles & permissions on server boot
    await run_startup_seeds()
    yield

# ── APP INITIALIZATION ────────────────────────────────
# Main FastAPI application instance. This is the entry point for Uvicorn.
app = FastAPI(
    title=settings.APP_NAME,
    version='1.0.0',
    description='Bhagirath ERP — Manufacturing, Sales, Procurement, Inventory, Yard, and Portal Management',
    docs_url='/docs',
    redoc_url='/redoc',
    lifespan=lifespan,
)

# ── MIDDLEWARE ────────────────────────────────────────
# Configure CORS to allow the frontend React app to communicate with this backend.
app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.ALLOWED_ORIGINS,
    allow_origin_regex=settings.ALLOWED_ORIGIN_REGEX,
    allow_credentials=True,
    allow_methods=['*'],
    allow_headers=['*'],
)
 
# ── ROUTE REGISTRATION ────────────────────────────────
# Mount all domain routers under the /api/v1 prefix to support versioning.
from app.modules.vendor_portal.routes import router as vendor_portal_router

from app.modules.vendor_portal_admin.routes import router as vendor_portal_admin_router
from app.modules.sales.routes import router as sales_router
from app.modules.access_control.routes import router as access_control_router
from app.modules.yard.routes import router as yard_router
from app.modules.dealer_portal.routes import router as dealer_portal_router
from app.modules.dealer_portal_admin.routes import router as dealer_portal_admin_router
from app.modules.production_masters.routes import router as production_masters_router
from app.modules.production_masters.bom_analysis_routes import router as bom_analysis_router
from app.modules.dispatch.routes import router as dispatch_router

from app.modules.procurement.bulk_engine_routes import router as bulk_engine_router

app.include_router(auth_router,        prefix='/api/v1/auth',            tags=['Authentication'])
app.include_router(rm_router,          prefix='/api/v1/rm-master',      tags=['RM Master'])
app.include_router(vendor_router,      prefix='/api/v1/vendors',         tags=['Vendors'])
app.include_router(store_router,       prefix='/api/v1/stores',          tags=['Stores'])
app.include_router(station_router,     prefix='/api/v1/stations',        tags=['Stations'])
app.include_router(procurement_router, prefix='/api/v1/procurement',     tags=['Procurement'])
app.include_router(procurement_engine_router, prefix='/api/v1/procurement', tags=['Procurement Engine'])
app.include_router(bulk_engine_router, prefix='/api/v1/procurement', tags=['Bulk Procurement Engine'])
app.include_router(inventory_router,   prefix='/api/v1/inventory',       tags=['Inventory'])
app.include_router(bom_router,         prefix='/api/v1/bom',             tags=['BOM'])
app.include_router(maintenance_router, prefix='/api/v1/maintenance',     tags=['Maintenance'])
app.include_router(vendor_portal_router, prefix='/api/v1/portal',        tags=['Vendor Portal'])
app.include_router(vendor_portal_admin_router, prefix='/api/v1/admin/vendor-portal', tags=['Admin Vendor Portal'])
app.include_router(sales_router,       prefix='/api/v1/sales',           tags=['Sales'])
app.include_router(access_control_router, prefix='/api/v1/access-control', tags=['Access Control'])
app.include_router(yard_router,        prefix='/api/v1/yard',            tags=['Yard Inward'])
app.include_router(dealer_portal_router, prefix='/api/v1/dealer-portal',  tags=['Dealer Portal'])
app.include_router(dealer_portal_admin_router, prefix='/api/v1/admin/dealer-portal', tags=['Admin Dealer Portal'])
app.include_router(production_masters_router, prefix='/api/v1/production-masters', tags=['Production Masters'])
app.include_router(bom_analysis_router, prefix='/api/v1/bom-analysis', tags=['BOM Analysis'])
app.include_router(dispatch_router,      prefix='/api/v1/dispatch',           tags=['Dispatch'])
# Production Tracking module
from app.modules.production.routes import router as production_tracking_router
app.include_router(production_tracking_router, prefix='/api/v1/production', tags=['Production Tracking'])
# QA Checksheet module
from app.modules.qa.routes import router as qa_router
app.include_router(qa_router, prefix='/api/v1/qa', tags=['QA Checksheet'])
# Admin-managed dropdown lists
from app.modules.lookups.routes import router as lookups_router
app.include_router(lookups_router, prefix='/api/v1/lookups', tags=['Dropdown Lists'])
# Station staff, operator and QA workspaces
from app.modules.station_work.routes import router as station_work_router
app.include_router(station_work_router, prefix='/api/v1/station-work', tags=['Station Work'])

# Notifications module (Staff & Dealer Portal)
from app.modules.notifications.routes import router as notifications_router, dealer_router as dealer_notifications_router
app.include_router(notifications_router, prefix='/api/v1/notifications', tags=['Notifications'])
app.include_router(dealer_notifications_router, prefix='/api/v1/dealer-portal/notifications', tags=['Dealer Notifications'])

# Global Chassis Lifecycle Tracker
from app.modules.chassis_tracker.routes import router as chassis_tracker_router
app.include_router(chassis_tracker_router, prefix='/api/v1/chassis-tracker', tags=['Chassis Lifecycle Tracker'])

app.mount("/api/v1/uploads", StaticFiles(directory="uploads"), name="api_uploads")
app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")

@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
    error_msg = f"Unhandled Exception in {request.method} {request.url.path}\n"
    error_msg += "".join(traceback.format_exception(type(exc), exc, exc.__traceback__))
    app_logger.error(error_msg)
    
    return JSONResponse(
        status_code=500,
        content={"detail": "Internal Server Error. Please contact support if the issue persists."}
    )

@app.get('/health')
async def health():
    return {'status': 'ok', 'version': '1.0.0'}

