import React, { useState } from 'react'; import { X, FileSpreadsheet, Copy, Check, Trash2, Layers, Box, CheckCircle2, Clock, Download, } from 'lucide-react'; import * as XLSX from 'xlsx'; import { toast } from 'sonner'; export interface SelectedPieceItem { id: string; // mesh.uuid pieceMark: string; phase?: string; section?: string; name?: string; pointedQty?: number; totalQty?: number; currentStage?: string; stageColor?: string; } interface SelectionListModalProps { isOpen: boolean; onClose: () => void; selectedPieces: SelectedPieceItem[]; selectedOF?: string; onClearSelection: () => void; } export const SelectionListModal: React.FC = ({ isOpen, onClose, selectedPieces, selectedOF, onClearSelection, }) => { const [copied, setCopied] = useState(false); if (!isOpen) return null; // Agrupamento por Marca + Fase para consolidar quantidades const groupedMap = new Map< string, { pieceMark: string; phase: string; section: string; selectedCount: number; totalQty: number; pointedQty: number; currentStage: string; stageColor: string; } >(); selectedPieces.forEach((p) => { const key = `${p.phase || '1'}_${p.pieceMark || 'Sem Marca'}`; const existing = groupedMap.get(key); if (existing) { existing.selectedCount += 1; } else { groupedMap.set(key, { pieceMark: p.pieceMark || 'Sem Marca', phase: p.phase || '-', section: p.section || '-', selectedCount: 1, totalQty: p.totalQty || 1, pointedQty: p.pointedQty || 0, currentStage: p.currentStage || 'Pendente', stageColor: p.stageColor || '#64748b', }); } }); const consolidatedList = Array.from(groupedMap.values()); const totalPhysicalPieces = selectedPieces.length; const totalDistinctMarks = consolidatedList.length; // Exportação para Excel const handleExportExcel = () => { if (consolidatedList.length === 0) { toast.warning('Nenhuma peça selecionada para exportar.'); return; } try { const dataRows = consolidatedList.map((item, idx) => ({ 'Item': idx + 1, 'Ordem de Fabricação (OF)': selectedOF || '-', 'Fase': item.phase, 'Marca Principal': item.pieceMark, 'Perfil / Bitola': item.section, 'Qtd. Selecionada no 3D': item.selectedCount, 'Qtd. Total Cadastrada': item.totalQty, 'Qtd. Apontada na Fábrica': item.pointedQty, 'Etapa / Status Atual': item.currentStage, })); const worksheet = XLSX.utils.json_to_sheet(dataRows); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Peças Selecionadas'); worksheet['!cols'] = [ { wch: 6 }, { wch: 24 }, { wch: 10 }, { wch: 18 }, { wch: 22 }, { wch: 22 }, { wch: 20 }, { wch: 22 }, { wch: 20 }, ]; const fileName = `Selecao_3D_${selectedOF || 'OF'}_${new Date().toISOString().slice(0, 10)}.xlsx`; XLSX.writeFile(workbook, fileName); toast.success('Planilha Excel gerada com sucesso!', { description: fileName, }); } catch (err) { console.error('Erro ao gerar Excel:', err); toast.error('Falha ao exportar para Excel.'); } }; // Copiar para Área de Transferência const handleCopy = () => { if (consolidatedList.length === 0) return; const headers = ['OF', 'Fase', 'Marca', 'Perfil', 'Qtd Selecionada', 'Qtd Total', 'Status']; const lines = consolidatedList.map((item) => [ selectedOF || '-', item.phase, item.pieceMark, item.section, item.selectedCount, item.totalQty, item.currentStage, ].join('\t') ); const textToCopy = [headers.join('\t'), ...lines].join('\n'); navigator.clipboard.writeText(textToCopy); setCopied(true); toast.success('Lista copiada para a área de transferência!'); setTimeout(() => setCopied(false), 2000); }; return (
{/* Cabeçalho do Modal Harmonizado */}

Lista de Peças Selecionadas no 3D

{totalPhysicalPieces} {totalPhysicalPieces === 1 ? 'peça' : 'peças'}

Relação consolidada das peças marcadas na cena 3D

{/* KPIs Resumo no Topo (Tons Sóbrios de Azul Escuro, Verde Escuro e Cinza) */}
{/* Card 1: Total de Peças (Azul Escuro no claro / Azul Claro no escuro) */}
Total de Peças {totalPhysicalPieces}
{/* Card 2: Marcas Distintas (Cinza Escuro no claro / Cinza Claro no escuro) */}
Marcas Distintas {totalDistinctMarks}
{/* Card 3: Ordem de Fabricação (Verde Escuro no claro / Verde Claro no escuro) */}
Ordem de Fabricação {selectedOF || 'N/A'}
{/* Card 4: Status / Seleção (Cinza Neutro / Azul) */}
Status {totalPhysicalPieces > 0 ? 'Filtro Ativo' : 'Vazio'}
{/* Tabela de Itens Selecionados Sóbria e Harmonizada */}
{consolidatedList.length === 0 ? (

Nenhuma peça selecionada

Clique nas peças na cena 3D (ou clique duplo para selecionar todas da mesma marca) para incluí-las nesta lista.

) : (
{consolidatedList.map((item, idx) => { const isPendente = !item.currentStage || item.currentStage.toLowerCase().includes('pendente'); return ( ); })}
Marca Principal Fase Perfil / Bitola Qtd. 3D Qtd. OF Etapa / Apontamento
{item.pieceMark} {item.phase} {item.section} {item.selectedCount} {item.pointedQty} / {item.totalQty} {item.currentStage}
)}
{/* Rodapé com Botões de Ação Harmonizados */}
{/* Exportar Excel em tom Azul Escuro / Verde Escuro Industrial */}
); };