from __future__ import annotations from pathlib import Path from fastapi import APIRouter, Depends, File, HTTPException, Request, UploadFile from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates from bom_assistant.api.store import SessionStore, get_store from bom_assistant.scouting.ingest import build_session from bom_assistant.scouting.orchestrator import scout_row router = APIRouter() templates = Jinja2Templates(directory=str(Path(__file__).parent / "templates")) @router.get("/", response_class=HTMLResponse) def index(request: Request) -> HTMLResponse: return templates.TemplateResponse(request, "index.html", {}) @router.post("/upload", response_class=HTMLResponse) def upload( request: Request, file: UploadFile = File(...), store: SessionStore = Depends(get_store), ) -> HTMLResponse: content = file.file.read() try: session = build_session(content, file.filename or "upload") except Exception as exc: raise HTTPException(status_code=400, detail=f"failed to parse BOM: {exc}") from exc store.create(session) return templates.TemplateResponse(request, "_rows.html", {"session": session}) @router.get("/session/{session_id}/row/{row_id}/scout", response_class=HTMLResponse) def scout( request: Request, session_id: str, row_id: str, store: SessionStore = Depends(get_store), ) -> HTMLResponse: session = store.get(session_id) row = scout_row(session, row_id) store.save(session) return templates.TemplateResponse(request, "_scout_result.html", {"row": row})