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.schemas.pdf_template import PdfTemplateSummaryListResponse, PdfTemplateSummaryResponse from app.services import pdf_service, pdf_template_service router = APIRouter(prefix="/pdf", tags=["pdf"]) @router.get("/templates", response_model=PdfTemplateSummaryListResponse) async def list_available_templates( _user: Annotated[User, Depends(get_current_user)], db: Annotated[AsyncSession, Depends(get_db)], ): templates = await pdf_template_service.list_templates(db, active_only=True) return PdfTemplateSummaryListResponse( templates=[PdfTemplateSummaryResponse.model_validate(t) for t in templates] ) @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_pdf_report( db, user.id, data.title, data.document_ids or None, data.chat_id, data.template_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)