// Executive Drill-Down Router — unique modal per KPI slice
const { useState: edSt, useMemo: edMemo } = React;

// ── Revenue Drill ─────────────────────────────────────────────────────────
function RevenueDrill({ sales, onClose }) {
  const C = window.fmtCur;
  const byCustomer = edMemo(() => {
    const m = {};
    sales.forEach(s => {
      const k = s.customerId || 'Unknown';
      const name = Store.name('customers', k) || k;
      if (!m[k]) m[k] = { name, rev: 0, qty: 0, orders: 0 };
      m[k].rev += window.gAmt(s);
      m[k].qty += parseFloat(s.quantity) || 0;
      m[k].orders++;
    });
    return Object.values(m).sort((a, b) => b.rev - a.rev);
  }, [sales]);
  const byMaterial = edMemo(() => {
    const m = {};
    sales.forEach(s => {
      const k = s.materialId || 'Unknown';
      const name = Store.name('materials', k) || k;
      if (!m[k]) m[k] = { name, rev: 0, qty: 0, orders: 0 };
      m[k].rev += window.gAmt(s);
      m[k].qty += parseFloat(s.quantity) || 0;
      m[k].orders++;
    });
    return Object.values(m).sort((a, b) => b.rev - a.rev);
  }, [sales]);
  const totalRev = sales.reduce((s, o) => s + (window.gAmt(o)), 0);
  const totalQty = sales.reduce((s, o) => s + (parseFloat(o.quantity) || 0), 0);
  return (
    <window.DashDrillModal title="Revenue Analysis" subtitle="Customer-wise · Material-wise · Transaction detail" color="#22C55E" onClose={onClose} width={960}>
      <window.DashKPIs items={[
        ['Total Revenue', C(totalRev), '#22C55E'],
        ['Total Qty Sold', totalQty.toFixed(3) + ' T', 'var(--info)'],
        ['Sales Orders', sales.length, 'var(--or)'],
        ['Avg Order Value', sales.length > 0 ? C(Math.round(totalRev / sales.length)) : '—', 'var(--txt)'],
      ]} />
      <window.DashBTable title="Revenue by Customer" rows={byCustomer.slice(0, 20)}
        cols={[{ k: 'name', h: 'Customer' }, { k: 'rev', h: 'Revenue', r: true, b: true, cl: '#22C55E', f: v => C(v) }, { k: 'qty', h: 'Qty (T)', r: true, f: v => v.toFixed(3) }, { k: 'orders', h: 'Orders', r: true }]} />
      <window.DashBTable title="Revenue by Material" rows={byMaterial}
        cols={[{ k: 'name', h: 'Material' }, { k: 'rev', h: 'Revenue', r: true, b: true, cl: '#22C55E', f: v => C(v) }, { k: 'qty', h: 'Qty (T)', r: true, f: v => v.toFixed(3) }, { k: 'orders', h: 'Orders', r: true }]} />
    </window.DashDrillModal>
  );
}

// ── Purchase Cost Drill ───────────────────────────────────────────────────
function CostDrill({ purchases, onClose }) {
  const C = window.fmtCur;
  const byVendor = edMemo(() => {
    const m = {};
    purchases.forEach(p => {
      const k = p.vendorId || 'Unknown';
      const name = Store.name('vendors', k) || k;
      if (!m[k]) m[k] = { name, cost: 0, qty: 0, orders: 0 };
      m[k].cost += window.gAmt(p);
      m[k].qty += (p.items || []).reduce((s, i) => s + (parseFloat(i.quantity) || 0), 0);
      m[k].orders++;
    });
    return Object.values(m).sort((a, b) => b.cost - a.cost);
  }, [purchases]);
  const byMaterial = edMemo(() => {
    const m = {};
    purchases.forEach(p => (p.items || []).forEach(i => {
      const k = i.materialId || 'Unknown';
      const name = Store.name('materials', k) || k;
      if (!m[k]) m[k] = { name, cost: 0, qty: 0 };
      m[k].qty += parseFloat(i.quantity) || 0;
      m[k].cost += (parseFloat(i.quantity) || 0) * (parseFloat(i.ratePerTon) || 0);
    }));
    return Object.values(m).sort((a, b) => b.cost - a.cost);
  }, [purchases]);
  const totalCost = purchases.reduce((s, p) => s + (window.gAmt(p)), 0);
  const totalQty = purchases.reduce((s, p) => s + (p.items || []).reduce((a, i) => a + (parseFloat(i.quantity) || 0), 0), 0);
  return (
    <window.DashDrillModal title="Purchase Cost Analysis" subtitle="Vendor-wise · Material-wise · Cost breakdown" color="#F97316" onClose={onClose} width={960}>
      <window.DashKPIs items={[
        ['Total Cost', C(totalCost), '#F97316'],
        ['Qty Purchased', totalQty.toFixed(3) + ' T', 'var(--info)'],
        ['Purchase Orders', purchases.length, 'var(--ok)'],
        ['Avg Cost/T', totalQty > 0 ? C(Math.round(totalCost / totalQty)) : '—', 'var(--txt)'],
      ]} />
      <window.DashBTable title="Cost by Vendor" rows={byVendor.slice(0, 20)}
        cols={[{ k: 'name', h: 'Vendor' }, { k: 'cost', h: 'Cost', r: true, b: true, cl: '#F97316', f: v => C(v) }, { k: 'qty', h: 'Qty (T)', r: true, f: v => v.toFixed(3) }, { k: 'orders', h: 'Orders', r: true }]} />
      <window.DashBTable title="Cost by Material" rows={byMaterial}
        cols={[{ k: 'name', h: 'Material' }, { k: 'cost', h: 'Est. Cost', r: true, b: true, cl: '#F97316', f: v => C(v) }, { k: 'qty', h: 'Qty (T)', r: true, f: v => v.toFixed(3) }]} />
    </window.DashDrillModal>
  );
}

