import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Truck, Plus, Package, MapPin, Calendar, ArrowRight, Search, Filter, MoreVertical, Clock, CheckCircle, AlertTriangle } from 'lucide-react'; import { Button, StatsGrid, Card, CardContent, CardHeader, CardTitle, Badge, Input } from '../../../../components/ui'; import { PageHeader } from '../../../../components/layout'; import { useTenant } from '../../../../stores/tenant.store'; import { useDistributionOverview } from '../../../../api/hooks/useEnterpriseDashboard'; import DistributionMap from '../../../../components/maps/DistributionMap'; const DistributionPage: React.FC = () => { const { t } = useTranslation(['operations', 'common', 'dashboard']); const { currentTenant: tenant } = useTenant(); const [selectedDate, setSelectedDate] = useState(new Date().toISOString().split('T')[0]); const [activeTab, setActiveTab] = useState<'overview' | 'routes' | 'shipments'>('overview'); // Fetch real distribution data const { data: distributionData, isLoading } = useDistributionOverview( tenant?.id || '', selectedDate, { enabled: !!tenant?.id } ); // Derive stats from real data const stats = [ { title: t('operations:stats.active_routes', 'Rutas Activas'), value: distributionData?.route_sequences?.filter((r: any) => r.status === 'in_progress').length || 0, variant: 'info' as const, icon: Truck, }, { title: t('operations:stats.pending_deliveries', 'Entregas Pendientes'), value: distributionData?.status_counts?.pending || 0, variant: 'warning' as const, icon: Package, }, { title: t('operations:stats.completed_deliveries', 'Entregas Completadas'), value: distributionData?.status_counts?.delivered || 0, variant: 'success' as const, icon: CheckCircle, }, { title: t('operations:stats.total_routes', 'Total Rutas'), value: distributionData?.route_sequences?.length || 0, variant: 'default' as const, icon: MapPin, }, ]; const handleNewRoute = () => { // Navigate to create route page or open modal console.log('New route clicked'); }; if (!tenant) return null; // Prepare shipment status data safely const shipmentStatus = { pending: distributionData?.status_counts?.pending || 0, in_transit: distributionData?.status_counts?.in_transit || 0, delivered: distributionData?.status_counts?.delivered || 0, failed: distributionData?.status_counts?.failed || 0, }; return (
{ }, // In a real app this would trigger a date picker size: "md" }, { id: "add-new-route", label: t('operations:actions.new_route', 'Nueva Ruta'), variant: "primary" as const, icon: Plus, onClick: handleNewRoute, tooltip: t('operations:tooltips.new_route', 'Crear una nueva ruta de distribución'), size: "md" } ]} /> {/* Stats Grid */} {/* Main Content Areas */}
{/* Tabs Navigation */}
{/* Content based on Active Tab */} {activeTab === 'overview' && (
{/* Map Section */}
{t('operations:map.title', 'Mapa de Distribución')}

Visualización en tiempo real de la flota

En Vivo
{/* Recent Activity / Quick List */}
Rutas en Progreso {distributionData?.route_sequences?.filter((r: any) => r.status === 'in_progress').length > 0 ? (
{distributionData.route_sequences .filter((r: any) => r.status === 'in_progress') .map((route: any) => (

Ruta {route.route_number}

{route.formatted_driver_name || 'Sin conductor asignado'}

En Ruta
))}
) : (
No hay rutas en progreso actualmente.
)}
)} {activeTab === 'routes' && (
Listado de Rutas
} className="w-64" />
{(distributionData?.route_sequences?.length || 0) > 0 ? (
{distributionData.route_sequences.map((route: any) => ( ))}
Ruta Estado Distancia Duración Est. Paradas Acciones
{route.route_number} {route.status} {route.total_distance_km?.toFixed(1) || '-'} km {route.estimated_duration_minutes || '-'} min {route.route_points?.length || 0}
) : (

No se encontraron rutas para esta fecha.

)}
)} {/* Similar structure for Shipments tab, simplified for now */} {activeTab === 'shipments' && (

Gestión de Envíos

Funcionalidad de listado detallado de envíos próximamente.

)}
); }; export default DistributionPage;