import React, { useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { FileText } from 'lucide-react'; import { IndBillitemRecord } from '@/lib/pbtypes'; import { IndJob } from '@/lib/types'; import { dataService } from '@/services/dataService'; import { useToast } from '@/hooks/use-toast'; import { useMaterialsCalculations } from '@/hooks/useMaterialsCalculations'; import { parseBillOfMaterials, parseConsumedMaterials } from '@/utils/materialsParser'; import { exportBillOfMaterials, exportConsumedMaterials, exportMissingMaterials } from '@/utils/materialsExporter'; import MaterialsActions from './MaterialsActions'; import MaterialsList from './MaterialsList'; interface MaterialsImportExportProps { job?: IndJob; billOfMaterials: IndBillitemRecord[]; consumedMaterials: IndBillitemRecord[]; onBillOfMaterialsUpdate: (billItems: IndBillitemRecord[]) => void; onConsumedMaterialsUpdate: (billItems: IndBillitemRecord[]) => void; } const MaterialsImportExport: React.FC = ({ job, billOfMaterials, consumedMaterials, onBillOfMaterialsUpdate, onConsumedMaterialsUpdate }) => { const [bomInput, setBomInput] = useState(''); const [consumedInput, setConsumedInput] = useState(''); const { toast } = useToast(); const { calculateMissingMaterials } = useMaterialsCalculations(job, billOfMaterials); const handleImportBom = async () => { if (!job) return; const materials = parseBillOfMaterials(bomInput); if (materials.length > 0) { try { const updatedJob = await dataService.createMultipleBillItems(job.id, materials, 'billOfMaterials'); onBillOfMaterialsUpdate(updatedJob.billOfMaterials); setBomInput(''); } catch (error) { console.error('Error importing bill of materials:', error); } } }; const handleImportConsumed = async () => { if (!job) return; const materials = parseConsumedMaterials(consumedInput); if (materials.length > 0) { try { const updatedJob = await dataService.createMultipleBillItems(job.id, materials, 'consumedMaterials'); onConsumedMaterialsUpdate(updatedJob.consumedMaterials); setConsumedInput(''); } catch (error) { console.error('Error importing consumed materials:', error); } } }; const handleExportBom = () => { const exported = exportBillOfMaterials(billOfMaterials); navigator.clipboard.writeText(exported); toast({ title: "Exported", description: "Bill of materials copied to clipboard", duration: 2000, }); }; const handleExportConsumed = () => { const exported = exportConsumedMaterials(consumedMaterials); navigator.clipboard.writeText(exported); toast({ title: "Exported", description: "Consumed materials copied to clipboard", duration: 2000, }); }; const handleExportMissing = () => { const missingMaterials = calculateMissingMaterials(); const exported = exportMissingMaterials(missingMaterials); if (exported) { navigator.clipboard.writeText(exported); toast({ title: "Exported", description: "Missing materials copied to clipboard", duration: 2000, }); } else { toast({ title: "Nothing Missing", description: "All materials are satisfied for this job", duration: 2000, }); } }; const missingMaterials = calculateMissingMaterials(); return ( Materials Management