// ── Gross Profit Drill ────────────────────────────────────────────────────
function ProfitDrill({ purchases, sales, totalRev, totalCost, grossProfit, margin, totalSQty, onClose }) {
  const C = window.fmtCur;
  const byMaterial = edMemo(() => {
    const matRev = {}, matCost = {}, matQty = {};
    sales.forEach(s => {
      const k = s.materialId || 'unk';
      matRev[k] = (matRev[k] || 0) + (window.gAmt(s));
      matQty[k] = (matQty[k] || 0) + (parseFloat(s.quantity) || 0);
    });
    purchases.forEach(p => (p.items || []).forEach(i => {
      const k = i.materialId || 'unk';
      matCost[k] = (matCost[k] || 0) + (parseFloat(i.quantity) || 0) * (parseFloat(i.ratePerTon) || 0);
    }));
    const keys = new Set([...Object.keys(matRev), ...Object.keys(matCost)]);
    return [...keys].map(k => {
      const rev = matRev[k] || 0, cost = matCost[k] || 0, qty = matQty[k] || 0;
      const profit = rev - cost;
      return { name: Store.name('materials', k) || k, rev, cost, profit, qty, margin: rev > 0 ? (profit / rev * 100).toFixed(1) : '0.0' };
    }).filter(r => r.rev > 0 || r.cost > 0).sort((a, b) => b.profit - a.profit);
  }, [purchases, sales]);
  const ppt = totalSQty > 0 ? Math.round(grossProfit / totalSQty) : 0;
  return (
    <window.DashDrillModal title="Profitability Analysis" subtitle="Revenue vs Cost · Material-wise margin breakdown" color="#3B82F6" onClose={onClose} width={960}>
      <window.DashKPIs items={[
        ['Revenue', C(totalRev), '#22C55E'],
        ['Cost', C(totalCost), '#F97316'],
        ['Gross Profit', C(grossProfit), grossProfit >= 0 ? '#22C55E' : '#EF4444'],
        ['Margin', margin.toFixed(1) + '%', parseFloat(margin) >= 10 ? '#22C55E' : '#EF4444'],
      ]} />
      <window.DashBTable title="Profitability by Material" rows={byMaterial}
        cols={[
          { k: 'name', h: 'Material' },
          { k: 'rev', h: 'Revenue', r: true, cl: '#22C55E', f: v => C(v) },
          { k: 'cost', h: 'Cost', r: true, cl: '#F97316', f: v => C(v) },
          { k: 'profit', h: 'Profit', r: true, b: true, f: (v) => C(v) },
          { k: 'margin', h: 'Margin%', r: true, f: v => v + '%' },
          { k: 'qty', h: 'Qty (T)', r: true, f: v => v.toFixed(3) },
        ]} maxH={380} />
    </window.DashDrillModal>
  );
}

