import React, { useState, useEffect } from "react"; import { OrderItem, Product } from "../types"; import { productService, SaleProduct } from "../src/services/product.service"; import { authService } from "../src/services/auth.service"; import { shoppingService } from "../src/services/shopping.service"; import FilialSelector from "./FilialSelector"; import { X, Minus, Plus, Edit2 } from "lucide-react"; import { validateMinValue, validateRequired } from "../lib/utils"; interface EditItemModalProps { item: OrderItem; isOpen: boolean; onClose: () => void; onConfirm: (item: OrderItem) => Promise; } const EditItemModal: React.FC = ({ item, isOpen, onClose, onConfirm, }) => { const [productDetail, setProductDetail] = useState(null); const [loading, setLoading] = useState(false); const [quantity, setQuantity] = useState(item.quantity || 1); const [selectedStore, setSelectedStore] = useState( item.stockStore?.toString() || "" ); const [deliveryType, setDeliveryType] = useState(item.deliveryType || ""); const [environment, setEnvironment] = useState(item.environment || ""); const [stocks, setStocks] = useState< Array<{ store: string; storeName: string; quantity: number; work: boolean; blocked: string; breakdown: number; transfer: number; allowDelivery: number; }> >([]); const [showDescription, setShowDescription] = useState(false); const [formErrors, setFormErrors] = useState<{ quantity?: string; deliveryType?: string; selectedStore?: string; }>({}); // Tipos de entrega const deliveryTypes = [ { type: "RI", description: "Retira Imediata" }, { type: "RP", description: "Retira Posterior" }, { type: "EN", description: "Entrega" }, { type: "EF", description: "Encomenda" }, ]; useEffect(() => { if (isOpen && item) { setQuantity(item.quantity || 1); setSelectedStore(item.stockStore?.toString() || ""); setDeliveryType(item.deliveryType || ""); setEnvironment(item.environment || ""); setFormErrors({}); loadProductDetail(); } else if (!isOpen) { // Reset states when modal closes setQuantity(1); setSelectedStore(""); setDeliveryType(""); setEnvironment(""); setFormErrors({}); setProductDetail(null); setStocks([]); setShowDescription(false); } }, [isOpen, item]); const loadProductDetail = async () => { if (!item.code) return; try { setLoading(true); const store = authService.getStore(); if (!store) { throw new Error("Loja não encontrada"); } const productId = parseInt(item.code); if (isNaN(productId)) { throw new Error("ID do produto inválido"); } // Buscar detalhes do produto const detail = await productService.getProductDetail(store, productId); setProductDetail(detail); // Buscar estoques try { const stocksData = await productService.getProductStocks( store, productId ); setStocks(stocksData); } catch (err) { console.warn("Erro ao carregar estoques:", err); } } catch (err: any) { console.error("Erro ao carregar detalhes do produto:", err); } finally { setLoading(false); } }; const validateForm = (): boolean => { const errors: typeof formErrors = {}; if (!validateRequired(quantity) || !validateMinValue(quantity, 0.01)) { errors.quantity = "A quantidade deve ser maior que zero"; } if (!validateRequired(deliveryType)) { errors.deliveryType = "O tipo de entrega é obrigatório"; } if (stocks.length > 0 && !validateRequired(selectedStore)) { errors.selectedStore = "A filial de estoque é obrigatória"; } setFormErrors(errors); return Object.keys(errors).length === 0; }; const handleConfirm = async () => { if (!validateForm()) { return; } // Criar OrderItem atualizado const updatedItem: OrderItem = { ...item, quantity, deliveryType, stockStore: selectedStore || item.stockStore, environment: environment || undefined, }; await onConfirm(updatedItem); }; const calculateTotal = () => { const price = productDetail?.salePrice || item.price || 0; return price * quantity; }; const calculateDiscount = () => { const listPrice = productDetail?.listPrice || item.originalPrice || 0; const salePrice = productDetail?.salePrice || item.price || 0; if (listPrice > 0 && salePrice < listPrice) { return Math.round(((listPrice - salePrice) / listPrice) * 100); } return 0; }; const discount = calculateDiscount(); const total = calculateTotal(); const listPrice = productDetail?.listPrice || item.originalPrice || 0; const salePrice = productDetail?.salePrice || item.price || 0; if (!isOpen) return null; return (
{/* Header */}

Editar Item do Pedido

{/* Content */}
{loading ? (
) : (
{/* Left: Image */}
{item.image && item.image.trim() !== "" ? ( {item.name} ) : (

Sem imagem

)}
{/* Right: Product Info */}
{/* Product Title */}

#{productDetail?.title || item.name}

{productDetail?.smallDescription || productDetail?.description || item.description || ""}

{productDetail?.brand || item.mark} {productDetail?.idProduct || item.code} {productDetail?.ean && ( <> {productDetail.ean} )}
{productDetail?.productType === "A" && ( AUTOSSERVIÇO )}
{/* Price */}
{listPrice > 0 && listPrice > salePrice && (

de R$ {listPrice.toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2, })}{" "} por

)}

R$ {salePrice.toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2, })}

{discount > 0 && ( -{discount}% )}
{productDetail?.installments && productDetail.installments.length > 0 && (

POR UN EM {productDetail.installments[0].installment}X DE R${" "} {productDetail.installments[0].installmentValue.toLocaleString( "pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2, } )}

)}
{/* Store Selector */} {stocks.length > 0 && (
{ setSelectedStore(value); if (formErrors.selectedStore) { setFormErrors((prev) => ({ ...prev, selectedStore: undefined, })); } }} placeholder="Digite para buscar..." /> {formErrors.selectedStore && (

{formErrors.selectedStore}

)}
)} {/* Description (Collapsible) */}
DESCRIÇÃO DO PRODUTO
{showDescription && (

{productDetail?.description || item.description || "Sem descrição disponível"}

)}
{/* Quantity */}
{ const val = parseInt(e.target.value); if (!isNaN(val) && val > 0) { setQuantity(val); if (formErrors.quantity) { setFormErrors((prev) => ({ ...prev, quantity: undefined, })); } } }} className="w-16 text-center text-sm font-bold border-0 focus:outline-none bg-white" />
{formErrors.quantity && (

{formErrors.quantity}

)}
{/* Environment */}
setEnvironment(e.target.value)} className="w-full px-4 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-orange-500/20 text-sm" placeholder="" />
{/* Delivery Type */}
{formErrors.deliveryType && (

{formErrors.deliveryType}

)}
{/* Total Price and Confirm Button */}
R$ {total.toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2, })}
)}
); }; export default EditItemModal;