"""PDF generation API endpoint.""" from io import BytesIO import pandas as pd from fastapi import APIRouter, HTTPException from fastapi.responses import StreamingResponse from app.models.event import ScenarioDocument from app.core.validator import validate_inputs, ValidationError, ScenarsError from app.core.pdf_generator import generate_pdf router = APIRouter() @router.post("/generate-pdf") async def generate_pdf_endpoint(doc: ScenarioDocument): """Generate PDF timetable from ScenarioDocument.""" try: validate_inputs(doc.event.title, doc.event.detail, 0) except ValidationError as e: raise HTTPException(status_code=422, detail=str(e)) # Convert to DataFrame rows = [] for block in doc.blocks: rows.append({ 'Datum': block.datum, 'Zacatek': block.zacatek, 'Konec': block.konec, 'Program': block.program, 'Typ': block.typ, 'Garant': block.garant, 'Poznamka': block.poznamka, }) df = pd.DataFrame(rows) if df.empty: raise HTTPException(status_code=422, detail="No blocks provided") # Build program descriptions and colors program_descriptions = {pt.code: pt.description for pt in doc.program_types} program_colors = {pt.code: 'FF' + pt.color.lstrip('#') for pt in doc.program_types} try: pdf_bytes = generate_pdf(df, doc.event.title, doc.event.detail, program_descriptions, program_colors) except ScenarsError as e: raise HTTPException(status_code=422, detail=str(e)) return StreamingResponse( BytesIO(pdf_bytes), media_type="application/pdf", headers={"Content-Disposition": "attachment; filename=scenar_timetable.pdf"} )