// ── Trips Drill ───────────────────────────────────────────────────────────
function TripsDrill({ purchases, sales, onClose }) {
  const C = window.fmtCur;
  const byVehicle = edMemo(() => {
    const m = {};
    [...purchases, ...sales].forEach(r => {
      const k = r.vehicleFull || '—';
      if (k === '—') return;
      if (!m[k]) m[k] = { name: k, trips: 0, qty: 0, transporter: r.transporter || '—' };
      m[k].trips++;
      m[k].qty += r.items ? (r.items || []).reduce((s, i) => s + (parseFloat(i.quantity) || 0), 0) : (parseFloat(r.quantity) || 0);
    });
    return Object.values(m).sort((a, b) => b.trips - a.trips);
  }, [purchases, sales]);
  const byTransporter = edMemo(() => {
    const m = {};
    [...purchases, ...sales].forEach(r => {
      const k = r.transporter || '—';
      if (k === '—') return;
      if (!m[k]) m[k] = { name: k, trips: 0, vehs: new Set() };
      m[k].trips++;
      if (r.vehicleFull) m[k].vehs.add(r.vehicleFull);
    });
    return Object.values(m).map(r => ({ ...r, vehs: r.vehs.size })).sort((a, b) => b.trips - a.trips);
  }, [purchases, sales]);
  return (
    <window.DashDrillModal title="Trip Analysis" subtitle="Purchase trips · Sales trips · Vehicle & transporter breakdown" color="var(--info)" onClose={onClose} width={960}>
      <window.DashKPIs items={[
        ['Total Trips', purchases.length + sales.length, 'var(--info)'],
        ['Purchase Trips', purchases.length, '#F97316'],
        ['Sales Trips', sales.length, '#22C55E'],
        ['Active Vehicles', byVehicle.length, 'var(--txt)'],
      ]} />
      <window.DashBTable title="Vehicle Activity" rows={byVehicle.slice(0, 30)}
        cols={[{ k: 'name', h: 'Vehicle', mono: true }, { k: 'trips', h: 'Trips', r: true, b: true, cl: 'var(--info)' }, { k: 'qty', h: 'Qty (T)', r: true, f: v => v.toFixed(3) }, { k: 'transporter', h: 'Transporter' }]} maxH={260} />
      <window.DashBTable title="Transporter Summary" rows={byTransporter.slice(0, 20)}
        cols={[{ k: 'name', h: 'Transporter' }, { k: 'trips', h: 'Trips', r: true, b: true, cl: 'var(--info)' }, { k: 'vehs', h: 'Vehicles', r: true }]} />
    </window.DashDrillModal>
  );
}

// ── Tons Purchased Drill ──────────────────────────────────────────────────
function TonsPurchasedDrill({ purchases, onClose }) {
  const C = window.fmtCur;
  const byMaterial = edMemo(() => {
    const m = {};
    purchases.forEach(p => (p.items || []).forEach(i => {
      const k = i.materialId || 'unk';
      if (!m[k]) m[k] = { name: Store.name('materials', k) || k, qty: 0, cost: 0, orders: 0 };
      m[k].qty += parseFloat(i.quantity) || 0;
      m[k].cost += (parseFloat(i.quantity) || 0) * (parseFloat(i.ratePerTon) || 0);
      m[k].orders++;
    }));
    return Object.values(m).sort((a, b) => b.qty - a.qty);
  }, [purchases]);
  const totalQty = byMaterial.reduce((s, r) => s + r.qty, 0);
  return (
    <window.DashDrillModal title="Tons Purchased" subtitle="Material-wise qty breakdown · vendor supply analysis" color="#F97316" onClose={onClose} width={880}>
      <window.DashKPIs items={[['Total Purchased', totalQty.toFixed(3) + ' T', '#F97316'], ['Orders', purchases.length, 'var(--info)'], ['Materials', byMaterial.length, 'var(--ok)'], ['Avg/Order', purchases.length > 0 ? (totalQty / purchases.length).toFixed(3) + ' T' : '—', 'var(--txt)']]} />
      <window.DashBTable title="Qty by Material" rows={byMaterial}
        cols={[{ k: 'name', h: 'Material' }, { k: 'qty', h: 'Qty (T)', r: true, b: true, cl: '#F97316', f: v => v.toFixed(3) }, { k: 'cost', h: 'Est. Cost', r: true, f: v => C(v) }, { k: 'orders', h: 'Orders', r: true }]} />
    </window.DashDrillModal>
  );
}

