'use client'; import { useState } from 'react'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { useRouter } from 'next/navigation'; import { DashboardShell } from '@/components/layouts/dashboard-shell'; import { Card, CardContent, CardHeader, CardTitle, Button } from '@horux/shared-ui'; import { useAlertas, useAlertasStats, useUpdateAlerta, useDeleteAlerta, useMarkAllAsRead } from '@/lib/hooks/use-alertas'; import { apiClient } from '@/lib/api/client'; import { Bell, Check, Trash2, AlertTriangle, Info, AlertCircle, CheckCircle, ShieldAlert, ChevronRight, Clock } from 'lucide-react'; import { cn } from '@horux/shared-ui'; import { useContribuyenteStore } from '@/stores/contribuyente-store'; interface AlertaAuto { id: string; tipo: string; titulo: string; mensaje: string; prioridad: 'alta' | 'media' | 'baja'; detalle?: string; valor?: number; } const prioridadStyles = { alta: 'border-l-4 border-l-destructive bg-destructive/5', media: 'border-l-4 border-l-warning bg-warning/5', baja: 'border-l-4 border-l-muted bg-muted/5', }; const prioridadIcons = { alta: AlertCircle, media: AlertTriangle, baja: Info, }; export default function AlertasPage() { const [filter, setFilter] = useState<'todas' | 'pendientes' | 'resueltas'>('pendientes'); const { data: alertas, isLoading } = useAlertas({ resuelta: filter === 'resueltas' ? true : filter === 'pendientes' ? false : undefined, }); const { data: stats } = useAlertasStats(); const updateAlerta = useUpdateAlerta(); const deleteAlerta = useDeleteAlerta(); const markAllAsRead = useMarkAllAsRead(); const router = useRouter(); const { selectedContribuyenteId } = useContribuyenteStore(); const queryClient = useQueryClient(); const { data: alertasAuto } = useQuery({ queryKey: ['alertas-automaticas', selectedContribuyenteId], queryFn: async () => { const params = new URLSearchParams(); if (selectedContribuyenteId) params.set('contribuyenteId', selectedContribuyenteId); const res = await apiClient.get(`/alertas/automaticas?${params}`); return res.data; }, }); const { data: alertasManuales } = useQuery({ queryKey: ['alertas-manuales', selectedContribuyenteId], queryFn: async () => { const params = new URLSearchParams(); if (selectedContribuyenteId) params.set('contribuyenteId', selectedContribuyenteId); const res = await apiClient.get(`/alertas/manuales?${params}`); return res.data; }, }); const handleResolver = async (id: string) => { await apiClient.patch(`/alertas/manuales/${id}/resolver`); queryClient.invalidateQueries({ queryKey: ['alertas-manuales'] }); }; const handleMarkAsRead = (id: number) => { updateAlerta.mutate({ id, data: { leida: true } }); }; const handleResolve = (id: number) => { updateAlerta.mutate({ id, data: { resuelta: true } }); }; const handleDelete = (id: number) => { if (confirm('¿Eliminar esta alerta?')) { deleteAlerta.mutate(id); } }; return (
{/* Stats */}
Alertas del Sistema
{alertasAuto?.length || 0}
Obligaciones Pendientes
{alertasManuales?.length || 0}
Total Alertas
{(alertasAuto?.length || 0) + (alertasManuales?.length || 0)}
{/* Alertas Automáticas */} {alertasAuto && alertasAuto.length > 0 && ( Alertas del Sistema ({alertasAuto.length}) {alertasAuto.map((alerta) => { const Icon = alerta.prioridad === 'alta' ? AlertCircle : AlertTriangle; return (

{alerta.titulo}

{alerta.mensaje}

{alerta.detalle && (
)}
); })}
)} {/* Obligaciones Fiscales Pendientes */} Obligaciones Fiscales Pendientes ({alertasManuales?.length || 0}) {!alertasManuales || alertasManuales.length === 0 ? (

Todas las obligaciones fiscales estan al dia

) : (
{alertasManuales.map((alerta: any) => { const esPago = alerta.tipo.startsWith('pago-'); const Icon = prioridadIcons[alerta.prioridad as keyof typeof prioridadIcons] || AlertTriangle; return (

{alerta.titulo}

{alerta.mensaje}

Vencio: {(() => { const d = new Date(alerta.fechaVencimiento); return isNaN(d.getTime()) ? '' : d.toLocaleDateString('es-MX', { day: 'numeric', month: 'short', year: 'numeric' }); })()}
); })}
)}
); }