import os import shutil from fastapi import FastAPI, UploadFile, File, Request, Form from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates from fastapi.staticfiles import StaticFiles from cost_calculator import allowed_file, analyze_pdf, get_rate_black, get_rate_color, UPLOAD_FOLDER from mailer import send_order_sync from dotenv import load_dotenv load_dotenv() app = FastAPI() templates = Jinja2Templates(directory="templates") os.makedirs(UPLOAD_FOLDER, exist_ok=True) app.mount("/static", StaticFiles(directory="static"), name="static") @app.get("/", response_class=HTMLResponse) async def welcome(request: Request): return templates.TemplateResponse("landing.html", {"request": request}) @app.get("/about", response_class=HTMLResponse) async def about(request: Request): return templates.TemplateResponse("about.html", {"request": request}) @app.get("/cost", response_class=HTMLResponse) async def cost_dashboard(request: Request): return templates.TemplateResponse( "cost-calculator.html", { "request": request, "rate_black": get_rate_black(), "rate_color": get_rate_color(), }, ) @app.post("/upload") async def upload_file(request: Request, file: UploadFile = File(...)): if not allowed_file(file.filename): return templates.TemplateResponse( "cost-calculator.html", {"request": request, "error": "Unsupported file type. Only PDF allowed."}, ) path = os.path.join(UPLOAD_FOLDER, file.filename) with open(path, "wb") as buffer: shutil.copyfileobj(file.file, buffer) result = analyze_pdf(path) return templates.TemplateResponse( "result.html", { "request": request, "result": result, "rate_black": get_rate_black(), "rate_color": get_rate_color(), }, ) @app.post("/send-order") def send_order_endpoint( request: Request, filename: str = Form(...), comment: str = Form(""), ): """ Handles the 'Send Order' button. Sends PDF + analysis + user comment via Matrix. """ path = os.path.join(UPLOAD_FOLDER, filename) if not os.path.exists(path): return templates.TemplateResponse( "cost-calculator.html", {"request": request, "error": "File not found. Please upload again."}, ) analysis = analyze_pdf(path) try: send_order_sync(path, analysis, room_id="!YokZIMTVFEmSMRmmsb:localhost", comment=comment) # Render same result.html but include a success banner return templates.TemplateResponse( "result.html", { "request": request, "result": analysis, "rate_black": get_rate_black(), "rate_color": get_rate_color(), "success": "✅ Your order has been sent!" }, ) except Exception as e: return templates.TemplateResponse( "result.html", { "request": request, "result": analysis, "rate_black": get_rate_black(), "rate_color": get_rate_color(), "error": f"Failed to send order: {e}", }, )