import uuid from datetime import datetime from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Query, status from fastapi.responses import StreamingResponse from sqlalchemy.ext.asyncio import AsyncSession from starlette.responses import Response from app.api.deps import get_current_user from app.database import get_db from app.models.user import User from app.services.citation import export_citations_csv, export_citations_pdf router = APIRouter() @router.get("/export/csv") async def export_report( query_id: uuid.UUID = Query(...), format: str = Query("csv"), db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): if format != "csv": raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Only CSV format is supported", ) try: csv_content = await export_citations_csv(db, current_user.id, query_id) except ValueError as e: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=str(e), ) date_str = datetime.now().strftime("%Y%m%d") filename = f"geo-report-{date_str}.csv" return StreamingResponse( iter([csv_content]), media_type="text/csv", headers={ "Content-Disposition": f'attachment; filename="{filename}"', }, ) @router.get("/export/pdf") async def export_pdf( query_id: Optional[uuid.UUID] = None, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): try: pdf_bytes = await export_citations_pdf(db, current_user.id, query_id) except ValueError as e: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=str(e), ) date_str = datetime.now().strftime("%Y%m%d") filename = f"geo-report-{date_str}.pdf" return Response( content=pdf_bytes, media_type="application/pdf", headers={ "Content-Disposition": f'attachment; filename="{filename}"', }, )