""" Endpoints para reportes y dashboard. """ from datetime import datetime from typing import Optional from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from app.core.database import get_db from app.core.security import get_current_user from app.models.usuario import Usuario from app.schemas.reporte import ( DashboardResumen, DashboardGrafico, ReporteRequest, ReporteResponse, ) from app.services.reporte_service import ReporteService router = APIRouter(prefix="/reportes", tags=["Reportes"]) @router.get("/dashboard", response_model=DashboardResumen) async def obtener_dashboard( db: AsyncSession = Depends(get_db), current_user: Usuario = Depends(get_current_user), ): """ Obtiene datos del dashboard principal. Returns: Resumen del dashboard. """ reporte_service = ReporteService(db) return await reporte_service.obtener_dashboard_resumen() @router.get("/dashboard/graficos", response_model=DashboardGrafico) async def obtener_graficos_dashboard( db: AsyncSession = Depends(get_db), current_user: Usuario = Depends(get_current_user), ): """ Obtiene datos para gráficos del dashboard. Returns: Datos para gráficos. """ reporte_service = ReporteService(db) return await reporte_service.obtener_dashboard_graficos() @router.post("/generar", response_model=ReporteResponse) async def generar_reporte( request: ReporteRequest, db: AsyncSession = Depends(get_db), current_user: Usuario = Depends(get_current_user), ): """ Genera un reporte según los parámetros. Args: request: Parámetros del reporte. Returns: Información del reporte generado. """ reporte_service = ReporteService(db) return await reporte_service.generar_reporte(request) @router.get("/viajes") async def reporte_viajes( desde: datetime, hasta: datetime, vehiculo_id: Optional[int] = None, formato: str = "json", db: AsyncSession = Depends(get_db), current_user: Usuario = Depends(get_current_user), ): """ Genera reporte de viajes. Args: desde: Fecha inicio. hasta: Fecha fin. vehiculo_id: Filtrar por vehículo. formato: Formato de salida. Returns: Datos del reporte. """ reporte_service = ReporteService(db) request = ReporteRequest( tipo="viajes", formato=formato if formato != "json" else "pdf", fecha_inicio=desde, fecha_fin=hasta, vehiculos_ids=[vehiculo_id] if vehiculo_id else None, ) datos = await reporte_service._recopilar_datos_reporte(request) if formato == "json": return datos resultado = await reporte_service.generar_reporte(request) return resultado @router.get("/alertas") async def reporte_alertas( desde: datetime, hasta: datetime, vehiculo_id: Optional[int] = None, formato: str = "json", db: AsyncSession = Depends(get_db), current_user: Usuario = Depends(get_current_user), ): """ Genera reporte de alertas. Args: desde: Fecha inicio. hasta: Fecha fin. vehiculo_id: Filtrar por vehículo. formato: Formato de salida. Returns: Datos del reporte. """ reporte_service = ReporteService(db) request = ReporteRequest( tipo="alertas", formato=formato if formato != "json" else "pdf", fecha_inicio=desde, fecha_fin=hasta, vehiculos_ids=[vehiculo_id] if vehiculo_id else None, ) datos = await reporte_service._recopilar_datos_reporte(request) if formato == "json": return datos resultado = await reporte_service.generar_reporte(request) return resultado @router.get("/combustible") async def reporte_combustible( desde: datetime, hasta: datetime, vehiculo_id: Optional[int] = None, formato: str = "json", db: AsyncSession = Depends(get_db), current_user: Usuario = Depends(get_current_user), ): """ Genera reporte de combustible. Args: desde: Fecha inicio. hasta: Fecha fin. vehiculo_id: Filtrar por vehículo. formato: Formato de salida. Returns: Datos del reporte. """ reporte_service = ReporteService(db) request = ReporteRequest( tipo="combustible", formato=formato if formato != "json" else "pdf", fecha_inicio=desde, fecha_fin=hasta, vehiculos_ids=[vehiculo_id] if vehiculo_id else None, ) datos = await reporte_service._recopilar_datos_reporte(request) if formato == "json": return datos resultado = await reporte_service.generar_reporte(request) return resultado @router.get("/mantenimiento") async def reporte_mantenimiento( desde: datetime, hasta: datetime, vehiculo_id: Optional[int] = None, formato: str = "json", db: AsyncSession = Depends(get_db), current_user: Usuario = Depends(get_current_user), ): """ Genera reporte de mantenimiento. Args: desde: Fecha inicio. hasta: Fecha fin. vehiculo_id: Filtrar por vehículo. formato: Formato de salida. Returns: Datos del reporte. """ reporte_service = ReporteService(db) request = ReporteRequest( tipo="mantenimiento", formato=formato if formato != "json" else "pdf", fecha_inicio=desde, fecha_fin=hasta, vehiculos_ids=[vehiculo_id] if vehiculo_id else None, ) datos = await reporte_service._recopilar_datos_reporte(request) if formato == "json": return datos resultado = await reporte_service.generar_reporte(request) return resultado