import uuid from pathlib import Path from typing import Annotated from fastapi import APIRouter, Depends, HTTPException, status from fastapi.responses import FileResponse from sqlalchemy.ext.asyncio import AsyncSession from app.api.deps import get_current_user from app.database import get_db from app.models.user import User from app.schemas.pdf import GeneratePdfRequest, PdfListResponse, PdfResponse from app.services import pdf_service router = APIRouter(prefix="/pdf", tags=["pdf"]) @router.post("/compile", response_model=PdfResponse, status_code=status.HTTP_201_CREATED) async def compile_pdf( data: GeneratePdfRequest, user: Annotated[User, Depends(get_current_user)], db: Annotated[AsyncSession, Depends(get_db)], ): pdf = await pdf_service.generate_health_pdf( db, user.id, data.title, data.document_ids or None, data.chat_id, ) return PdfResponse.model_validate(pdf) @router.get("/", response_model=PdfListResponse) async def list_pdfs( user: Annotated[User, Depends(get_current_user)], db: Annotated[AsyncSession, Depends(get_db)], ): pdfs = await pdf_service.get_user_pdfs(db, user.id) return PdfListResponse(pdfs=[PdfResponse.model_validate(p) for p in pdfs]) @router.get("/{pdf_id}/download") async def download_pdf( pdf_id: uuid.UUID, user: Annotated[User, Depends(get_current_user)], db: Annotated[AsyncSession, Depends(get_db)], ): pdf = await pdf_service.get_pdf(db, pdf_id, user.id) if not pdf: raise HTTPException(status_code=404, detail="PDF not found") file_path = Path(pdf.storage_path) if not file_path.exists(): raise HTTPException(status_code=404, detail="PDF file not found on disk") media_type = "application/pdf" if file_path.suffix == ".pdf" else "text/html" return FileResponse(path=str(file_path), filename=f"{pdf.title}.pdf", media_type=media_type)