// ── Tons Sold Drill ───────────────────────────────────────────────────────
function TonsSoldDrill({ sales, onClose }) {
  const C = window.fmtCur;
  const byMaterial = edMemo(() => {
    const m = {};
    sales.forEach(s => {
      const k = s.materialId || 'unk';
      if (!m[k]) m[k] = { name: Store.name('materials', k) || k, qty: 0, rev: 0, orders: 0 };
      m[k].qty += parseFloat(s.quantity) || 0;
      m[k].rev += window.gAmt(s);
      m[k].orders++;
    });
    return Object.values(m).sort((a, b) => b.qty - a.qty);
  }, [sales]);
  const totalQty = sales.reduce((s, o) => s + (parseFloat(o.quantity) || 0), 0);
  return (
    <window.DashDrillModal title="Tons Sold" subtitle="Material-wise qty sold · customer analysis" color="#3B82F6" onClose={onClose} width={880}>
      <window.DashKPIs items={[['Total Sold', totalQty.toFixed(3) + ' T', '#3B82F6'], ['Orders', sales.length, 'var(--info)'], ['Materials', byMaterial.length, 'var(--ok)'], ['Avg/Order', sales.length > 0 ? (totalQty / sales.length).toFixed(3) + ' T' : '—', 'var(--txt)']]} />
      <window.DashBTable title="Qty by Material" rows={byMaterial}
        cols={[{ k: 'name', h: 'Material' }, { k: 'qty', h: 'Qty (T)', r: true, b: true, cl: '#3B82F6', f: v => v.toFixed(3) }, { k: 'rev', h: 'Revenue', r: true, cl: '#22C55E', f: v => C(v) }, { k: 'orders', h: 'Orders', r: true }]} />
    </window.DashDrillModal>
  );
}

// ── Material Slice Drill ──────────────────────────────────────────────────
function MaterialSliceDrill({ label, sales, purchases, onClose }) {
  const C = window.fmtCur;
  const mat = Store.all('materials').find(m => m.name === label);
  const matId = mat?.id;
  const matSales = edMemo(() => matId ? sales.filter(s => s.materialId === matId) : [], [matId, sales]);
  const matPurchases = edMemo(() => matId ? purchases.filter(p => (p.items || []).some(i => i.materialId === matId)) : [], [matId, purchases]);
  const rev = matSales.reduce((s, o) => s + (window.gAmt(o)), 0);
  const qty = matSales.reduce((s, o) => s + (parseFloat(o.quantity) || 0), 0);
  const cost = matPurchases.reduce((s, p) => s + (p.items || []).filter(i => i.materialId === matId).reduce((a, i) => a + (parseFloat(i.quantity) || 0) * (parseFloat(i.ratePerTon) || 0), 0), 0);
  const byCust = edMemo(() => { const m = {}; matSales.forEach(s => { const k = Store.name('customers', s.customerId) || '—'; if (!m[k]) m[k] = { name: k, qty: 0, rev: 0 }; m[k].qty += parseFloat(s.quantity) || 0; m[k].rev += window.gAmt(s); }); return Object.values(m).sort((a, b) => b.rev - a.rev); }, [matSales]);
  return (
    <window.DashDrillModal title={`${label}`} subtitle="Material drill-down — revenue, cost, customers" color="#F97316" onClose={onClose} width={900}>
      <window.DashKPIs items={[['Revenue', C(rev), '#22C55E'], ['Est. Cost', C(cost), '#F97316'], ['Gross Profit', C(rev - cost), rev - cost >= 0 ? '#22C55E' : '#EF4444'], ['Qty Sold', qty.toFixed(3) + ' T', 'var(--info)']]} />
      <window.DashBTable title="Customer Breakdown" rows={byCust}
        cols={[{ k: 'name', h: 'Customer' }, { k: 'qty', h: 'Qty (T)', r: true, b: true, f: v => v.toFixed(3) }, { k: 'rev', h: 'Revenue', r: true, cl: '#22C55E', f: v => C(v) }]} />
    </window.DashDrillModal>
  );
}

