""" UI Layer Routes - HTML page routes only (no business logic) """ from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse, FileResponse from fastapi.templating import Jinja2Templates import os router = APIRouter() # Setup Jinja2 templates templates = Jinja2Templates(directory="app/ui/templates") # Read environment (development or production) ENVIRONMENT = os.getenv("ENVIRONMENT", "production") VERSION = "1.0.0" # Terra-View version # Override TemplateResponse to include environment and version in context original_template_response = templates.TemplateResponse def custom_template_response(name, context=None, *args, **kwargs): if context is None: context = {} context["environment"] = ENVIRONMENT context["version"] = VERSION return original_template_response(name, context, *args, **kwargs) templates.TemplateResponse = custom_template_response # ===== HTML PAGE ROUTES ===== @router.get("/", response_class=HTMLResponse) async def dashboard(request: Request): """Dashboard home page""" return templates.TemplateResponse("dashboard.html", {"request": request}) @router.get("/roster", response_class=HTMLResponse) async def roster_page(request: Request): """Fleet roster page""" return templates.TemplateResponse("roster.html", {"request": request}) @router.get("/unit/{unit_id}", response_class=HTMLResponse) async def unit_detail_page(request: Request, unit_id: str): """Unit detail page""" return templates.TemplateResponse("unit_detail.html", { "request": request, "unit_id": unit_id }) @router.get("/settings", response_class=HTMLResponse) async def settings_page(request: Request): """Settings page for roster management""" return templates.TemplateResponse("settings.html", {"request": request}) @router.get("/sound-level-meters", response_class=HTMLResponse) async def sound_level_meters_page(request: Request): """Sound Level Meters management dashboard""" return templates.TemplateResponse("sound_level_meters.html", {"request": request}) @router.get("/seismographs", response_class=HTMLResponse) async def seismographs_page(request: Request): """Seismographs management dashboard""" return templates.TemplateResponse("seismographs.html", {"request": request}) # ===== PWA ROUTES ===== @router.get("/sw.js") async def service_worker(): """Serve service worker with proper headers for PWA""" return FileResponse( "app/ui/static/sw.js", media_type="application/javascript", headers={ "Service-Worker-Allowed": "/", "Cache-Control": "no-cache" } ) @router.get("/offline-db.js") async def offline_db_script(): """Serve offline database script""" return FileResponse( "app/ui/static/offline-db.js", media_type="application/javascript", headers={"Cache-Control": "no-cache"} )