import React, { useState, useEffect } from 'react'; import { X, Calculator, FileText } from 'lucide-react'; export default function MaterialDetailsModal({ isOpen, onClose, item, onSave }) { const [measurement, setMeasurement] = useState(item?.baseMeasurement || 0); const [wastePercent, setWastePercent] = useState(item?.wastePercent || 0); const [conversionFactor, setConversionFactor] = useState(item?.conversionFactor || 1); const [unitCost, setUnitCost] = useState(item?.unitCost || 0); const [marginPercent, setMarginPercent] = useState(item?.marginPercent || 30); const [pricePerUnitOverride, setPricePerUnitOverride] = useState(false); const [manualPricePerUnit, setManualPricePerUnit] = useState(0); const [calculatedQuantity, setCalculatedQuantity] = useState(0); const [finalTotalUnits, setFinalTotalUnits] = useState(0); const [totalCost, setTotalCost] = useState(0); const [clientPrice, setClientPrice] = useState(0); useEffect(() => { if (item) { setMeasurement(item.baseMeasurement || 0); setWastePercent(item.wastePercent || 0); setConversionFactor(item.conversionFactor || 1); setUnitCost(item.unitCost || 0); setMarginPercent(item.marginPercent || 30); } }, [item]); useEffect(() => { const withWaste = measurement * (1 + (wastePercent / 100)); const computedQty = conversionFactor > 0 ? (withWaste / conversionFactor) : withWaste; setCalculatedQuantity(computedQty); const finalUnits = Math.ceil(computedQty); setFinalTotalUnits(finalUnits); const cost = finalUnits * unitCost; setTotalCost(cost); if (marginPercent < 100) { setClientPrice(cost / (1 - (marginPercent / 100))); } else { setClientPrice(cost); } }, [measurement, wastePercent, conversionFactor, unitCost, marginPercent]); const computedPricePerUnit = finalTotalUnits > 0 ? clientPrice / finalTotalUnits : 0; const handleSave = () => { onSave({ ...item, baseMeasurement: measurement, wastePercent, conversionFactor, unitCost, marginPercent, qty: finalTotalUnits, clientPrice }); onClose(); }; if (!isOpen || !item) return null; const measurementUomLabel = item.measurementUom || item.uom; const showConversion = conversionFactor > 1 || (item.measurementUom && item.measurementUom !== item.uom); const conversionNote = showConversion ? `${conversionFactor} ${measurementUomLabel} = 1 ${item.uom}` : `1 ${item.uom} = 1 ${item.uom}`; return (
e.stopPropagation()} > {/* Header */}

Material Details

{/* Sub-header: item name + name input + add description */}

{item.desc}

{/* Main Content */}
{/* Row 1: Measurement @ Waste = Quantity */}
{/* Measurement */}
setMeasurement(parseFloat(e.target.value) || 0)} className="w-24 bg-white dark:bg-zinc-800 border border-zinc-300 dark:border-zinc-600 rounded px-3 py-2 text-sm font-mono text-zinc-800 dark:text-zinc-200 outline-none focus:border-blue-400 focus:ring-1 focus:ring-blue-400" /> {measurementUomLabel}
@ {/* Waste */}
setWastePercent(parseFloat(e.target.value) || 0)} placeholder="0" className="w-12 bg-transparent outline-none text-sm font-mono text-zinc-800 dark:text-zinc-200 text-right" /> %
= {/* Quantity (read-only, post-waste pre-ceil) */}
{calculatedQuantity.toFixed(2)}
{item.uom}
{/* Row 2: Cost/Unit | Price/Unit */}
{/* Cost/Unit */}
$ setUnitCost(parseFloat(e.target.value) || 0)} className="w-20 px-2 py-2 text-sm font-mono text-zinc-800 dark:text-zinc-200 bg-white dark:bg-zinc-900 outline-none text-right" />
/ {item.uom}
{/* Conversion note */}

{conversionNote}

{/* Editable conversion factor (small, subtle) */}
setConversionFactor(parseFloat(e.target.value) || 1)} className="w-10 border-b border-zinc-200 dark:border-zinc-600 bg-transparent outline-none text-center font-mono focus:border-blue-400 text-zinc-500 dark:text-zinc-400" /> {measurementUomLabel} = 1 {item.uom}
{/* Price/Unit checkbox */}
$ {pricePerUnitOverride ? ( setManualPricePerUnit(parseFloat(e.target.value) || 0)} className="w-20 px-2 py-2 text-sm font-mono text-zinc-800 dark:text-zinc-200 bg-white dark:bg-zinc-900 outline-none text-right" /> ) : ( {computedPricePerUnit.toFixed(2)} )}
/ {item.uom}
{/* Row 3: Total summary formula */}
{/* Total */}
{finalTotalUnits} {item.uom}
× {/* Cost/Unit summary */}
${unitCost.toFixed(2)} / {item.uom}
@ {/* Section Margin */}
setMarginPercent(parseFloat(e.target.value) || 0)} className="w-14 border-b-2 border-zinc-300 dark:border-zinc-600 bg-transparent outline-none text-center font-mono text-base text-zinc-700 dark:text-zinc-300 focus:border-blue-500 pb-1" /> %
= {/* Price result */}
${clientPrice.toFixed(2)}
{/* Footer */}
); }