// ── Customer Slice Drill ──────────────────────────────────────────────────
function CustomerSliceDrill({ label, customerId, sales, onClose }) {
  const C = window.fmtCur;
  const cuSales = edMemo(() => customerId ? sales.filter(s => s.customerId === customerId) : [], [customerId, sales]);
  const byMat = edMemo(() => { const m = {}; cuSales.forEach(s => { const k = Store.name('materials', s.materialId) || '—'; if (!m[k]) m[k] = { name: k, qty: 0, rev: 0, orders: 0 }; m[k].qty += parseFloat(s.quantity) || 0; m[k].rev += window.gAmt(s); m[k].orders++; }); return Object.values(m).sort((a, b) => b.rev - a.rev); }, [cuSales]);
  const totalRev = cuSales.reduce((s, o) => s + (window.gAmt(o)), 0);
  const totalQty = cuSales.reduce((s, o) => s + (parseFloat(o.quantity) || 0), 0);
  return (
    <window.DashDrillModal title={label} subtitle="Customer revenue breakdown by material" color="#7C3AED" onClose={onClose} width={900}>
      <window.DashKPIs items={[['Revenue', C(totalRev), '#7C3AED'], ['Qty', totalQty.toFixed(3) + ' T', 'var(--info)'], ['Orders', cuSales.length, 'var(--ok)'], ['Avg Order', cuSales.length > 0 ? C(Math.round(totalRev / cuSales.length)) : '—', 'var(--txt)']]} />
      <window.DashBTable title="Materials Purchased" rows={byMat}
        cols={[{ k: 'name', h: 'Material' }, { k: 'qty', h: 'Qty (T)', r: true, b: true, f: v => v.toFixed(3) }, { k: 'rev', h: 'Revenue', r: true, cl: '#7C3AED', f: v => C(v) }, { k: 'orders', h: 'Orders', r: true }]} />
    </window.DashDrillModal>
  );
}

// ── Vendor Slice Drill ────────────────────────────────────────────────────
function VendorSliceDrill({ label, vendorId, purchases, onClose }) {
  const C = window.fmtCur;
  const vP = edMemo(() => vendorId ? purchases.filter(p => p.vendorId === vendorId) : [], [vendorId, purchases]);
  const byMat = edMemo(() => { const m = {}; vP.forEach(p => (p.items || []).forEach(i => { const k = Store.name('materials', i.materialId) || '—'; if (!m[k]) m[k] = { name: k, qty: 0, cost: 0 }; m[k].qty += parseFloat(i.quantity) || 0; m[k].cost += (parseFloat(i.quantity) || 0) * (parseFloat(i.ratePerTon) || 0); })); return Object.values(m).sort((a, b) => b.qty - a.qty); }, [vP]);
  const totalQty = byMat.reduce((s, r) => s + r.qty, 0);
  const totalCost = vP.reduce((s, p) => s + (window.gAmt(p)), 0);
  return (
    <window.DashDrillModal title={`${label}`} subtitle="Vendor supply breakdown by material" color="#B45309" onClose={onClose} width={900}>
      <window.DashKPIs items={[['Total Cost', C(totalCost), '#B45309'], ['Total Qty', totalQty.toFixed(3) + ' T', 'var(--ok)'], ['Purchases', vP.length, 'var(--info)'], ['Materials', byMat.length, 'var(--or)']]} />
      <window.DashBTable title="Materials Supplied" rows={byMat}
        cols={[{ k: 'name', h: 'Material' }, { k: 'qty', h: 'Qty (T)', r: true, b: true, cl: '#B45309', f: v => v.toFixed(3) }, { k: 'cost', h: 'Est. Cost', r: true, f: v => C(v) }]} />
    </window.DashDrillModal>
  );
}

// ── Profit Per Ton Drill ──────────────────────────────────────────────────
function ProfitPerTonDrill({ purchases, sales, onClose }) {
  const C = window.fmtCur;
  const rows = edMemo(() => {
    const matRev = {}, matCost = {}, matQty = {};
    sales.forEach(s => { const k = s.materialId || 'unk'; matRev[k] = (matRev[k] || 0) + (window.gAmt(s)); matQty[k] = (matQty[k] || 0) + (parseFloat(s.quantity) || 0); });
    purchases.forEach(p => (p.items || []).forEach(i => { const k = i.materialId || 'unk'; matCost[k] = (matCost[k] || 0) + (parseFloat(i.quantity) || 0) * (parseFloat(i.ratePerTon) || 0); }));
    return [...new Set([...Object.keys(matRev)])].map(k => {
      const rev = matRev[k] || 0, cost = matCost[k] || 0, qty = matQty[k] || 0;
      const profit = rev - cost;
      const ppt = qty > 0 ? Math.round(profit / qty) : 0;
      return { name: Store.name('materials', k) || k, rev, cost, profit, qty, ppt };
    }).filter(r => r.qty > 0).sort((a, b) => b.ppt - a.ppt);
  }, [purchases, sales]);
  return (
    <window.DashDrillModal title="₹ Profit Per Ton" subtitle="Profitability ranking per metric tonne by material" color="#22C55E" onClose={onClose} width={880}>
      <window.DashBTable title="Profit/Ton by Material" rows={rows}
        cols={[{ k: 'name', h: 'Material' }, { k: 'ppt', h: '₹/Ton', r: true, b: true, cl: '#22C55E', f: v => C(v) }, { k: 'profit', h: 'Total Profit', r: true, f: v => C(v) }, { k: 'qty', h: 'Qty (T)', r: true, f: v => v.toFixed(3) }, { k: 'rev', h: 'Revenue', r: true, f: v => C(v) }]} maxH={400} />
    </window.DashDrillModal>
  );
}

