from fastapi import APIRouter, Depends, HTTPException, status from sqlmodel import Session, select from typing import List, Optional from uuid import UUID from app.core.database import get_session from app.api.deps import get_current_admin, get_current_user_optional from app.models.report import Report from app.models.user import User from app.schemas.report import ReportCreate, ReportUpdate, ReportResponse router = APIRouter(prefix="/api/reports", tags=["reports"]) @router.post("", response_model=ReportResponse, status_code=status.HTTP_201_CREATED) async def create_report( report_in: ReportCreate, session: Session = Depends(get_session), current_user: Optional[User] = Depends(get_current_user_optional) ): """Create a new user report.""" report = Report( message=report_in.message, user_id=current_user.id if current_user else None ) session.add(report) session.commit() session.refresh(report) return ReportResponse( id=report.id, user_id=report.user_id, user_name=current_user.full_name if current_user else "Anónimo", message=report.message, status=report.status, created_at=report.created_at ) @router.get("", response_model=List[ReportResponse]) async def get_reports( session: Session = Depends(get_session), admin_auth: bool = Depends(get_current_admin) ): """Get all reports (Admin only).""" statement = select(Report) results = session.exec(statement).all() reports = [] for report in results: user_name = "Anónimo" if report.user_id: user = session.get(User, report.user_id) if user: user_name = user.full_name reports.append(ReportResponse( id=report.id, user_id=report.user_id, user_name=user_name, message=report.message, status=report.status, created_at=report.created_at )) return reports @router.patch("/{report_id}", response_model=ReportResponse) async def update_report_status( report_id: UUID, report_update: ReportUpdate, session: Session = Depends(get_session), admin_auth: bool = Depends(get_current_admin) ): """Update report status (Admin only).""" report = session.get(Report, report_id) if not report: raise HTTPException(status_code=404, detail="Report not found") report.status = report_update.status session.add(report) session.commit() session.refresh(report) user_name = "Anónimo" if report.user_id: user = session.get(User, report.user_id) if user: user_name = user.full_name return ReportResponse( id=report.id, user_id=report.user_id, user_name=user_name, message=report.message, status=report.status, created_at=report.created_at )