import React from "react"; import { CheckCircle, XCircle, AlertCircle, Loader2 } from "lucide-react"; import { shippingService, DeliveryScheduleItem } from "../../src/services/shipping.service"; export interface DeliveryAvailabilityStatusProps { selectedDate: Date | null; orderWeight: number; // Peso do pedido em toneladas isLoading?: boolean; } export interface DeliveryAvailabilityResult { available: boolean; capacity: number; currentLoad: number; availableCapacity: number; occupancy: number; message: string; } const DeliveryAvailabilityStatus: React.FC = ({ selectedDate, orderWeight, isLoading = false, }) => { const [availability, setAvailability] = React.useState(null); const [checking, setChecking] = React.useState(false); React.useEffect(() => { const checkAvailability = async () => { if (!selectedDate || orderWeight <= 0) { setAvailability(null); return; } try { setChecking(true); // Formatar data para DD/MM/YYYY (formato usado pelo Baldinho) const formattedDate = selectedDate.toLocaleDateString("pt-BR", { day: "2-digit", month: "2-digit", year: "numeric", }); console.log("📦 [DELIVERY_AVAILABILITY] Verificando disponibilidade:"); console.log("📦 [DELIVERY_AVAILABILITY] Data selecionada:", formattedDate); console.log("📦 [DELIVERY_AVAILABILITY] Peso do pedido:", orderWeight, "Ton"); // Buscar dados do agendamento const response = await shippingService.getScheduleDelivery(); if (!response || !response.deliveries || !Array.isArray(response.deliveries)) { console.warn("📦 [DELIVERY_AVAILABILITY] Resposta inválida da API"); setAvailability({ available: false, capacity: 0, currentLoad: 0, availableCapacity: 0, occupancy: 100, message: "Não foi possível verificar a disponibilidade", }); return; } console.log("📦 [DELIVERY_AVAILABILITY] Itens recebidos:", response.deliveries.length); // Encontrar o item correspondente à data selecionada const deliveryItem = response.deliveries.find((item: DeliveryScheduleItem) => { const itemDate = new Date(item.dateDelivery); const itemFormatted = itemDate.toLocaleDateString("pt-BR", { day: "2-digit", month: "2-digit", year: "numeric", timeZone: "UTC", }); console.log("📦 [DELIVERY_AVAILABILITY] Comparando:", itemFormatted, "com", formattedDate); return itemFormatted === formattedDate; }); if (!deliveryItem) { setAvailability({ available: false, capacity: 0, currentLoad: 0, availableCapacity: 0, occupancy: 100, message: "Data não encontrada no agendamento", }); return; } // Verificar disponibilidade const capacity = deliveryItem.deliverySize || 0; const currentLoad = deliveryItem.saleWeigth || 0; const availableCapacity = deliveryItem.avaliableDelivery || 0; const isDeliveryEnabled = deliveryItem.delivery === "S"; const canFit = availableCapacity >= orderWeight; const occupancy = capacity > 0 ? (currentLoad / capacity) * 100 : 100; const available = isDeliveryEnabled && canFit; let message = ""; if (!isDeliveryEnabled) { message = "Entrega não disponível para esta data"; } else if (!canFit) { message = `Capacidade insuficiente. Disponível: ${availableCapacity.toFixed(3)} Ton, Necessário: ${orderWeight.toFixed(3)} Ton`; } else { message = `Entrega disponível. Capacidade restante: ${availableCapacity.toFixed(3)} Ton`; } setAvailability({ available, capacity, currentLoad, availableCapacity, occupancy, message, }); } catch (error) { console.error("Erro ao verificar disponibilidade:", error); setAvailability({ available: false, capacity: 0, currentLoad: 0, availableCapacity: 0, occupancy: 100, message: "Erro ao verificar disponibilidade de entrega", }); } finally { setChecking(false); } }; checkAvailability(); }, [selectedDate, orderWeight]); if (!selectedDate || orderWeight <= 0) { return null; } if (checking || isLoading) { return (
Verificando disponibilidade de entrega...
); } if (!availability) { return null; } const isAvailable = availability.available; const occupancyColor = availability.occupancy >= 100 ? "bg-red-500" : availability.occupancy >= 85 ? "bg-orange-500" : "bg-emerald-500"; return (
{/* Ícone */}
{isAvailable ? ( ) : ( )}
{/* Conteúdo */}

{isAvailable ? "Entrega Disponível" : "Entrega Indisponível"}

{availability.occupancy >= 85 && availability.occupancy < 100 && ( )}

{availability.message}

{/* Barra de ocupação */}
Ocupação da Capacidade {availability.occupancy.toFixed(1)}%
Capacidade {availability.capacity.toFixed(3)} Ton
Carga Atual {availability.currentLoad.toFixed(3)} Ton
Disponível = orderWeight ? "text-emerald-600" : "text-red-600" }`}> {availability.availableCapacity.toFixed(3)} Ton
); }; export default DeliveryAvailabilityStatus;