// ── Diesel Drill ──────────────────────────────────────────────────────────
function DieselDrill({ companyId, onClose }) {
  const C = window.fmtCur;
  const [, setT] = edSt(0);
  const recs = Store.all('dieselRecords', companyId);
  const bySource = edMemo(() => { const m = {}; recs.forEach(r => { const k = r.dieselSource || r.sourceId || 'Unknown'; if (!m[k]) m[k] = { name: k, amount: 0, liters: 0, fills: 0 }; m[k].amount += parseFloat(r.amount) || 0; m[k].liters += parseFloat(r.liters) || 0; m[k].fills++; }); return Object.values(m).sort((a, b) => b.amount - a.amount); }, [recs]);
  const totalAmt = recs.reduce((s, r) => s + (parseFloat(r.amount) || 0), 0);
  const totalLit = recs.reduce((s, r) => s + (parseFloat(r.liters) || 0), 0);
  return (
    <window.DashDrillModal title="Diesel Cost" subtitle="Source-wise breakdown · liters · amount" color="#F59E0B" onClose={onClose} width={820}>
      <window.DashKPIs items={[['Total Cost', C(totalAmt), '#F59E0B'], ['Total Liters', window.formatQuantity(totalLit) + ' L', 'var(--info)'], ['Fill-Ups', recs.length, 'var(--ok)'], ['₹/Liter', totalLit > 0 ? C(Math.round(totalAmt / totalLit)) : '—', 'var(--txt)']]} />
      {bySource.length > 0 && <window.DashBTable title="By Source" rows={bySource}
        cols={[{ k: 'name', h: 'Source' }, { k: 'amount', h: 'Amount', r: true, b: true, cl: '#F59E0B', f: v => C(v) }, { k: 'liters', h: 'Liters', r: true, f: v => window.formatQuantity(v) }, { k: 'fills', h: 'Fill-Ups', r: true }]} />}
      {recs.length === 0 && <div style={{ textAlign: 'center', padding: '24px 0', color: 'var(--txt3)', fontSize: 12 }}>No diesel records in selected period.</div>}
    </window.DashDrillModal>
  );
}

// ── Router: picks the right modal based on drill.key ─────────────────────
function ExecDrillRouter({ drill, purchases, sales, allMaterials, totalRev, totalCost, grossProfit, margin, totalSQty, onClose }) {
  if (!drill) return null;
  const k = drill.key || '';

  if (k === 'revenue')       return <RevenueDrill sales={sales} onClose={onClose} />;
  if (k === 'cost')          return <CostDrill purchases={purchases} onClose={onClose} />;
  if (k === 'grossProfit')   return <ProfitDrill purchases={purchases} sales={sales} totalRev={totalRev} totalCost={totalCost} grossProfit={grossProfit} margin={margin} totalSQty={totalSQty} onClose={onClose} />;
  if (k === 'profitPerTon')  return <ProfitPerTonDrill purchases={purchases} sales={sales} onClose={onClose} />;
  if (k === 'diesel')        return <DieselDrill companyId={Store.currentCompanyId} onClose={onClose} />;
  if (k === 'tonsPurchased' || k === 'purchaseTrips') return <TonsPurchasedDrill purchases={purchases} onClose={onClose} />;
  if (k === 'tonsSold'      || k === 'salesTrips')    return <TonsSoldDrill sales={sales} onClose={onClose} />;
  if (k === 'totalTrips' || k.startsWith('trip'))     return <TripsDrill purchases={purchases} sales={sales} onClose={onClose} />;
  if (k.startsWith('mat_'))  return <MaterialSliceDrill label={drill.label} sales={sales} purchases={purchases} onClose={onClose} />;
  if (k === 'customer')      return <CustomerSliceDrill label={drill.label} customerId={drill.customerId} sales={sales} onClose={onClose} />;
  if (k === 'vendor')        return <VendorSliceDrill label={drill.label} vendorId={drill.vendorId} purchases={purchases} onClose={onClose} />;

  return null;
}

window.ExecDrillRouter = ExecDrillRouter;
