// OM Group Level 0 — Consolidated Group Dashboard with Drill-Down Intelligence
const { useState: gSt, useEffect: gEf, useContext: gCtx, useMemo: gMemo } = React;
const AppCtx = window.AppCtx;

function grpRange(preset, cFrom, cTo) {
  const now=new Date(), tod=now.toISOString().slice(0,10);
  const yst=new Date(now-86400000).toISOString().slice(0,10);
  if(preset==='today')     return {from:tod,to:tod};
  if(preset==='yesterday') return {from:yst,to:yst};
  if(preset==='week')      {const s=new Date(now);s.setDate(now.getDate()-now.getDay());return {from:s.toISOString().slice(0,10),to:tod};}
  if(preset==='month')     return {from:`${tod.slice(0,7)}-01`,to:tod};
  if(preset==='custom')    return {from:cFrom||tod,to:cTo||tod};
  return {from:null,to:null};
}
function grpIn(d,from,to){if(!d)return false;if(from&&d<from)return false;if(to&&d>to)return false;return true;}

const CO_COLORS=['#F97316','#3B82F6','#22C55E','#F59E0B','#8B5CF6','#EC4899','#14B8A6'];

// Clickable KPI card
function GKpi({label,value,sub,color,span,onClick,tooltip}){
  const accentColor = color || 'var(--txt)';
  const iconName = window.KPI_ICON_MAP && window.KPI_ICON_MAP[label];
  const bgTint = window.getIconBg ? window.getIconBg(accentColor) : 'rgba(249,115,22,0.07)';
  return (
    <div className="kpi"
      onClick={onClick}
      title={onClick?(tooltip||`View ${label} Analysis`):undefined}
      style={{...(span?{gridColumn:`span ${span}`}:{}),cursor:onClick?'pointer':'default',userSelect:'none'}}>
      {window.LucideIcon && iconName && (
        <div className="kpi-ic-wrap" style={{ background: bgTint }}>
          <window.LucideIcon name={iconName} size={22} strokeWidth={2} color={accentColor} />
        </div>
      )}
      <div className="kpi-lbl">{label}</div>
      <div className="kpi-val" style={{color:accentColor}}>{value}</div>
      {sub&&<div className="kpi-sub">{sub}</div>}
    </div>
  );
}

function MiniBar({pct,color}){
  const p = Math.min(100, Math.max(0, pct||0));
  return (
    <window.PremiumProgress pct={p} color={color||'var(--or)'} height={6} style={{flex:1,minWidth:0}} />
  );
}

// ── Total Trips All-Module Comprehensive Drill-Down ─────────────────────
function TotalTripsAllDrill({ allTripsUnified, companies, onClose }) {
  const [fMod,setFMod]=gSt('');const [fCo,setFCo]=gSt('');const [fVeh,setFVeh]=gSt('');const [fTr,setFTr]=gSt('');const [fMat,setFMat]=gSt('');
  const [tab,setTab]=gSt('overview');

  const allMods=gMemo(()=>[...new Set(allTripsUnified.map(t=>t.module))].sort(),[allTripsUnified]);
  const allVehs=gMemo(()=>[...new Set(allTripsUnified.map(t=>t.vehicle).filter(v=>v&&v!=='—'))].sort(),[allTripsUnified]);
  const allTrns=gMemo(()=>[...new Set(allTripsUnified.map(t=>t.transporter).filter(v=>v&&v!=='—'))].sort(),[allTripsUnified]);
  const allMats=gMemo(()=>[...new Set(allTripsUnified.map(t=>t.material).filter(v=>v&&v!=='—'))].sort(),[allTripsUnified]);

  const trips=gMemo(()=>allTripsUnified.filter(t=>
    (!fMod||t.module===fMod)&&(!fCo||t.companyId===fCo)&&(!fVeh||t.vehicle===fVeh)&&(!fTr||t.transporter===fTr)&&(!fMat||t.material===fMat)
  ),[allTripsUnified,fMod,fCo,fVeh,fTr,fMat]);

  const tQty=gMemo(()=>trips.reduce((s,t)=>s+(t.qty||0),0),[trips]);
  const uVeh=gMemo(()=>new Set(trips.map(t=>t.vehicle).filter(v=>v&&v!=='—')).size,[trips]);
  const uTr =gMemo(()=>new Set(trips.map(t=>t.transporterId||t.transporter).filter(v=>v&&v!=='—')).size,[trips]);

  function grp(field){
    const m={};
    trips.forEach(t=>{
      const k=(field==='company'?t.company:t[field])||'—';
      if(!k||k==='—')return;
      if(!m[k])m[k]={label:k,companyId:t.companyId,trips:0,qty:0};
      m[k].trips++;m[k].qty+=t.qty||0;
    });
    return Object.values(m).sort((a,b)=>b.trips-a.trips);
  }

  const byMod =gMemo(()=>grp('module'),[trips]);
  const byCo  =gMemo(()=>grp('company'),[trips]);
  const byVeh =gMemo(()=>grp('vehicle'),[trips]);
  const byTr  =gMemo(()=>grp('transporter'),[trips]);
  const byMat =gMemo(()=>grp('material'),[trips]);
  const byDate=gMemo(()=>{const m={};trips.forEach(t=>{const d=(t.date||'').slice(0,7);if(!d)return;if(!m[d])m[d]={label:d,trips:0,qty:0};m[d].trips++;m[d].qty+=t.qty||0;});return Object.values(m).sort((a,b)=>a.label.localeCompare(b.label));},[trips]);

  const afCnt=[fMod,fCo,fVeh,fTr,fMat].filter(Boolean).length;
  const MC={'Purchase':'var(--or)','Sale':'var(--ok)','Delivery Movement':'var(--info)','Stockyard Movement':'#8B5CF6','Internal Transfer':'#F59E0B','Debris Movement':'#6B7280'};
  const mc=mod=>MC[mod]||'var(--txt2)';
  const tTot={label:'TOTAL',trips:trips.length,qty:tQty};
  const pctCol={k:'trips',h:'% Share',r:true,f:v=>trips.length?((v/trips.length)*100).toFixed(1)+'%':'—'};

  function T(rows,cols,tot,maxH){
    return (
      <div style={{border:'1px solid var(--bdr)',borderRadius:4,overflow:'hidden',marginBottom:14}}>
        <div style={{overflowX:'auto',...(maxH?{overflowY:'auto',maxHeight:maxH}:{})}}>
          <table style={{width:'100%',borderCollapse:'collapse',fontSize:12}}>
            <thead><tr>{cols.map((c,i)=><th key={i} style={{padding:'6px 10px',textAlign:c.r?'right':'left',fontWeight:600,fontSize:11,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'.03em',whiteSpace:'nowrap',borderBottom:'1px solid var(--bdr)',background:'#F9FAFB',position:'sticky',top:0,zIndex:2}}>{c.h}</th>)}</tr></thead>
            <tbody>
              {rows.length===0
                ?<tr><td colSpan={cols.length} style={{padding:24,textAlign:'center',color:'var(--txt3)',fontSize:12}}>No data</td></tr>
                :rows.map((row,ri)=>(
                  <tr key={ri} style={{borderBottom:'1px solid #F3F4F6'}}>
                    {cols.map((c,ci)=>(
                      <td key={ci} style={{padding:'5px 10px',textAlign:c.r?'right':'left',fontWeight:c.b?600:400,color:c.cl||'var(--txt)',whiteSpace:'nowrap',fontFamily:'var(--font)',fontSize:c.mono?11:12}}>
                        {c.f?c.f(row[c.k]):(row[c.k]||'—')}
                      </td>
                    ))}
                  </tr>
                ))
              }
            </tbody>
            {tot&&rows.length>0&&(
              <tfoot>
                <tr style={{background:'#F9FAFB'}}>
                  {cols.map((c,i)=>(
                    <td key={i} style={{padding:'7px 10px',textAlign:c.r?'right':'left',fontWeight:700,color:c.cl||'var(--txt)',whiteSpace:'nowrap',borderTop:'2px solid var(--bdr)',fontFamily:'var(--font)'}}>
                      {c.f?c.f(tot[c.k]):(tot[c.k]||'')}
                    </td>
                  ))}
                </tr>
              </tfoot>
            )}
          </table>
        </div>
      </div>
    );
  }

  const TABS=[
    {id:'overview',l:'Overview'},{id:'by-module',l:'By Module'},{id:'by-company',l:'By Company'},
    {id:'by-vehicle',l:'By Vehicle'},{id:'by-trans',l:'By Transporter'},{id:'by-material',l:'By Material'},
    {id:'date-trend',l:'Date Trend'},{id:'full-log',l:'Full Log'},
  ];

  return (
    <window.DashDrillModal title={`Total Trips — ${trips.length.toLocaleString()} Across All Modules`} subtitle={`${allMods.join(' · ')}${afCnt>0?` · ${afCnt} filter${afCnt>1?'s':''} active`:''}`} color="var(--info)" onClose={onClose} width={1060}>

      {/* ── Filters ── */}
      <div style={{background:'#F9FAFB',border:'1px solid var(--bdr)',borderRadius:4,padding:'10px 12px',marginBottom:12,display:'flex',gap:8,flexWrap:'wrap',alignItems:'flex-end'}}>
        <div style={{display:'flex',flexDirection:'column',gap:3}}>
          <label style={{fontSize:10,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'.03em'}}>Module</label>
          <window.FiltSelect placeholder="All Modules" value={fMod} onChange={v=>setFMod(v)} style={{minWidth:130}} options={allMods.map(m=>({value:m,label:m}))}/>
        </div>
        <div style={{display:'flex',flexDirection:'column',gap:3}}>
          <label style={{fontSize:10,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'.03em'}}>Company</label>
          <window.FiltSelect placeholder="All Companies" value={fCo} onChange={v=>setFCo(v)} style={{minWidth:140}} options={companies.map(c=>({value:c.id,label:c.name}))}/>
        </div>
        <div style={{display:'flex',flexDirection:'column',gap:3}}>
          <label style={{fontSize:10,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'.03em'}}>Vehicle</label>
          <window.FiltSelect placeholder="All Vehicles" value={fVeh} onChange={v=>setFVeh(v)} style={{minWidth:130}} options={allVehs.map(v=>({value:v,label:v}))}/>
        </div>
        <div style={{display:'flex',flexDirection:'column',gap:3}}>
          <label style={{fontSize:10,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'.03em'}}>Transporter</label>
          <window.FiltSelect placeholder="All Transporters" value={fTr} onChange={v=>setFTr(v)} style={{minWidth:140}} options={allTrns.map(t=>({value:t,label:t}))}/>
        </div>
        <div style={{display:'flex',flexDirection:'column',gap:3}}>
          <label style={{fontSize:10,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'.03em'}}>Material</label>
          <window.FiltSelect placeholder="All Materials" value={fMat} onChange={v=>setFMat(v)} style={{minWidth:120}} options={allMats.map(m=>({value:m,label:m}))}/>
        </div>
        {afCnt>0&&(
          <button className="btn btn-gh btn-sm" onClick={()=>{setFMod('');setFCo('');setFVeh('');setFTr('');setFMat('');}} style={{alignSelf:'flex-end',height:30}}>
            <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" style={{display:'inline',verticalAlign:'-1px',marginRight:4}}><path d="M18 6L6 18M6 6l12 12"/></svg>Clear {afCnt} filter{afCnt>1?'s':''}
          </button>
        )}
        <span style={{marginLeft:'auto',alignSelf:'flex-end',fontSize:11.5,color:'var(--txt2)'}}>
          {trips.length} trips · {window.formatQuantity(tQty)} T
        </span>
      </div>

      {/* ── KPIs ── */}
      <window.DashKPIs items={[
        ['Total Trips',trips.length,'var(--info)'],
        ['Total Qty Moved',window.formatQuantity(tQty)+' T','var(--ok)'],
        ['Active Modules',allMods.length,'var(--or)'],
        ['Unique Vehicles',uVeh,'var(--txt2)'],
        ['Active Transporters',uTr,'var(--txt2)'],
        ['Avg Qty / Trip',trips.length>0?(tQty/trips.length).toFixed(3)+' T':'—','var(--txt)'],
      ]}/>

      {/* ── Tabs ── */}
      <div style={{display:'flex',gap:4,marginBottom:14,flexWrap:'wrap',borderBottom:'1px solid var(--bdr)',paddingBottom:8}}>
        {TABS.map(t=>(
          <button key={t.id} className={`btn btn-sm ${tab===t.id?'btn-or':'btn-wh'}`} onClick={()=>setTab(t.id)} style={{fontSize:11}}>{t.l}</button>
        ))}
      </div>

      {/* ── Overview ── */}
      {tab==='overview'&&(
        <div>
          <div style={{fontWeight:600,fontSize:12,marginBottom:8}}>Module Distribution</div>
          <div className="dd-3col" style={{marginBottom:16}}>
            {byMod.map(m=>(
              <div key={m.label} style={{background:'#fff',border:'1px solid var(--bdr)',borderRadius:4,padding:'10px 13px',borderLeft:`3px solid ${mc(m.label)}`}}>
                <div style={{fontSize:12,fontWeight:700,color:mc(m.label),marginBottom:2}}>{m.label}</div>
                <div className="kpi-val" style={{fontSize:20,fontWeight:700,color:'var(--txt)',lineHeight:1.1}}>{m.trips}</div>
                <div style={{fontSize:11,color:'var(--txt2)',marginTop:3}}>{window.formatQuantity(m.qty)} T · {trips.length>0?((m.trips/trips.length)*100).toFixed(1):'0'}% of total</div>
              </div>
            ))}
            {byMod.length===0&&<div style={{gridColumn:'1/-1',textAlign:'center',color:'var(--txt3)',padding:24,fontSize:12}}>No trip data for selected filters</div>}
          </div>
          <div className="dd-2col">
            <div>
              <div style={{fontWeight:600,fontSize:12,marginBottom:6}}>By Company</div>
              {T(byCo.slice(0,8),[{k:'label',h:'Company',b:true},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--info)'},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)}],tTot)}
            </div>
            <div>
              <div style={{fontWeight:600,fontSize:12,marginBottom:6}}>By Material</div>
              {T(byMat.slice(0,8),[{k:'label',h:'Material'},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--or)'},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)}],{label:'TOTAL',trips:byMat.reduce((s,r)=>s+r.trips,0),qty:byMat.reduce((s,r)=>s+r.qty,0)})}
            </div>
          </div>
        </div>
      )}

      {/* ── By Module ── */}
      {tab==='by-module'&&T(byMod,
        [{k:'label',h:'Module',b:true},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--info)'},{k:'qty',h:'Qty (T)',r:true,f:v=>v.toFixed(3)},pctCol],
        tTot
      )}

      {/* ── By Company ── */}
      {tab==='by-company'&&T(byCo,
        [{k:'label',h:'Company',b:true},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--info)'},{k:'qty',h:'Qty (T)',r:true,f:v=>v.toFixed(3)},pctCol],
        tTot
      )}

      {/* ── By Vehicle ── */}
      {tab==='by-vehicle'&&T(byVeh,
        [{k:'label',h:'Vehicle No.',b:true,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)}],
        {label:'TOTAL',trips:byVeh.reduce((s,r)=>s+r.trips,0),qty:byVeh.reduce((s,r)=>s+r.qty,0)},
        400
      )}

      {/* ── By Transporter ── */}
      {tab==='by-trans'&&T(byTr,
        [{k:'label',h:'Transporter',b:true},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--info)'},{k:'qty',h:'Qty (T)',r:true,f:v=>v.toFixed(3)}],
        {label:'TOTAL',trips:byTr.reduce((s,r)=>s+r.trips,0),qty:byTr.reduce((s,r)=>s+r.qty,0)},
        400
      )}

      {/* ── By Material ── */}
      {tab==='by-material'&&T(byMat,
        [{k:'label',h:'Material',b:true},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--or)'},{k:'qty',h:'Qty (T)',r:true,f:v=>v.toFixed(3)}],
        {label:'TOTAL',trips:byMat.reduce((s,r)=>s+r.trips,0),qty:byMat.reduce((s,r)=>s+r.qty,0)},
        400
      )}

      {/* ── Date Trend ── */}
      {tab==='date-trend'&&T(byDate,
        [{k:'label',h:'Month'},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--info)'},{k:'qty',h:'Qty (T)',r:true,f:v=>v.toFixed(3)}],
        tTot
      )}

      {/* ── Full Log ── */}
      {tab==='full-log'&&(
        <div>
          {trips.length>500&&(
            <div style={{fontSize:11.5,color:'var(--txt2)',marginBottom:8,padding:'6px 12px',borderRadius:3,background:'var(--or-lt)'}}>
              Showing first 500 of {trips.length} records — use filters above to narrow results.
            </div>
          )}
          {T(
            trips.slice(0,500),
            [
              {k:'date',h:'Date',f:v=>window.fmtDate(v)},
              {k:'module',h:'Module'},
              {k:'company',h:'Company'},
              {k:'vehicle',h:'Vehicle',mono:true},
              {k:'transporter',h:'Transporter'},
              {k:'material',h:'Material'},
              {k:'challan',h:'Challan',mono:true},
              {k:'qty',h:'Qty (T)',r:true,b:true,f:v=>v.toFixed(3)},
              {k:'party',h:'Party / Route'},
            ],
            {date:'TOTAL',module:'',company:'',vehicle:'',transporter:'',material:'',challan:'',qty:tQty,party:''},
            400
          )}
        </div>
      )}

    </window.DashDrillModal>
  );
}

// ── OM Group Executive Analysis Modal ────────────────────────────────────
function OmGroupExecDrill({ leaderboard, totalRevenue, totalPurchCost, grossProfit, profitMargin, totalPurchTons, totalSoldTons, dieselCost, totalTripsCount, onCompanyDrill, onClose }) {
  const [metric, setMetric] = gSt('rev');
  const [hovIdx, setHovIdx] = gSt(null);
  const C = window.fmtCur;
  // Authoritative Net Profit for the group lives on the main dashboard page
  // (see "Net Profit (After Diesel)" KPI + Profit Engine cards), sourced from
  // window.ProfitEngine — this modal only breaks Gross Profit down by company.
  const METRICS = [
    {id:'rev',   label:'Revenue',        f:co=>co.rev},
    {id:'cost',  label:'Purchase Cost',  f:co=>co.cost},
    {id:'profit',label:'Gross Profit',   f:co=>Math.max(0,co.profit)},
    {id:'pTons', label:'Tons Purchased', f:co=>co.pTons},
    {id:'tons',  label:'Tons Sold',      f:co=>co.tons},
    {id:'trips', label:'Trips',          f:co=>co.trips},
  ];
  const am = METRICS.find(m=>m.id===metric)||METRICS[0];
  const metricTotal = gMemo(()=>leaderboard.reduce((s,co)=>s+Math.max(0,am.f(co)),0),[leaderboard,metric]);
  const CX=130,CY=130,RO=115,RI=52;
  const svgPaths = gMemo(()=>{
    let a=-Math.PI/2; const paths=[];
    leaderboard.forEach((co,i)=>{
      const v=Math.max(0,am.f(co));
      const pct=metricTotal>0?v/metricTotal:0;
      if(pct<0.003){a+=pct*2*Math.PI;return;}
      const a0=a,a1=a+pct*2*Math.PI; a=a1;
      const c0=Math.cos(a0),s0=Math.sin(a0),c1=Math.cos(a1),s1=Math.sin(a1);
      const lg=pct>.5?1:0;
      const d=`M${(CX+RO*c0).toFixed(2)},${(CY+RO*s0).toFixed(2)} A${RO},${RO},0,${lg},1,${(CX+RO*c1).toFixed(2)},${(CY+RO*s1).toFixed(2)} L${(CX+RI*c1).toFixed(2)},${(CY+RI*s1).toFixed(2)} A${RI},${RI},0,${lg},0,${(CX+RI*c0).toFixed(2)},${(CY+RI*s0).toFixed(2)} Z`;
      paths.push({i,d,mid:(a0+a1)/2,pct,co});
    });
    return paths;
  },[leaderboard,metric,metricTotal]);
  const hovCo=hovIdx!==null?leaderboard[hovIdx]:null;
  const hovPct=hovCo&&metricTotal>0?Math.max(0,am.f(hovCo))/metricTotal:0;
  const tdSt=(x)=>({padding:'5px 10px',borderBottom:'1px solid #F3F4F6',whiteSpace:'nowrap',...(x||{})});
  const tfSt=(x)=>({padding:'7px 10px',fontWeight:700,background:'#F9FAFB',borderTop:'2px solid var(--bdr)',whiteSpace:'nowrap',...(x||{})});
  return (
    <window.DashDrillModal title="OM Group Executive Analysis" subtitle="Consolidated performance · click a company or pie slice to drill down" color="var(--or)" onClose={onClose} width={1000}>
      <window.DashKPIs items={[['Total Revenue',C(totalRevenue),'var(--or)'],['Purchase Cost',C(totalPurchCost),'var(--txt)'],['Gross Profit',C(grossProfit),grossProfit>=0?'var(--ok)':'var(--err)'],['Profit Margin',profitMargin+'%',grossProfit>=0?'var(--ok)':'var(--err)'],['Tons Purchased',window.formatQuantity(totalPurchTons)+' T','var(--info)'],['Tons Sold',window.formatQuantity(totalSoldTons)+' T','var(--ok)'],['Diesel Cost',C(dieselCost),'var(--warn)'],['Net Profit',C(grossProfit-dieselCost),(grossProfit-dieselCost)>=0?'var(--ok)':'var(--err)']]}/>
      <div style={{display:'flex',gap:5,marginBottom:14,flexWrap:'wrap',alignItems:'center'}}>
        <span style={{fontSize:11,fontWeight:600,color:'var(--txt2)'}}>Pie chart by:</span>
        {METRICS.map(m=><button key={m.id} className={`btn btn-sm ${metric===m.id?'btn-or':'btn-wh'}`} onClick={()=>setMetric(m.id)} style={{fontSize:11}}>{m.label}</button>)}
      </div>
      <div className="omg-exec-grid" style={{display:'grid',gridTemplateColumns:'270px 1fr',gap:20,alignItems:'start',marginBottom:14}}>
        <div>
          <svg viewBox="0 0 260 260" style={{width:'100%',display:'block',overflow:'visible'}}>
            {svgPaths.map(p=>{
              const isHov=hovIdx===p.i;
              const ox=isHov?Math.cos(p.mid)*10:0,oy=isHov?Math.sin(p.mid)*10:0;
              return <path key={p.i} d={p.d} fill={p.co.color} stroke="#fff" strokeWidth={2.5} transform={isHov?`translate(${ox.toFixed(2)},${oy.toFixed(2)})`:''} style={{cursor:'pointer',transition:'transform .15s ease,opacity .15s',opacity:hovIdx!==null&&!isHov?.6:1}} onMouseEnter={()=>setHovIdx(p.i)} onMouseLeave={()=>setHovIdx(null)} onClick={()=>onCompanyDrill(p.co)}/>;
            })}
            <circle cx={CX} cy={CY} r={RI-1} fill="#fff"/>
            {hovCo?<><text x={CX} y={CY-14} textAnchor="middle" fontSize="10" fontWeight="700" fill="var(--txt)" style={{pointerEvents:'none'}}>{(hovCo.name||'—').length>14?(hovCo.name||'—').slice(0,14)+'…':(hovCo.name||'—')}</text><text x={CX} y={CY+3} textAnchor="middle" fontSize="15" fontWeight="700" fill={hovCo.color} style={{pointerEvents:'none'}}>{(hovPct*100).toFixed(1)}%</text><text x={CX} y={CY+18} textAnchor="middle" fontSize="10" fill="var(--txt2)" style={{pointerEvents:'none'}}>{am.label}</text></>:<><text x={CX} y={CY-5} textAnchor="middle" fontSize="12" fontWeight="700" fill="var(--txt)" style={{pointerEvents:'none'}}>OM Group</text><text x={CX} y={CY+11} textAnchor="middle" fontSize="10.5" fill="var(--txt2)" style={{pointerEvents:'none'}}>{leaderboard.length} companies</text></>}
          </svg>
          <div style={{display:'flex',flexDirection:'column',gap:3,marginTop:4}}>
            {leaderboard.map((co,i)=>{
              const pct=metricTotal>0?Math.max(0,am.f(co))/metricTotal*100:0;
              return <div key={co.id} style={{display:'flex',alignItems:'center',gap:6,cursor:'pointer',padding:'3px 6px',borderRadius:3,background:hovIdx===i?'#FFF7ED':''}} onMouseEnter={()=>setHovIdx(i)} onMouseLeave={()=>setHovIdx(null)} onClick={()=>onCompanyDrill(co)}><span style={{width:10,height:10,borderRadius:2,background:co.color,flexShrink:0,display:'inline-block'}}></span><span className="omg-legend-name" style={{fontSize:11,flex:1,overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap',fontWeight:hovIdx===i?600:400}}>{co.name}</span><span style={{fontSize:11,fontWeight:600,color:co.color,minWidth:38,textAlign:'right'}}>{pct.toFixed(1)}%</span></div>;
            })}
          </div>
        </div>
        <div style={{overflowX:'auto',border:'1px solid var(--bdr)',borderRadius:4}}>
          <table style={{width:'100%',borderCollapse:'collapse',fontSize:12,minWidth:'max-content'}}>
            <thead><tr style={{background:'#F9FAFB'}}>
              {['#','Company','Revenue','Purchase Cost','Gross Profit','Margin','Tons Purch.','Tons Sold','Diesel','Trips','Rev %'].map((h,i)=>(
                <th key={i} style={{padding:'6px 10px',textAlign:i>=2?'right':'left',fontWeight:600,fontSize:11,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'.03em',whiteSpace:'nowrap',borderBottom:'1px solid var(--bdr)'}}>{h}</th>
              ))}
            </tr></thead>
            <tbody>
              {leaderboard.map((co,i)=>{
                const revPct=totalRevenue>0?co.rev/totalRevenue*100:0;
                return <tr key={co.id} style={{cursor:'pointer',background:hovIdx===i?'#FFF7ED':'',transition:'background .1s'}} onMouseEnter={()=>setHovIdx(i)} onMouseLeave={()=>setHovIdx(null)} onClick={()=>onCompanyDrill(co)}>
                  <td style={tdSt({color:'var(--txt2)',fontWeight:700,textAlign:'center',width:28})}>{i+1}</td>
                  <td style={tdSt({fontWeight:600})}><div style={{display:'flex',alignItems:'center',gap:6}}><span style={{width:8,height:8,borderRadius:'50%',background:co.color,flexShrink:0,display:'inline-block'}}></span>{co.name}</div></td>
                  <td style={tdSt({textAlign:'right',fontWeight:600,color:'var(--or)'})}>{C(co.rev)}</td>
                  <td style={tdSt({textAlign:'right',color:'var(--txt2)'})}>{C(co.cost)}</td>
                  <td style={tdSt({textAlign:'right',fontWeight:600,color:co.profit>=0?'var(--ok)':'var(--err)'})}>{C(co.profit)}</td>
                  <td style={tdSt({textAlign:'right',fontWeight:600,color:co.margin>=10?'var(--ok)':'var(--err)'})}>{co.margin.toFixed(1)}%</td>
                  <td style={tdSt({textAlign:'right',fontWeight:600,color:'var(--info)'})}>{window.formatQuantity(co.pTons)} T</td>
                  <td style={tdSt({textAlign:'right',fontWeight:600})}>{window.formatQuantity(co.tons)} T</td>
                  <td style={tdSt({textAlign:'right',color:'var(--txt2)'})}>{C(co.dsl)}</td>
                  <td style={tdSt({textAlign:'right',fontWeight:600,color:'var(--info)'})}>{co.trips}</td>
                  <td style={tdSt({textAlign:'right'})}><span style={{background:co.color+'22',color:co.color,padding:'1px 8px',borderRadius:10,fontSize:11,fontWeight:700}}>{revPct.toFixed(1)}%</span></td>
                </tr>;
              })}
            </tbody>
            <tfoot><tr style={{background:'#F9FAFB'}}>
              <td colSpan="2" style={tfSt()}>OM GROUP TOTAL</td>
              <td style={tfSt({textAlign:'right',color:'var(--or)'})}>{C(totalRevenue)}</td>
              <td style={tfSt({textAlign:'right'})}>{C(totalPurchCost)}</td>
              <td style={tfSt({textAlign:'right',color:grossProfit>=0?'var(--ok)':'var(--err)'})}>{C(grossProfit)}</td>
              <td style={tfSt({textAlign:'right'})}>{profitMargin}%</td>
              <td style={tfSt({textAlign:'right',color:'var(--info)'})}>{window.formatQuantity(totalPurchTons)} T</td>
              <td style={tfSt({textAlign:'right'})}>{window.formatQuantity(totalSoldTons)} T</td>
              <td style={tfSt({textAlign:'right'})}>{C(dieselCost)}</td>
              <td style={tfSt({textAlign:'right',color:'var(--info)'})}>{totalTripsCount}</td>
              <td style={tfSt({textAlign:'right'})}>100%</td>
            </tr></tfoot>
          </table>
        </div>
      </div>
    </window.DashDrillModal>
  );
}

// ── Crusher Donut Chart ─────────────────────────────────────────────────
function CrusherDonut({rows,total,onSliceClick}){
  const [hov,setHov]=gSt(null);
  const COLORS=['#EA580C','#78716C','#D97706','#6B7280','#92400E','#B45309','#C2410C'];
  const top6=rows.slice(0,6);
  const otherVal=rows.slice(6).reduce((s,r)=>s+r.value,0);
  const slices=[...top6.map((r,i)=>({...r,color:COLORS[i]}))];
  if(otherVal>0)slices.push({id:'_other',name:'Others',value:otherVal,trips:0,qty:0,color:'#D1D5DB'});
  const R=92,RI=54,CX=110,CY=110;
  let ang=-Math.PI/2;
  const paths=slices.map((s,i)=>{
    const pct=total>0?s.value/total:0;if(pct<0.005)return null;
    const sweep=pct*2*Math.PI;
    const x1=CX+R*Math.cos(ang),y1=CY+R*Math.sin(ang);
    ang+=sweep;
    const x2=CX+R*Math.cos(ang),y2=CY+R*Math.sin(ang);
    const xi1=CX+RI*Math.cos(ang),yi1=CY+RI*Math.sin(ang);
    const xi2=CX+RI*Math.cos(ang-sweep),yi2=CY+RI*Math.sin(ang-sweep);
    const lg=sweep>Math.PI?1:0;
    return{d:`M${x1} ${y1}A${R} ${R} 0 ${lg} 1 ${x2} ${y2}L${xi1} ${yi1}A${RI} ${RI} 0 ${lg} 0 ${xi2} ${yi2}Z`,color:s.color,i,pct,row:s};
  }).filter(Boolean);
  const topRow=slices[0];
  const hovRow=hov!==null?paths.find(p=>p.i===hov)?.row:null;
  const CF=window.fmtCur;
  const displayRow=hovRow||topRow;
  return(
    <div className="crusher-donut-wrap">
      <div className="crusher-donut-chart">
        <svg viewBox="0 0 220 220" width="220" height="220" style={{maxWidth:'100%',overflow:'visible',display:'block'}}>
          {paths.map(p=>{
            const isH=hov===p.i;
            return(
              <path key={p.i} d={p.d} fill={p.color} stroke="#fff" strokeWidth={isH?2.5:1.5}
                style={{cursor:p.row.id!=='_other'?'pointer':'default',opacity:hov!==null&&!isH?0.6:1,transition:'all .18s',transform:isH?'scale(1.04)':'scale(1)',transformOrigin:`${CX}px ${CY}px`}}
                onClick={()=>p.row.id!=='_other'&&onSliceClick(p.row)}
                onMouseEnter={()=>setHov(p.i)} onMouseLeave={()=>setHov(null)}/>
            );
          })}
          <circle cx={CX} cy={CY} r={RI-2} fill="#fff"/>
          {displayRow&&(
            <>
              <text x={CX} y={CY-22} textAnchor="middle" fontSize={8.5} fill="#9CA3AF" fontFamily="Inter,sans-serif" fontWeight="700">{hovRow?'SOURCE':'TOP SOURCE'}</text>
              <text x={CX} y={CY-7} textAnchor="middle" fontSize={9} fontWeight="700" fill="#374151" fontFamily="Inter,sans-serif">{displayRow.name.length>12?displayRow.name.slice(0,11)+'\u2026':displayRow.name}</text>
              <text x={CX} y={CY+9} textAnchor="middle" fontSize={13} fill="#EA580C" fontFamily="Inter,sans-serif" fontWeight="700">{total>0?(displayRow.value/total*100).toFixed(1):0}%</text>
              <text x={CX} y={CY+22} textAnchor="middle" fontSize={8.5} fill="#6B7280" fontFamily="Inter,sans-serif">{CF(displayRow.value)}</text>
              <text x={CX} y={CY+34} textAnchor="middle" fontSize={8} fill="#9CA3AF" fontFamily="Inter,sans-serif">{(displayRow.trips||0)+' trips \u00b7 '+window.formatQuantity((displayRow.qty||0))+'T'}</text>
            </>
          )}
        </svg>
        <div style={{fontSize:11,color:'var(--txt2)',textAlign:'center',marginTop:2}}>Total: <strong style={{color:'var(--txt)'}}>{CF(total)}</strong></div>
      </div>
      <div className="crusher-donut-legend">
        {paths.map(p=>{
          const pctN=(p.pct*100).toFixed(1);
          const isH=hov===p.i;
          return(
            <div key={p.i} className="crusher-legend-row"
              style={{display:'grid',gridTemplateColumns:'12px 1fr auto auto',gap:8,alignItems:'center',
                cursor:p.row.id!=='_other'?'pointer':'default',
                padding:'8px 10px',borderRadius:6,marginBottom:4,
                background:isH?'#FFF7ED':'#F9FAFB',
                border:`1px solid ${isH?'#FDBA74':'var(--bdr)'}`,
                transition:'all .15s'}}
              onClick={()=>p.row.id!=='_other'&&onSliceClick(p.row)}
              onMouseEnter={()=>setHov(p.i)} onMouseLeave={()=>setHov(null)}>
              <div style={{width:12,height:12,borderRadius:3,background:p.color,flexShrink:0}}></div>
              <div style={{minWidth:0}}>
                <div style={{fontSize:12,fontWeight:600,overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap',color:'var(--txt)'}}>{p.row.name}</div>
                <div style={{fontSize:10.5,color:'var(--txt2)',marginTop:1}}>{p.row.trips||0} trips · {window.formatQuantity((p.row.qty||0))} T</div>
              </div>
              <div style={{fontSize:11,color:'var(--txt2)',textAlign:'right',whiteSpace:'nowrap'}}>{CF(p.row.value)}</div>
              <div style={{fontSize:13,fontWeight:700,color:p.color,textAlign:'right',minWidth:44,whiteSpace:'nowrap'}}>{pctN}%</div>
            </div>
          );
        })}
      </div>
    </div>
  );
}

function GroupDashboardPage(){
  const {navigate}=gCtx(AppCtx)||{};
  const [preset,setPreset]=gSt('all');
  const [cFrom,setCFrom]=gSt('');
  const [cTo,setCTo]=gSt('');
  const [fComp,setFComp]=gSt('');
  const [fMat,setFMat]=gSt('');
  const [actType,setActType]=gSt('Purchases');
  const [,setTick]=gSt(0);
  const [drill,setDrill]=gSt(null);      // { type, ...extra }
  const [expActId,setExpActId]=gSt(null); // expanded activity row id

  gEf(()=>{ const unsub=Store.on(()=>setTick(t=>t+1)); return unsub; },[]);

  const range=gMemo(()=>grpRange(preset,cFrom,cTo),[preset,cFrom,cTo]);

  const allPurchases=Store.all('purchases');
  const allSales    =Store.all('salesOrders');
  const allTransport=Store.all('transportEntries');
  const allDiesel   =Store.all('dieselRecords');
  const allTransfers=Store.all('internalTransfers');
  const allMovements=Store.all('stockMovements');
  const allDebris   =Store.all('debrisMovements');
  const allVendorSettlements   =Store.all('vendorSettlements');
  const allTransportSettlements=Store.all('settlementRecords');
  const companies   =Store.all('companies');
  const materials   =Store.all('materials');
  const stockyards  =Store.all('stockyards');

  const purchases=gMemo(()=>allPurchases.filter(p=>grpIn(p.date,range.from,range.to)&&(!fComp||p.companyId===fComp)&&(!fMat||(p.items||[]).some(i=>i.materialId===fMat))),[allPurchases,range,fComp,fMat]);
  const sales    =gMemo(()=>allSales.filter(s=>grpIn(s.date,range.from,range.to)&&(!fComp||s.companyId===fComp)&&(!fMat||s.materialId===fMat)),[allSales,range,fComp,fMat]);
  const diesel   =gMemo(()=>allDiesel.filter(d=>grpIn(d.periodStart,range.from,range.to)&&(!fComp||d.companyId===fComp)),[allDiesel,range,fComp]);
  const transport=gMemo(()=>allTransport.filter(t=>grpIn(t.date,range.from,range.to)&&(!fComp||t.companyId===fComp)),[allTransport,range,fComp]);
  const transfers=gMemo(()=>allTransfers.filter(t=>grpIn(t.date,range.from,range.to)),[allTransfers,range]);
  const debris   =gMemo(()=>allDebris.filter(d=>grpIn(d.date,range.from,range.to)&&(!fComp||d.companyId===fComp)),[allDebris,range,fComp]);

  // ── Data-health gate: a load failure on `purchases` must never be presented
  // as "0 purchases" — Store already quarantines/locks the collection instead
  // of deleting it (see erp/store.js), but every KPI below still read the
  // resulting empty array with no check. This flag + uv()/uvSub() stop that
  // read-error → [] → ₹0 conversion from reaching the screen.
  const purchLoadState=(Store.loadState&&Store.loadState('purchases'))||{state:'OK'};
  const purchasesUnavailable=purchLoadState.state==='ERROR'||purchLoadState.state==='BLOCKED';
  // Phase 6 (REPORTS/27): purchases now hydrates in the background in
  // staging — distinct from ERROR/BLOCKED, self-corrects via Store.on().
  const purchasesLoading=purchLoadState.state==='LOADING';
  const uv=(v)=>purchasesUnavailable?'UNAVAILABLE':purchasesLoading?'Loading…':v;
  const uvSub=(s)=>purchasesUnavailable?'Recovery required — see Data Health':purchasesLoading?'Purchase data is still loading':s;

  // ── Financial ─────────────────────────────────────────────────────────
  // ── Single Source of Truth: every financial figure below is derived from
  // window.ProfitEngine / window.GstEngine — no page-local reimplementation
  // of revenue, cost, margin, or profit math. See erp/profit-engine.js.
  const PE=window.ProfitEngine;
  const totalRevenue  =gMemo(()=>PE.revenue({sales,debris},'incl'),[sales,debris]);
  const totalPurchCost=gMemo(()=>PE.purchAmt(purchases,'incl'),[purchases]);
  const grossProfit   =totalRevenue-totalPurchCost;
  const dieselCost        =gMemo(()=>PE.dieselActual(diesel),[diesel]);
  const dieselMarginEarned=gMemo(()=>PE.dieselMargin(diesel),[diesel]);
  const totalSoldTons =gMemo(()=>sales.reduce((s,o)=>s+(parseFloat(o.quantity)||0),0),[sales]);
  const totalPurchTons=gMemo(()=>purchases.reduce((s,p)=>s+(p.items||[]).reduce((a,i)=>a+(parseFloat(i.quantity)||0),0),0),[purchases]);
  const totalTransporterDeduction=gMemo(()=>PE.dieselDeduction(diesel),[diesel]);

  // ── Settlement Efficiency — centralized Settlement Intelligence Engine ──
  // Single source of truth for vendor + transport settlement health; recomputes
  // automatically whenever vendorSettlements/settlementRecords change (Store.on
  // subscription above triggers setTick → this whole page re-renders).
  const SE=window.SettlementIntel;
  const vSettleStats=gMemo(()=>SE.streamStats(allVendorSettlements,{companyId:fComp}),[allVendorSettlements,fComp]);
  const tSettleStats=gMemo(()=>SE.streamStats(allTransportSettlements,{companyId:fComp}),[allTransportSettlements,fComp]);
  const settlementEfficiencyPct=gMemo(()=>SE.combinedEfficiency(vSettleStats,tSettleStats),[vSettleStats,tSettleStats]);

  // ── Unified Profit Engine — Method 1 (Commercial) / Method 2 (Operational), GST incl/excl ──
  const peM1Incl=gMemo(()=>PE.method1({sales,purchases,transport,diesel,gstMode:'incl'}),[sales,purchases,transport,diesel]);
  const peM1Excl=gMemo(()=>PE.method1({sales,purchases,transport,diesel,gstMode:'excl'}),[sales,purchases,transport,diesel]);
  const peM2Incl=gMemo(()=>PE.method2({sales,purchases,transport,diesel,gstMode:'incl'}),[sales,purchases,transport,diesel]);
  const peM2Excl=gMemo(()=>PE.method2({sales,purchases,transport,diesel,gstMode:'excl'}),[sales,purchases,transport,diesel]);

  // netProfit / profitPerTon / costPerTon are the ONE authoritative "Net Profit"
  // figure on this dashboard — sourced from ProfitEngine Method 1 (GST-incl),
  // never recomputed ad hoc. Every KPI, drill-down and chart below reads this
  // same value, so it is impossible for them to disagree.
  const netProfit     =peM1Incl.netProfit;
  const profitMargin  =totalRevenue>0?(grossProfit/totalRevenue*100).toFixed(1):'0.0';
  const profitPerTon  =totalSoldTons>0?Math.round(netProfit/totalSoldTons):0;
  const costPerTon    =totalSoldTons>0?Math.round((totalPurchCost+dieselCost)/totalSoldTons):0;

  // ── NEW: Avg Revenue per Sale Order ─────────────────────────────────
  const avgRevPerOrder=sales.length>0?totalRevenue/sales.length:0;

  // ── NEW: Vehicle Utilization ─────────────────────────────────────────
  const vehicleUtilData=gMemo(()=>{
    const activeVehs=new Set(transport.map(t=>t.vehicleFull||t.vehicleNum).filter(Boolean));
    const allVehs=new Set(allTransport.map(t=>t.vehicleFull||t.vehicleNum).filter(Boolean));
    const active=activeVehs.size;
    const total=Math.max(allVehs.size,active);
    const idle=total-active;
    const pct=total>0?(active/total*100).toFixed(1):'0.0';
    return {activeVehCount:active,totalVehEver:total,idleVehCount:idle,utilizationPct:pct};
  },[transport,allTransport]);
  const {activeVehCount,totalVehEver,idleVehCount,utilizationPct}=vehicleUtilData;

  // ── Inventory ─────────────────────────────────────────────────────────
  const SI_IN=new Set(['Opening','Purchase','Transfer In','Adjustment In']);
  const {inventoryVal,inventoryTons,deadStockVal}=gMemo(()=>{
    const map={};
    allMovements.forEach(m=>{
      const k=`${m.stockyardId}|${m.materialId}`;
      if(!map[k])map[k]={qty:0,val:0,lastDate:''};
      const q=parseFloat(m.quantity)||0,v=parseFloat(m.value)||0;
      if(SI_IN.has(m.type)){map[k].qty+=q;map[k].val+=v;}else{map[k].qty-=q;map[k].val-=v;}
      if(!map[k].lastDate||(m.date||'')>map[k].lastDate)map[k].lastDate=m.date||'';
    });
    const pos=Object.values(map).filter(p=>p.qty>0);
    return {
      inventoryVal:pos.reduce((s,p)=>s+Math.max(p.val,0),0),
      inventoryTons:pos.reduce((s,p)=>s+p.qty,0),
      deadStockVal:pos.filter(p=>{const d=p.lastDate?Math.floor((Date.now()-new Date(p.lastDate).getTime())/86400000):9999;return d>=90;}).reduce((s,p)=>s+Math.max(p.val,0),0),
    };
  },[allMovements]);

  // ── Intelligence ──────────────────────────────────────────────────────
  const daysInPeriod=gMemo(()=>{if(!range.from||!range.to)return 30;return Math.max(1,Math.floor((new Date(range.to)-new Date(range.from))/86400000)+1);},[range]);
  const invTurnover=inventoryVal>0?(totalPurchCost/inventoryVal).toFixed(2):null;
  const dailyConsumption=daysInPeriod>0?totalSoldTons/daysInPeriod:0;
  const dioValue=dailyConsumption>0?(inventoryTons/dailyConsumption).toFixed(1):null;

  const stockAging=gMemo(()=>{
    const now=Date.now(),map={};
    allMovements.forEach(m=>{
      const k=`${m.stockyardId}|${m.materialId}`;
      if(!map[k])map[k]={qty:0,val:0,lastDate:''};
      const q=parseFloat(m.quantity)||0,v=parseFloat(m.value)||0;
      if(SI_IN.has(m.type)){map[k].qty+=q;map[k].val+=v;}else{map[k].qty-=q;map[k].val-=v;}
      if(!map[k].lastDate||(m.date||'')>map[k].lastDate)map[k].lastDate=m.date||'';
    });
    const b={d30:{qty:0,val:0},d60:{qty:0,val:0},d90:{qty:0,val:0},d90p:{qty:0,val:0}};
    Object.values(map).filter(p=>p.qty>0).forEach(p=>{
      const days=p.lastDate?Math.floor((now-new Date(p.lastDate).getTime())/86400000):9999;
      const qty=p.qty,val=Math.max(p.val,0);
      if(days<=30){b.d30.qty+=qty;b.d30.val+=val;}
      else if(days<=60){b.d60.qty+=qty;b.d60.val+=val;}
      else if(days<=90){b.d90.qty+=qty;b.d90.val+=val;}
      else{b.d90p.qty+=qty;b.d90p.val+=val;}
    });
    return b;
  },[allMovements]);

  const deadStockItems=gMemo(()=>{
    const now=Date.now(),map={};
    allMovements.forEach(m=>{
      const k=`${m.stockyardId}|${m.materialId}`;
      if(!map[k])map[k]={qty:0,val:0,lastDate:'',material:Store.name('materials',m.materialId),stockyard:Store.name('stockyards',m.stockyardId)||m.stockyardId};
      const q=parseFloat(m.quantity)||0,v=parseFloat(m.value)||0;
      if(SI_IN.has(m.type)){map[k].qty+=q;map[k].val+=v;}else{map[k].qty-=q;map[k].val-=v;}
      if(!map[k].lastDate||(m.date||'')>map[k].lastDate)map[k].lastDate=m.date||'';
    });
    return Object.values(map).filter(p=>p.qty>0).map(p=>({...p,val:Math.max(p.val,0),days:p.lastDate?Math.floor((now-new Date(p.lastDate).getTime())/86400000):9999})).filter(p=>p.days>=30).sort((a,b)=>b.days-a.days).slice(0,8);
  },[allMovements]);

  const trfSummary=gMemo(()=>({count:transfers.length,qty:transfers.reduce((s,t)=>(t.items||[]).reduce((a,i)=>a+(parseFloat(i.quantity)||0),s),0),val:transfers.reduce((s,t)=>s+(t.totalValue||0),0)}),[transfers]);

  // ── Customer Intelligence ──────────────────────────────────────────────
  const customerIntel=gMemo(()=>{
    const map={};
    sales.forEach(s=>{
      const k=s.customerId||'_unk';
      if(!map[k])map[k]={id:k,name:Store.name('customers',k)||'Unknown',rev:0,qty:0,orders:0,mats:new Set(),lastDate:''};
      map[k].rev+=(window.gAmt(s));
      map[k].qty+=parseFloat(s.quantity)||0;
      map[k].orders++;
      if(s.materialId)map[k].mats.add(s.materialId);
      if(!map[k].lastDate||(s.date||'')>map[k].lastDate)map[k].lastDate=s.date||'';
    });
    const rows=Object.values(map).map(r=>({...r,mats:r.mats.size,avgOrder:r.orders>0?r.rev/r.orders:0})).sort((a,b)=>b.rev-a.rev);
    const tot=rows.reduce((s,r)=>s+r.rev,0);
    const top3=rows.slice(0,3).reduce((s,r)=>s+r.rev,0);
    return {
      rows,totalRev:tot,uniqueCustomers:rows.length,
      top3Pct:tot>0?(top3/tot*100).toFixed(1):'0.0',
      repeatCustomers:rows.filter(r=>r.orders>1).length,
      avgRevPerCustomer:rows.length>0?Math.round(tot/rows.length):0,
      topCustomer:rows[0]||null,
    };
  },[sales]);

  // ── Transport Intelligence ─────────────────────────────────────────────
  const transportIntel=gMemo(()=>{
    const tMap={},vMap={};
    // Helper: resolve canonical transporter key + name from any record
    function trInfo(r){
      const id=r.transporterId||'';
      const name=(r.transporter&&r.transporter!=='—')?r.transporter
        :(id?Store.name('transportersList',id)||id:'');
      const key=id||name||'_unk';
      return {key,name:name||key,id};
    }
    // Transport entries (direct trips with value)
    transport.forEach(t=>{
      const {key,name}=trInfo(t);
      if(!tMap[key])tMap[key]={id:t.transporterId||key,name,trips:0,qty:0,value:0,vehs:new Set()};
      tMap[key].trips++;tMap[key].qty+=parseFloat(t.quantity)||0;tMap[key].value+=(t.amount||0);
      if(t.vehicleFull||t.vehicleNum)tMap[key].vehs.add(t.vehicleFull||t.vehicleNum);
      const vk=t.vehicleFull||t.vehicleNum||'Unknown';
      if(!vMap[vk])vMap[vk]={name:vk,trips:0,qty:0};
      vMap[vk].trips++;vMap[vk].qty+=parseFloat(t.quantity)||0;
    });
    // Also count transporters referenced in purchases (by transporterId or transporter name)
    purchases.forEach(p=>{
      const {key,name}=trInfo(p);
      if(key==='_unk')return;
      if(!tMap[key])tMap[key]={id:p.transporterId||key,name,trips:0,qty:0,value:0,vehs:new Set()};
      tMap[key].trips++;
      const qty=(p.items||[]).reduce((s,i)=>s+(parseFloat(i.quantity)||0),0);
      tMap[key].qty+=qty;
      if(p.vehicleFull)tMap[key].vehs.add(p.vehicleFull);
    });
    // Also count transporters referenced in sales
    sales.forEach(s=>{
      const {key,name}=trInfo(s);
      if(key==='_unk')return;
      if(!tMap[key])tMap[key]={id:s.transporterId||key,name,trips:0,qty:0,value:0,vehs:new Set()};
      tMap[key].trips++;tMap[key].qty+=parseFloat(s.quantity)||0;
      if(s.vehicleFull)tMap[key].vehs.add(s.vehicleFull);
    });
    const transporterRows=Object.values(tMap)
      .filter(r=>r.id!=='_unk')
      .map(r=>({...r,vehs:r.vehs.size,avgPerTrip:r.trips>0?Math.round(r.value/r.trips):0}))
      .sort((a,b)=>b.trips-a.trips);
    const vehicleRows=Object.values(vMap).sort((a,b)=>b.trips-a.trips).slice(0,20);
    const totalValue=transport.reduce((s,t)=>s+(t.amount||0),0);
    const allVehicles=new Set([
      ...transport.map(t=>t.vehicleFull||t.vehicleNum),
      ...purchases.map(p=>p.vehicleFull),
      ...sales.map(s=>s.vehicleFull),
    ].filter(Boolean));
    const uniqueVehicles=allVehicles.size;
    const totalTripCount=transport.length+purchases.length+sales.length;
    return {
      transporterRows,vehicleRows,totalTrips:totalTripCount,totalValue,uniqueVehicles,
      uniqueTransporters:transporterRows.length,
      avgTripValue:totalTripCount>0?Math.round(totalValue/totalTripCount):0,
      topTransporter:transporterRows[0]||null,
    };
  },[transport,purchases,sales]);

  // ── Material Intelligence ────────────────────────────────────────────
  const materialIntel=gMemo(()=>{
    const map={};
    function addMat(k,{purchCost=0,purchQty=0,isPurch=false,rev=0,saleQty=0,isSale=false,vendorId='',customerId='',companyId='',crusherSite=''}){
      if(!k)return;
      const name=Store.name('materials',k)||k;
      if(!map[k])map[k]={id:k,name,purchCost:0,purchQty:0,purchTrips:0,rev:0,saleQty:0,saleTrips:0,vendors:new Set(),customers:new Set(),companies:new Set(),crushers:new Set()};
      if(isPurch){map[k].purchCost+=purchCost;map[k].purchQty+=purchQty;map[k].purchTrips++;}
      if(isSale){map[k].rev+=rev;map[k].saleQty+=saleQty;map[k].saleTrips++;}
      if(vendorId)map[k].vendors.add(vendorId);
      if(customerId)map[k].customers.add(customerId);
      if(companyId)map[k].companies.add(companyId);
      if(crusherSite)map[k].crushers.add(crusherSite);
    }
    purchases.forEach(p=>{
      if(p.items&&p.items.length){
        p.items.forEach(item=>{const _iq=parseFloat(item.quantity)||0,_ir=parseFloat(item.ratePerTon!=null?item.ratePerTon:item.rate)||0,_isub=_iq*_ir,_igp=parseFloat(item.gst!=null?item.gst:item.gstPercent)||0;addMat(item.materialId||p.materialId,{purchCost:_isub+_isub*_igp/100,purchQty:_iq,isPurch:true,vendorId:p.vendorId||'',companyId:p.companyId||'',crusherSite:item.crusherSite||''});});
      } else {
        addMat(p.materialId,{purchCost:window.gAmt(p),purchQty:parseFloat(p.quantity)||0,isPurch:true,vendorId:p.vendorId||'',companyId:p.companyId||''});
      }
    });
    sales.forEach(s=>addMat(s.materialId,{rev:window.gAmt(s),saleQty:parseFloat(s.quantity)||0,isSale:true,customerId:s.customerId||'',companyId:s.companyId||''}));
    const rows=Object.values(map).map(r=>({
      ...r,vendors:r.vendors.size,customers:r.customers.size,companies:r.companies.size,crushers:r.crushers.size,
      trips:r.purchTrips+r.saleTrips,profit:r.rev-r.purchCost,
      profitPerTon:r.saleQty>0?(r.rev-r.purchCost)/r.saleQty:0,
    })).sort((a,b)=>b.rev-a.rev);
    const totalRev=rows.reduce((s,r)=>s+r.rev,0);
    const totalPC=rows.reduce((s,r)=>s+r.purchCost,0);
    const totalSaleQty=rows.reduce((s,r)=>s+r.saleQty,0);
    return{rows,totalRev,totalPC,uniqueMaterials:rows.length,topMaterial:rows[0]||null,topByQty:[...rows].sort((a,b)=>b.purchQty-a.purchQty)[0]||null,topMoving:[...rows].sort((a,b)=>b.saleQty-a.saleQty)[0]||null,totalSaleQty};
  },[purchases,sales]);

  // ── Vendor Intelligence ───────────────────────────────────────────────
  const vendorIntel=gMemo(()=>{
    const map={};
    purchases.forEach(p=>{
      const k=p.vendorId;if(!k)return;
      const name=Store.name('vendors',k)||k;
      if(!map[k])map[k]={id:k,name,value:0,qty:0,trips:0,mats:new Set(),companies:new Set(),lastDate:''};
      const pTotal=window.gAmt(p);
      const pQty=(p.items&&p.items.length)?p.items.reduce((s,i)=>s+(parseFloat(i.quantity)||0),0):(parseFloat(p.quantity)||0);
      map[k].value+=pTotal;map[k].qty+=pQty;map[k].trips++;
      (p.items||[]).forEach(i=>{if(i.materialId)map[k].mats.add(i.materialId);});
      if(p.materialId)map[k].mats.add(p.materialId);
      if(p.companyId)map[k].companies.add(p.companyId);
      if(!map[k].lastDate||(p.date||'')>map[k].lastDate)map[k].lastDate=p.date||'';
    });
    const rows=Object.values(map).map(r=>({...r,mats:r.mats.size,companies:r.companies.size,avgPerTrip:r.trips>0?Math.round(r.value/r.trips):0})).sort((a,b)=>b.value-a.value);
    const totalValue=rows.reduce((s,r)=>s+r.value,0);
    return{rows,totalValue,uniqueVendors:rows.length,topVendor:rows[0]||null,avgPerVendor:rows.length>0?Math.round(totalValue/rows.length):0};
  },[purchases]);

  // ── Crusher Intelligence ──────────────────────────────────────────────
  const crusherIntel=gMemo(()=>{
    const map={};
    purchases.forEach(p=>{
      (p.items||[]).forEach(item=>{
        const k=item.crusherSite;if(!k)return;
        const name=Store.name('crushers',k)||k;
        if(!map[k])map[k]={id:k,name,value:0,qty:0,trips:0,mats:new Set(),companies:new Set(),vendors:new Set()};
        map[k].value+=window.gItemAmt(item);map[k].qty+=parseFloat(item.quantity)||0;map[k].trips++;
        if(item.materialId)map[k].mats.add(item.materialId);
        if(p.companyId)map[k].companies.add(p.companyId);
        if(p.vendorId)map[k].vendors.add(p.vendorId);
      });
    });
    const rows=Object.values(map).map(r=>({...r,mats:r.mats.size,companies:r.companies.size,vendors:r.vendors.size})).sort((a,b)=>b.value-a.value);
    const totalValue=rows.reduce((s,r)=>s+r.value,0);
    return{rows,totalValue,uniqueCrushers:rows.length,topCrusher:rows[0]||null};
  },[purchases]);

  // ── Company leaderboard ───────────────────────────────────────────────
  const leaderboard=gMemo(()=>{
    const rows=companies.map((co,ci)=>{
      const coS=allSales.filter(s=>s.companyId===co.id&&grpIn(s.date,range.from,range.to));
      const coP=allPurchases.filter(p=>p.companyId===co.id&&grpIn(p.date,range.from,range.to));
      const coD=allDiesel.filter(d=>d.companyId===co.id&&grpIn(d.periodStart,range.from,range.to));
      const coT=allTransport.filter(t=>t.companyId===co.id&&grpIn(t.date,range.from,range.to));
      const rev=coS.reduce((s,o)=>s+(window.gAmt(o)),0);
      const cost=coP.reduce((s,p)=>s+(window.gAmt(p)),0);
      const dsl=coD.reduce((s,d)=>s+(d.amount||0),0);
      const profit=rev-cost;
      const margin=rev>0?profit/rev*100:0;
      const tons=coS.reduce((s,o)=>s+(parseFloat(o.quantity)||0),0);
      const pTons=coP.reduce((s,p)=>s+(p.items||[]).reduce((a,i)=>a+(parseFloat(i.quantity)||0),0),0);
      const trips=coT.length;
      const color=CO_COLORS[ci%CO_COLORS.length];
      return {...co,rev,cost,dsl,profit,margin,tons,pTons,trips,color};
    }).sort((a,b)=>b.rev-a.rev);
    const maxRev=Math.max(...rows.map(r=>r.rev),1);
    return rows.map(r=>({...r,revPct:r.rev/maxRev*100}));
  },[companies,allSales,allPurchases,allDiesel,allTransport,range]);

  // ── All Trips Unified — aggregates every trip-generating module ─────────
  const allTripsUnified=gMemo(()=>{
    const rows=[];
    // Purchase Trips
    function resolveTransporter(r){
      if(r.transporter&&r.transporter!=='—')return{id:r.transporterId||r.transporter,name:r.transporter};
      if(r.transporterId){const n=Store.name('transportersList',r.transporterId);return{id:r.transporterId,name:n&&n!==r.transporterId?n:r.transporterId};}
      return{id:'',name:'—'};
    }
    purchases.forEach(p=>{
      const mat=(p.items?.[0]?Store.name('materials',p.items[0].materialId):Store.name('materials',p.materialId))||'—';
      const qty=(p.items||[]).reduce((s,i)=>s+(parseFloat(i.quantity)||0),0);
      const tr=resolveTransporter(p);
      rows.push({id:p.id,module:'Purchase',date:p.date,companyId:p.companyId,company:Store.name('companies',p.companyId)||'—',vehicle:p.vehicleFull||'—',transporterId:tr.id,transporter:tr.name,material:mat,challan:p.challanNumber||'—',qty,party:Store.name('vendors',p.vendorId)||'—'});
    });
    // Sales Trips
    sales.forEach(s=>{
      const tr=resolveTransporter(s);
      rows.push({id:s.id,module:'Sale',date:s.date,companyId:s.companyId,company:Store.name('companies',s.companyId)||'—',vehicle:s.vehicleFull||'—',transporterId:tr.id,transporter:tr.name,material:Store.name('materials',s.materialId)||'—',challan:s.challanNumber||'—',qty:parseFloat(s.quantity)||0,party:Store.name('customers',s.customerId)||'—'});
    });
    // Transport / Delivery / Stockyard entries
    transport.forEach(t=>{
      const mod=t.sourceModule==='STOCKYARD'?'Stockyard Movement':t.sourceModule==='DEBRIS'?'Debris Movement':'Delivery Movement';
      const tr=resolveTransporter(t);
      rows.push({id:t.id,module:mod,date:t.date,companyId:t.companyId,company:Store.name('companies',t.companyId)||'—',vehicle:t.vehicleFull||t.vehicleNum||'—',transporterId:tr.id,transporter:tr.name,material:Store.name('materials',t.materialId)||t.material||'—',challan:t.challanNumber||'—',qty:parseFloat(t.quantity)||0,party:`${t._fromStockyardName||t._stockyardName||'Yard'} → ${t._toStockyardName||'—'}`});
    });
    // Internal Transfers
    transfers.forEach(t=>{
      const items=t.items||[];
      const mat=items[0]?Store.name('materials',items[0].materialId)||'—':'—';
      const qty=items.reduce((s,i)=>s+(parseFloat(i.quantity)||0),0);
      const tr=resolveTransporter(t);
      rows.push({id:t.id,module:'Internal Transfer',date:t.date,companyId:t.sourceCompanyId||t.companyId||'',company:Store.name('companies',t.sourceCompanyId||t.companyId)||'—',vehicle:t.vehicleFull||t.vehicle||'—',transporterId:tr.id,transporter:tr.name,material:mat,challan:t.challanNumber||t.referenceNumber||'—',qty,party:`${Store.name('companies',t.sourceCompanyId||t.companyId)||'—'} → ${Store.name('companies',t.destCompanyId)||'—'}`});
    });
    // Debris Movements
    debris.forEach(d=>{
      const tr=resolveTransporter(d);
      rows.push({id:d.id,module:'Debris Movement',date:d.date,companyId:d.companyId,company:Store.name('companies',d.companyId)||'—',vehicle:d.vehicleFull||d.vehicle||'—',transporterId:tr.id,transporter:tr.name,material:d.material||'—',challan:d.challanNumber||'—',qty:parseFloat(d.quantity)||0,party:d.destType||'—'});
    });
    return rows.sort((a,b)=>(b.date||'').localeCompare(a.date||''));
  },[purchases,sales,transport,transfers,debris]);

  // ── Trip Efficiency — Operational Overview KPI (see trip-efficiency-engine.js) ──
  const tripEffStats=gMemo(()=>window.TripEfficiencyIntel.streamStats(allTripsUnified),[allTripsUnified]);

  // ── Recent activity ───────────────────────────────────────────────────
  const recentSales    =gMemo(()=>[...allSales].sort((a,b)=>(b.date||'').localeCompare(a.date||'')).slice(0,30),[allSales]);
  const recentPurchases=gMemo(()=>[...allPurchases].sort((a,b)=>(b.date||'').localeCompare(a.date||'')).slice(0,30),[allPurchases]);

  const PRESETS=[{id:'all',label:'All Time'},{id:'today',label:'Today'},{id:'yesterday',label:'Yesterday'},{id:'week',label:'This Week'},{id:'month',label:'This Month'},{id:'custom',label:'Custom'}];
  const periodLabel=preset==='all'?'All Time':preset==='month'?'This Month':preset==='week'?'This Week':preset==='today'?'Today':preset==='yesterday'?'Yesterday':'Custom';
  const C=window.fmtCur;

  // ── Drill-down modal renderer ─────────────────────────────────────────
  function renderDrill(){
    if(!drill) return null;
    return <window.ErrorBoundary resetKey={JSON.stringify(drill)}>{renderDrillInner()}</window.ErrorBoundary>;
  }
  function renderDrillInner(){
    const close=()=>setDrill(null);
    switch(drill.type){
      case 'settlementEfficiency':
        return <window.SettlementEfficiencyFlow vendorSettlements={allVendorSettlements} transportSettlements={allTransportSettlements} companyId={fComp} onClose={close}/>;
      case 'revenue': case 'sold':
        return <window.DashDrillModal title={drill.type==='sold'?'Sold Tonnage Analysis':'Revenue Analysis'} subtitle={`${sales.length} orders · ${C(totalRevenue)}`} color="var(--or)" onClose={close}><window.DashRevenueDrill sales={sales} debris={debris}/></window.DashDrillModal>;
      case 'cost': case 'purchased':
        return <window.DashDrillModal title={drill.type==='purchased'?'Purchased Tonnage':'Purchase Cost Analysis'} subtitle={`${purchases.length} orders · ${C(totalPurchCost)}`} onClose={close}><window.DashCostDrill purchases={purchases}/></window.DashDrillModal>;
      case 'profit': case 'margin':
        return <window.DashDrillModal title="Profit & Margin Analysis" subtitle={`Gross: ${C(grossProfit)} · Margin: ${profitMargin}%`} color={grossProfit>=0?'var(--ok)':'var(--err)'} onClose={close}><window.DashProfitDrill leaderboard={leaderboard} sales={sales} purchases={purchases}/></window.DashDrillModal>;
      case 'profitPerTon':
        return <window.DashDrillModal title="Profit Per Ton Analysis" subtitle={`${C(profitPerTon)}/Ton · ${window.formatQuantity(totalSoldTons)} T sold`} color="var(--info)" onClose={close}><window.DashProfitPerTonDrill sales={sales} purchases={purchases}/></window.DashDrillModal>;
      case 'diesel':
        return <window.DashDrillModal title="Diesel Cost Intelligence" subtitle={`${diesel.length} records · Actual Cost ${C(dieselCost)} · Margin Earned ${C(dieselMarginEarned)}`} color="var(--warn)" onClose={close}><window.DashDieselDrill diesel={diesel} transport={transport}/></window.DashDrillModal>;
      case 'tripEfficiency':
        return <window.TripEfficiencyFlow allTripsUnified={allTripsUnified} companyId={fComp} onClose={close}/>;
      case 'netProfit':
        return <window.DashDrillModal title="Net Profit Waterfall — Profit Engine" subtitle="Method 1 (Commercial) · Method 2 (Operational) · GST toggle · Auto Compare" color={netProfit>=0?'var(--ok)':'var(--err)'} onClose={close} width={1080}><window.DashNetProfitDrill sales={sales} purchases={purchases} transport={transport} diesel={diesel} debris={debris}/></window.DashDrillModal>;
      case 'inventory': case 'turnover': case 'dio':
        return <window.DashDrillModal title="Inventory Value Breakdown" subtitle={`${C(inventoryVal)} · ${window.formatQuantity(inventoryTons)} T`} color="var(--info)" onClose={close}><window.DashInventoryDrill allMovements={allMovements}/></window.DashDrillModal>;
      case 'deadstock':
        return <window.DashDrillModal title="Dead Stock Intelligence" subtitle="All idle stock ≥ 30 days" color="var(--err)" onClose={close}><window.DashDeadStockDrill allMovements={allMovements}/></window.DashDrillModal>;
      case 'transfers':
        return <window.DashDrillModal title="Internal Transfers" subtitle={`${trfSummary.count} transfers · ${window.formatQuantity(trfSummary.qty)} T · ${C(trfSummary.val)}`} color="var(--txt2)" onClose={close}><window.DashTransfersDrill transfers={transfers}/></window.DashDrillModal>;
      case 'agingBucket':
        return <window.DashDrillModal title={drill.label} subtitle="Drill-down by last movement date" color={drill.color} onClose={close}><window.DashAgingBucketDrill label={drill.label} color={drill.color} minDays={drill.minDays} maxDays={drill.maxDays} allMovements={allMovements}/></window.DashDrillModal>;
      case 'company':
        return <window.DashDrillModal title={drill.co.name} subtitle="Company Performance Deep-Dive" color={drill.co.color} onClose={close} width={980}><window.DashCompanyDrill co={drill.co} allSales={allSales} allPurchases={allPurchases} allDiesel={allDiesel} allTransport={allTransport} range={range}/></window.DashDrillModal>;
      case 'customer':
        return <window.DashDrillModal title="Customer Intelligence — Full Analysis" subtitle={`${customerIntel.uniqueCustomers} customers · ${C(customerIntel.totalRev)}`} color="#7C3AED" onClose={close} width={980}><window.DashCustomerIntelDrill customerIntel={customerIntel} sales={sales}/></window.DashDrillModal>;
      case 'transport':
        return <window.DashDrillModal title="Transport Intelligence — Full Analysis" subtitle={`${transportIntel.totalTrips} trips · ${C(transportIntel.totalValue)}`} color="var(--info)" onClose={close} width={980}><window.DashTransportIntelDrill transportIntel={transportIntel} transport={transport}/></window.DashDrillModal>;
      case 'uniqueCustomers': {
        const cuRows=customerIntel.rows.map(cu=>{const cuS=sales.filter(s=>s.customerId===cu.id);const firstDate=cuS.reduce((mn,s)=>(!mn||(s.date||'')<mn)?s.date||'':mn,'');return{...cu,firstDate};});
        return <window.DashDrillModal title={`Unique Customers — ${customerIntel.uniqueCustomers}`} subtitle="Complete customer list · revenue · orders · first & last activity" color="#7C3AED" onClose={close} width={980}><window.DashKPIs items={[['Total Customers',customerIntel.uniqueCustomers,'#7C3AED'],['Repeat Customers',customerIntel.repeatCustomers,'var(--ok)'],['Single Order',customerIntel.uniqueCustomers-customerIntel.repeatCustomers,'var(--txt2)'],['Total Revenue',C(customerIntel.totalRev),'var(--or)']]}/><window.DashBTable title="Customer Master List" rows={cuRows} cols={[{k:'name',h:'Customer'},{k:'rev',h:'Revenue',r:true,b:true,cl:'#7C3AED',f:v=>C(v)},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'orders',h:'Orders',r:true},{k:'avgOrder',h:'Avg Order',r:true,f:v=>C(Math.round(v))},{k:'mats',h:'Materials',r:true},{k:'firstDate',h:'First Order',f:v=>v?window.fmtDate(v):'—'},{k:'lastDate',h:'Last Order',f:v=>v?window.fmtDate(v):'—'}]} maxH={480}/></window.DashDrillModal>;
      }
      case 'repeatCustomers': {
        const rptRows=customerIntel.rows.filter(r=>r.orders>1).sort((a,b)=>b.orders-a.orders).map(cu=>({...cu,retention:cu.orders>=5?'High':cu.orders>=3?'Medium':'Low'}));
        const rptRev=rptRows.reduce((s,r)=>s+r.rev,0);
        return <window.DashDrillModal title={`Repeat Customers — ${rptRows.length}`} subtitle="Customers with 2+ orders · frequency · loyalty indicators" color="#7C3AED" onClose={close} width={900}><window.DashKPIs items={[['Repeat Customers',rptRows.length,'#7C3AED'],['% of Total',customerIntel.uniqueCustomers>0?(rptRows.length/customerIntel.uniqueCustomers*100).toFixed(1)+'%':'0%','var(--ok)'],['Revenue from Repeat',C(rptRev),'var(--or)'],['Avg Orders',rptRows.length>0?(rptRows.reduce((s,r)=>s+r.orders,0)/rptRows.length).toFixed(1):'0','var(--info)']]}/><window.DashBTable title="Repeat Customer List" rows={rptRows} cols={[{k:'name',h:'Customer'},{k:'orders',h:'Orders',r:true,b:true,cl:'#7C3AED'},{k:'rev',h:'Revenue',r:true,cl:'var(--or)',f:v=>C(v)},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'avgOrder',h:'Avg Order',r:true,f:v=>C(Math.round(v))},{k:'retention',h:'Retention'},{k:'lastDate',h:'Last Order',f:v=>v?window.fmtDate(v):'—'}]} maxH={420}/></window.DashDrillModal>;
      }
      case 'top3Concentration': {
        const rows3=customerIntel.rows; let cum=0;
        const ranked3=rows3.map((r,i)=>{const pct=customerIntel.totalRev>0?r.rev/customerIntel.totalRev*100:0;cum+=pct;return{...r,rank:i+1,pct:pct.toFixed(2),cumPct:cum.toFixed(2)};});
        const top5Rev=rows3.slice(0,5).reduce((s,r)=>s+r.rev,0);
        const top1Pct=rows3.length>0&&customerIntel.totalRev>0?(rows3[0].rev/customerIntel.totalRev*100).toFixed(1):'0.0';
        const top5Pct=customerIntel.totalRev>0?(top5Rev/customerIntel.totalRev*100).toFixed(1):'0.0';
        const risk=parseFloat(customerIntel.top3Pct)>70?'HIGH':parseFloat(customerIntel.top3Pct)>50?'MEDIUM':'LOW';
        return <window.DashDrillModal title="Revenue Concentration Analysis" subtitle="Top 3 dependency · diversification risk · customer concentration" color="#7C3AED" onClose={close} width={900}><window.DashKPIs items={[['Top Customer Share',top1Pct+'%','#7C3AED'],['Top 3 Share',customerIntel.top3Pct+'%',parseFloat(customerIntel.top3Pct)>60?'var(--err)':'var(--ok)'],['Top 5 Share',top5Pct+'%','var(--info)'],['Revenue Risk',risk,risk==='HIGH'?'var(--err)':risk==='MEDIUM'?'var(--warn)':'var(--ok)']]}/><window.DashBTable title="Customer Concentration Ranking" rows={ranked3} cols={[{k:'rank',h:'#',r:true},{k:'name',h:'Customer'},{k:'rev',h:'Revenue',r:true,b:true,cl:'#7C3AED',f:v=>C(v)},{k:'orders',h:'Orders',r:true},{k:'pct',h:'Share %',r:true,cl:'#7C3AED'},{k:'cumPct',h:'Cumulative %',r:true}]} maxH={420}/></window.DashDrillModal>;
      }
      case 'avgRevPerCustomer': {
        const sorted2=[...customerIntel.rows].sort((a,b)=>b.rev-a.rev);
        const median2=sorted2[Math.floor(sorted2.length/2)]?.rev||0;
        const above2=sorted2.filter(r=>r.rev>customerIntel.avgRevPerCustomer);
        const ranked2=sorted2.map((r,i)=>({...r,rank:i+1,segment:r.rev>customerIntel.avgRevPerCustomer*2?'Premium':r.rev>customerIntel.avgRevPerCustomer?'Above Avg':'Below Avg'}));
        return <window.DashDrillModal title="Revenue per Customer Analysis" subtitle="Distribution · ranking · segments · highest & lowest contributors" color="#7C3AED" onClose={close} width={900}><window.DashKPIs items={[['Avg Revenue',C(customerIntel.avgRevPerCustomer),'#7C3AED'],['Median Revenue',C(median2),'var(--info)'],['Above Average',above2.length+' customers','var(--ok)'],['Highest',C(sorted2[0]?.rev||0),'var(--or)']]}/><window.DashBTable title="Customer Revenue Ranking" rows={ranked2} cols={[{k:'rank',h:'#',r:true},{k:'name',h:'Customer'},{k:'rev',h:'Revenue',r:true,b:true,cl:'#7C3AED',f:v=>C(v)},{k:'orders',h:'Orders',r:true},{k:'avgOrder',h:'Avg Order',r:true,f:v=>C(Math.round(v))},{k:'segment',h:'Segment'}]} maxH={420}/></window.DashDrillModal>;
      }
      case 'customerProfile': {
        const cuId=drill.customerId;
        const cuName=Store.name('customers',cuId)||customerIntel.rows.find(r=>r.id===cuId)?.name||'Customer';
        const cuS=sales.filter(s=>s.customerId===cuId);
        const cuRev=cuS.reduce((s,o)=>s+(window.gAmt(o)),0),cuQty=cuS.reduce((s,o)=>s+(parseFloat(o.quantity)||0),0);
        const mM={};cuS.forEach(s=>{const k=Store.name('materials',s.materialId)||'Unknown';if(!mM[k])mM[k]={name:k,qty:0,rev:0,orders:0};mM[k].qty+=parseFloat(s.quantity)||0;mM[k].rev+=window.gAmt(s);mM[k].orders++;});
        const vM={};cuS.forEach(s=>{if(s.vehicleFull){if(!vM[s.vehicleFull])vM[s.vehicleFull]={name:s.vehicleFull,trips:0,qty:0};vM[s.vehicleFull].trips++;vM[s.vehicleFull].qty+=parseFloat(s.quantity)||0;}});
        const trM={};cuS.forEach(s=>{if(s.transporter){if(!trM[s.transporter])trM[s.transporter]={name:s.transporter,trips:0};trM[s.transporter].trips++;}});
        const mthM={};cuS.forEach(s=>{const m=(s.date||'').slice(0,7);if(!m)return;if(!mthM[m])mthM[m]={month:m,rev:0,qty:0,orders:0};mthM[m].rev+=window.gAmt(s);mthM[m].qty+=parseFloat(s.quantity)||0;mthM[m].orders++;});
        const timeline=[...cuS].sort((a,b)=>(b.date||'').localeCompare(a.date||'')).slice(0,100).map(s=>({date:s.date,material:Store.name('materials',s.materialId)||'—',vehicle:s.vehicleFull||'—',transporter:s.transporter||'—',challan:s.challanNumber||'—',qty:parseFloat(s.quantity)||0,rate:s.ratePerTon||s.rate||0,total:window.gAmt(s)}));
        return <window.DashDrillModal title={cuName} subtitle="Customer Profile · Revenue · Material Mix · Vehicles · Challan History · Trends" color="#7C3AED" onClose={close} width={980}><window.DashKPIs items={[['Revenue',C(cuRev),'#7C3AED'],['Qty Purchased',cuQty.toFixed(3)+' T','var(--ok)'],['Orders',cuS.length,'var(--info)'],['Avg Order',cuS.length>0?C(Math.round(cuRev/cuS.length)):'—','var(--or)'],['First Order',timeline.length>0?window.fmtDate(timeline[timeline.length-1].date):'—','var(--txt2)'],['Last Order',timeline.length>0?window.fmtDate(timeline[0].date):'—','var(--txt2)']]}/><div className="dd-2col" style={{marginBottom:14}}><window.DashBTable title="Material Mix" rows={Object.values(mM).sort((a,b)=>b.rev-a.rev)} 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.DashBTable title="Vehicles Used" rows={Object.values(vM).sort((a,b)=>b.trips-a.trips).slice(0,10)} 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)}]}/></div><window.DashBTable title="Monthly Trend" rows={Object.values(mthM).sort((a,b)=>a.month.localeCompare(b.month))} cols={[{k:'month',h:'Month'},{k:'rev',h:'Revenue',r:true,b:true,cl:'#7C3AED',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={`Challan History — ${timeline.length} records`} rows={timeline} cols={[{k:'date',h:'Date',f:v=>window.fmtDate(v)},{k:'material',h:'Material'},{k:'vehicle',h:'Vehicle',mono:true},{k:'transporter',h:'Transporter'},{k:'challan',h:'Challan',mono:true},{k:'qty',h:'Qty (T)',r:true,f:v=>v.toFixed(3)},{k:'rate',h:'Rate/T',r:true,f:v=>C(v)},{k:'total',h:'Amount',r:true,b:true,cl:'#7C3AED',f:v=>C(v)}]} maxH={280}/></window.DashDrillModal>;
      }
      case 'totalTrips': {
        const coSp={};transport.forEach(t=>{const k=Store.name('companies',t.companyId)||'Unknown';if(!coSp[k])coSp[k]={name:k,trips:0,qty:0};coSp[k].trips++;coSp[k].qty+=parseFloat(t.quantity)||0;});
        const matSp={};transport.forEach(t=>{const k=Store.name('materials',t.materialId)||t.material||'Unknown';if(!matSp[k])matSp[k]={name:k,trips:0,qty:0};matSp[k].trips++;matSp[k].qty+=parseFloat(t.quantity)||0;});
        const vehSp={};transport.forEach(t=>{const k=t.vehicleFull||t.vehicleNum||'';if(!k)return;if(!vehSp[k])vehSp[k]={name:k,trips:0,qty:0};vehSp[k].trips++;vehSp[k].qty+=parseFloat(t.quantity)||0;});
        const tQtyAll=transport.reduce((s,t)=>s+(parseFloat(t.quantity)||0),0);
        const tripLog=[...transport].sort((a,b)=>(b.date||'').localeCompare(a.date||'')).slice(0,100).map(t=>({date:t.date,transporter:t.transporter||'—',vehicle:t.vehicleFull||t.vehicleNum||'—',material:Store.name('materials',t.materialId)||t.material||'—',company:Store.name('companies',t.companyId)||'—',challan:t.challanNumber||'—',qty:parseFloat(t.quantity)||0}));
        return <window.DashDrillModal title={`Total Trips — ${transportIntel.totalTrips}`} subtitle="Trip history · company split · material split · vehicle split" color="var(--info)" onClose={close} width={980}><window.DashKPIs items={[['Total Trips',transportIntel.totalTrips,'var(--info)'],['Total Qty',window.formatQuantity(tQtyAll)+' T','var(--ok)'],['Unique Vehicles',transportIntel.uniqueVehicles,'var(--or)'],['Avg Qty/Trip',transport.length>0?(tQtyAll/transport.length).toFixed(3)+' T':'—','var(--txt2)']]}/><div className="dd-3col" style={{marginBottom:14}}><window.DashBTable title="By Company" rows={Object.values(coSp).sort((a,b)=>b.trips-a.trips)} cols={[{k:'name',h:'Company'},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--info)'},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)}]}/><window.DashBTable title="By Material" rows={Object.values(matSp).sort((a,b)=>b.trips-a.trips)} cols={[{k:'name',h:'Material'},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--or)'},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)}]}/><window.DashBTable title="By Vehicle" rows={Object.values(vehSp).sort((a,b)=>b.trips-a.trips).slice(0,12)} cols={[{k:'name',h:'Vehicle',mono:true},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--ok)'},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)}]}/></div><window.DashBTable title={`Trip Log — ${tripLog.length} records`} rows={tripLog} cols={[{k:'date',h:'Date',f:v=>window.fmtDate(v)},{k:'transporter',h:'Transporter'},{k:'vehicle',h:'Vehicle',mono:true},{k:'material',h:'Material'},{k:'company',h:'Company'},{k:'challan',h:'Challan',mono:true},{k:'qty',h:'Qty (T)',r:true,f:v=>v.toFixed(3)}]} maxH={280}/></window.DashDrillModal>;
      }
      case 'transportValue': {
        const tRowsV=transportIntel.transporterRows.map(r=>({...r,avgPerTrip:r.trips>0?Math.round(r.value/r.trips):0}));
        return <window.DashDrillModal title={`Transport Value — ${C(transportIntel.totalValue)}`} subtitle="Revenue breakdown · top transporters · average per trip" color="var(--info)" onClose={close} width={900}><window.DashKPIs items={[['Total Value',C(transportIntel.totalValue),'var(--info)'],['Avg/Trip',C(transportIntel.avgTripValue),'var(--or)'],['Total Trips',transportIntel.totalTrips,'var(--txt2)'],['Top Transporter',transportIntel.topTransporter?.name||'—','var(--txt)']]}/><window.DashBTable title="Transporter Value Breakdown" rows={tRowsV} cols={[{k:'name',h:'Transporter'},{k:'trips',h:'Trips',r:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Transport Value',r:true,b:true,cl:'var(--info)',f:v=>C(v)},{k:'avgPerTrip',h:'Avg/Trip',r:true,f:v=>C(v)}]} maxH={420}/></window.DashDrillModal>;
      }
      case 'uniqueVehicles': {
        const lastAct={};transport.forEach(t=>{const k=t.vehicleFull||t.vehicleNum||'';if(!k)return;if(!lastAct[k]||(t.date||'')>lastAct[k])lastAct[k]=t.date||'';});
        const vRowsU=transportIntel.vehicleRows.map(v=>({...v,lastDate:lastAct[v.name]||''}));
        return <window.DashDrillModal title={`Fleet — ${transportIntel.uniqueVehicles} Unique Vehicles`} subtitle="Complete fleet list · trip count · quantity moved · last activity date" color="var(--info)" onClose={close} width={880}><window.DashKPIs items={[['Unique Vehicles',transportIntel.uniqueVehicles,'var(--info)'],['Total Trips',transportIntel.totalTrips,'var(--ok)'],['Avg Trips/Vehicle',transportIntel.uniqueVehicles>0?(transportIntel.totalTrips/transportIntel.uniqueVehicles).toFixed(1):'—','var(--or)'],['Most Active',transportIntel.vehicleRows[0]?.name||'—','var(--txt)']]}/><window.DashBTable title="Vehicle Fleet" rows={vRowsU} cols={[{k:'name',h:'Vehicle No.',mono:true},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--info)'},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'lastDate',h:'Last Activity',f:v=>v?window.fmtDate(v):'—'}]} maxH={460}/></window.DashDrillModal>;
      }
      case 'topTransporterKpi': {
        const tRanked=transportIntel.transporterRows.map((r,i)=>({...r,rank:i+1}));
        return <window.DashDrillModal title="Transporter Ranking" subtitle="All transporters · trips · quantity · revenue · vehicles assigned" color="var(--info)" onClose={close} width={920}><window.DashKPIs items={[['Transporters',tRanked.length,'var(--info)'],['Top Transporter',tRanked[0]?.name||'—','var(--or)'],['Top — Trips',tRanked[0]?.trips||0,'var(--ok)'],['Top — Value',C(tRanked[0]?.value||0),'var(--txt)']]}/><window.DashBTable title="Transporter Leaderboard" rows={tRanked} cols={[{k:'rank',h:'#',r:true},{k:'name',h:'Transporter'},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--info)'},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Transport Value',r:true,cl:'var(--or)',f:v=>C(v)},{k:'vehs',h:'Vehicles',r:true},{k:'avgPerTrip',h:'Avg/Trip',r:true,f:v=>C(v)}]} maxH={460}/></window.DashDrillModal>;
      }
      case 'transporterProfile': {
        const tName=drill.transporterName;
        const tId=drill.transporterId;
        // ── Single shared matcher — uses IDENTICAL key logic to transportIntel's trInfo ──
        // transportIntel assigns every record to exactly one key: transporterId || name || '_unk'
        // transporterRow.id === that key (always), so we match by recomputing the same key
        // and comparing to tId. This guarantees the drill-down count is always identical
        // to the progress-bar count — no OR-based over-counting across key boundaries.
        function matchesTr(r){
          const rId=r.transporterId||'';
          const rName=(r.transporter&&r.transporter!=='—')?r.transporter
            :(rId?Store.name('transportersList',rId)||rId:'');
          const rKey=rId||rName||'_unk';
          return rKey===tId;
        }
        // ── Gather trips from ALL three sources (mirrors transportIntel exactly) ──
        const tTrips   = transport.filter(matchesTr);
        const tPurchTrips = purchases.filter(p=>matchesTr(p));
        const tSalesTrips = sales.filter(s=>matchesTr(s));
        // This is the single source-of-truth trip count — matches the progress bar value
        const totalTripCount = tTrips.length + tPurchTrips.length + tSalesTrips.length;
        // ── Aggregate qty from all sources ──
        const tQty = tTrips.reduce((s,t)=>s+(parseFloat(t.quantity)||0),0)
          + tPurchTrips.reduce((s,p)=>s+(p.items||[]).reduce((a,i)=>a+(parseFloat(i.quantity)||0),0),0)
          + tSalesTrips.reduce((s,s2)=>s+(parseFloat(s2.quantity)||0),0);
        const tVal=tTrips.reduce((s,t)=>s+(t.amount||0),0);
        // ── Vehicle map — all sources ──
        const vM2={};
        tTrips.forEach(t=>{const k=t.vehicleFull||t.vehicleNum||'';if(!k)return;if(!vM2[k])vM2[k]={name:k,trips:0,qty:0};vM2[k].trips++;vM2[k].qty+=parseFloat(t.quantity)||0;});
        tPurchTrips.forEach(p=>{const k=p.vehicleFull||'';if(!k)return;if(!vM2[k])vM2[k]={name:k,trips:0,qty:0};vM2[k].trips++;vM2[k].qty+=(p.items||[]).reduce((a,i)=>a+(parseFloat(i.quantity)||0),0);});
        tSalesTrips.forEach(s=>{const k=s.vehicleFull||'';if(!k)return;if(!vM2[k])vM2[k]={name:k,trips:0,qty:0};vM2[k].trips++;vM2[k].qty+=parseFloat(s.quantity)||0;});
        // ── Material map — all sources ──
        const mM2={};
        tTrips.forEach(t=>{const k=Store.name('materials',t.materialId)||t.material||'Unknown';if(!mM2[k])mM2[k]={name:k,trips:0,qty:0};mM2[k].trips++;mM2[k].qty+=parseFloat(t.quantity)||0;});
        tPurchTrips.forEach(p=>{const k=Store.name('materials',(p.items&&p.items[0]&&p.items[0].materialId)||p.materialId)||'Unknown';const qty=(p.items||[]).reduce((a,i)=>a+(parseFloat(i.quantity)||0),0);if(!mM2[k])mM2[k]={name:k,trips:0,qty:0};mM2[k].trips++;mM2[k].qty+=qty;});
        tSalesTrips.forEach(s=>{const k=Store.name('materials',s.materialId)||s.material||'Unknown';if(!mM2[k])mM2[k]={name:k,trips:0,qty:0};mM2[k].trips++;mM2[k].qty+=parseFloat(s.quantity)||0;});
        // ── Company map — all sources ──
        const cM2={};
        tTrips.forEach(t=>{const k=Store.name('companies',t.companyId)||'Unknown';if(!cM2[k])cM2[k]={name:k,trips:0,qty:0};cM2[k].trips++;cM2[k].qty+=parseFloat(t.quantity)||0;});
        tPurchTrips.forEach(p=>{const k=Store.name('companies',p.companyId)||'Unknown';const qty=(p.items||[]).reduce((a,i)=>a+(parseFloat(i.quantity)||0),0);if(!cM2[k])cM2[k]={name:k,trips:0,qty:0};cM2[k].trips++;cM2[k].qty+=qty;});
        tSalesTrips.forEach(s=>{const k=Store.name('companies',s.companyId)||'Unknown';if(!cM2[k])cM2[k]={name:k,trips:0,qty:0};cM2[k].trips++;cM2[k].qty+=parseFloat(s.quantity)||0;});
        // ── Unified trip log — all sources tagged by module ──
        const tLogRaw=[
          ...tTrips.map(t=>({date:t.date,vehicle:t.vehicleFull||t.vehicleNum||'—',material:Store.name('materials',t.materialId)||t.material||'—',company:Store.name('companies',t.companyId)||'—',challan:t.challanNumber||'—',qty:parseFloat(t.quantity)||0,value:t.amount||0,source:'Transport'})),
          ...tPurchTrips.map(p=>({date:p.date,vehicle:p.vehicleFull||'—',material:Store.name('materials',(p.items&&p.items[0]&&p.items[0].materialId)||p.materialId)||'—',company:Store.name('companies',p.companyId)||'—',challan:p.challanNumber||'—',qty:(p.items||[]).reduce((a,i)=>a+(parseFloat(i.quantity)||0),0),value:0,source:'Purchase'})),
          ...tSalesTrips.map(s=>({date:s.date,vehicle:s.vehicleFull||'—',material:Store.name('materials',s.materialId)||s.material||'—',company:Store.name('companies',s.companyId)||'—',challan:s.challanNumber||'—',qty:parseFloat(s.quantity)||0,value:window.gAmt(s),source:'Sale'})),
        ];
        const tLog=tLogRaw.sort((a,b)=>(b.date||'').localeCompare(a.date||'')).slice(0,200);
        return <window.DashDrillModal title={`${tName}`} subtitle="Transporter Profile · Fleet · Trip History · Materials · Company Distribution" color="var(--info)" onClose={close} width={980}><window.DashKPIs items={[['Total Trips',totalTripCount,'var(--info)'],['Total Qty',tQty.toFixed(3)+' T','var(--ok)'],['Transport Value',C(tVal),'var(--or)'],['Vehicles',Object.keys(vM2).length,'var(--txt2)'],['First Trip',tLog.length>0?window.fmtDate(tLog[tLog.length-1].date):'—','var(--txt2)'],['Last Trip',tLog.length>0?window.fmtDate(tLog[0].date):'—','var(--txt2)']]}/><div className="dd-2col" style={{marginBottom:14}}><window.DashBTable title="Vehicle Fleet" rows={Object.values(vM2).sort((a,b)=>b.trips-a.trips)} 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)}]}/><window.DashBTable title="Materials Transported" rows={Object.values(mM2).sort((a,b)=>b.qty-a.qty)} cols={[{k:'name',h:'Material'},{k:'trips',h:'Trips',r:true,b:true},{k:'qty',h:'Qty (T)',r:true,cl:'var(--or)',f:v=>v.toFixed(3)}]}/></div><window.DashBTable title="Company Distribution" rows={Object.values(cM2).sort((a,b)=>b.trips-a.trips)} cols={[{k:'name',h:'Company'},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--info)'},{k:'qty',h:'Qty (T)',r:true,f:v=>v.toFixed(3)}]}/><window.DashBTable title={`Trip History — ${tLog.length} records (Transport · Purchase · Sale)`} rows={tLog} cols={[{k:'date',h:'Date',f:v=>window.fmtDate(v)},{k:'source',h:'Source'},{k:'vehicle',h:'Vehicle',mono:true},{k:'material',h:'Material'},{k:'company',h:'Company'},{k:'challan',h:'Challan',mono:true},{k:'qty',h:'Qty (T)',r:true,f:v=>v.toFixed(3)},{k:'value',h:'Value',r:true,cl:'var(--info)',f:v=>C(v)}]} maxH={280}/></window.DashDrillModal>;
      }
      case 'totalTripsAll':
        return <TotalTripsAllDrill allTripsUnified={allTripsUnified} companies={companies} onClose={close}/>;

      case 'avgRevPerOrder': {
        const aroOrders=[...sales].sort((a,b)=>(b.date||'').localeCompare(a.date||'')).map(s=>({
          date:s.date, company:Store.name('companies',s.companyId)||'—',
          customer:Store.name('customers',s.customerId)||'—',
          material:Store.name('materials',s.materialId)||'—',
          challan:s.challanNumber||'—', qty:parseFloat(s.quantity)||0, total:window.gAmt(s),
        }));
        const aroByCust=(()=>{const m={};aroOrders.forEach(r=>{if(!m[r.customer])m[r.customer]={name:r.customer,orders:0,rev:0};m[r.customer].orders++;m[r.customer].rev+=r.total;});return Object.values(m).sort((a,b)=>b.rev-a.rev).map(r=>({...r,avgOrder:r.orders>0?Math.round(r.rev/r.orders):0}));})();
        const aroByCo=(()=>{const m={};aroOrders.forEach(r=>{if(!m[r.company])m[r.company]={name:r.company,orders:0,rev:0};m[r.company].orders++;m[r.company].rev+=r.total;});return Object.values(m).sort((a,b)=>b.rev-a.rev).map(r=>({...r,avgOrder:r.orders>0?Math.round(r.rev/r.orders):0}));})();
        const aroByMat=(()=>{const m={};aroOrders.forEach(r=>{if(!m[r.material])m[r.material]={name:r.material,orders:0,rev:0,qty:0};m[r.material].orders++;m[r.material].rev+=r.total;m[r.material].qty+=r.qty;});return Object.values(m).sort((a,b)=>b.rev-a.rev);})();
        return (
          <window.DashDrillModal title={`Avg Revenue / Sale Order — ${C(Math.round(avgRevPerOrder))}`} subtitle={`${sales.length} orders · ${C(totalRevenue)} total revenue`} color="var(--or)" onClose={close} width={980}>
            <window.DashKPIs items={[['Avg Rev / Order',C(Math.round(avgRevPerOrder)),'var(--or)'],['Total Revenue',C(totalRevenue),'var(--ok)'],['Total Orders',sales.length,'var(--info)'],['Top Customer',aroByCust[0]?.name||'—','var(--txt2)'],['Top Material',aroByMat[0]?.name||'—','var(--txt2)']]}/>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Customer-wise Breakdown" rows={aroByCust} cols={[{k:'name',h:'Customer'},{k:'orders',h:'Orders',r:true},{k:'rev',h:'Revenue',r:true,b:true,cl:'var(--or)',f:v=>C(v)},{k:'avgOrder',h:'Avg / Order',r:true,f:v=>C(v)}]}/>
              <window.DashBTable title="Company-wise Contribution" rows={aroByCo} cols={[{k:'name',h:'Company'},{k:'orders',h:'Orders',r:true},{k:'rev',h:'Revenue',r:true,b:true,cl:'var(--info)',f:v=>C(v)},{k:'avgOrder',h:'Avg / Order',r:true,f:v=>C(v)}]}/>
            </div>
            <window.DashBTable title="Material-wise Contribution" rows={aroByMat} cols={[{k:'name',h:'Material'},{k:'orders',h:'Orders',r:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'rev',h:'Revenue',r:true,b:true,cl:'var(--or)',f:v=>C(v)}]} maxH={180}/>
            <window.DashBTable title={`Order-wise Revenue — ${aroOrders.length} orders`} rows={aroOrders.slice(0,300)} cols={[{k:'date',h:'Date',f:v=>window.fmtDate(v)},{k:'company',h:'Company'},{k:'customer',h:'Customer'},{k:'material',h:'Material'},{k:'challan',h:'Challan',mono:true},{k:'qty',h:'Qty (T)',r:true,f:v=>v.toFixed(3)},{k:'total',h:'Revenue',r:true,b:true,cl:'var(--or)',f:v=>C(v)}]} maxH={300}/>
          </window.DashDrillModal>
        );
      }

      case 'vehicleUtilization': {
        const vuActiveSet=new Set(transport.map(t=>t.vehicleFull||t.vehicleNum).filter(Boolean));
        const vuAllSet=new Set(allTransport.map(t=>t.vehicleFull||t.vehicleNum).filter(Boolean));
        const vuIdle=[...vuAllSet].filter(v=>!vuActiveSet.has(v));
        const vuLastAct={};
        allTransport.forEach(t=>{const v=t.vehicleFull||t.vehicleNum;if(!v)return;if(!vuLastAct[v]||(t.date||'')>vuLastAct[v])vuLastAct[v]=t.date||'';});
        const vuVMap={};
        transport.forEach(t=>{const v=t.vehicleFull||t.vehicleNum||'';if(!v)return;if(!vuVMap[v])vuVMap[v]={name:v,trips:0,qty:0,revenue:0};vuVMap[v].trips++;vuVMap[v].qty+=parseFloat(t.quantity)||0;vuVMap[v].revenue+=t.amount||0;});
        sales.forEach(s=>{const v=s.vehicleFull||'';if(!v)return;if(!vuVMap[v])vuVMap[v]={name:v,trips:0,qty:0,revenue:0};vuVMap[v].trips++;vuVMap[v].qty+=parseFloat(s.quantity)||0;vuVMap[v].revenue+=window.gAmt(s);});
        const vuActiveRows=Object.values(vuVMap).sort((a,b)=>b.trips-a.trips).map(r=>({...r,status:'Active',lastDate:vuLastAct[r.name]||''}));
        const vuIdleRows=vuIdle.map(v=>({name:v,trips:0,qty:0,revenue:0,status:'Idle',lastDate:vuLastAct[v]||''})).sort((a,b)=>(b.lastDate||'').localeCompare(a.lastDate||''));
        return (
          <window.DashDrillModal title={`Vehicle Utilization — ${utilizationPct}%`} subtitle={`${activeVehCount} active · ${idleVehCount} idle · ${totalVehEver} total fleet`} color={parseFloat(utilizationPct)>=70?'var(--ok)':'var(--warn)'} onClose={close} width={980}>
            <window.DashKPIs items={[['Utilization %',utilizationPct+'%',parseFloat(utilizationPct)>=70?'var(--ok)':'var(--warn)'],['Active Vehicles',activeVehCount,'var(--ok)'],['Idle Vehicles',idleVehCount,idleVehCount>0?'var(--err)':'var(--ok)'],['Total Fleet',totalVehEver,'var(--info)'],['Trips (Period)',transport.length+sales.length,'var(--txt)']]}/>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title={`Active Vehicles — ${vuActiveRows.length}`} rows={vuActiveRows.slice(0,50)} cols={[{k:'name',h:'Vehicle No.',mono:true},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--ok)'},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'revenue',h:'Revenue',r:true,cl:'var(--or)',f:v=>C(v)},{k:'lastDate',h:'Last Active',f:v=>v?window.fmtDate(v):'—'}]}/>
              <window.DashBTable title={`Idle Vehicles — ${vuIdleRows.length}`} rows={vuIdleRows.slice(0,50)} cols={[{k:'name',h:'Vehicle No.',mono:true},{k:'status',h:'Status'},{k:'lastDate',h:'Last Activity',f:v=>v?window.fmtDate(v):'Never'}]}/>
            </div>
            <window.DashBTable title="Full Fleet Overview" rows={[...vuActiveRows,...vuIdleRows]} cols={[{k:'name',h:'Vehicle No.',mono:true},{k:'status',h:'Status'},{k:'trips',h:'Trips',r:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'revenue',h:'Revenue',r:true,cl:'var(--or)',f:v=>C(v)},{k:'lastDate',h:'Last Activity',f:v=>v?window.fmtDate(v):'—'}]} maxH={340}/>
          </window.DashDrillModal>
        );
      }

      case 'omgroupExec': {
        const totalTripsCount=leaderboard.reduce((s,co)=>s+co.trips,0);
        return <OmGroupExecDrill leaderboard={leaderboard} totalRevenue={totalRevenue} totalPurchCost={totalPurchCost} grossProfit={grossProfit} profitMargin={profitMargin} totalPurchTons={totalPurchTons} totalSoldTons={totalSoldTons} dieselCost={dieselCost} totalTripsCount={totalTripsCount} onCompanyDrill={co=>setDrill({type:'company',co})} onClose={close}/>;
      }
      case 'materialProfile': {
        const mId=drill.materialId,mName=drill.materialName;
        const mPurchItems=[];
        purchases.forEach(p=>{
          if(p.items&&p.items.length){
            p.items.filter(i=>(i.materialId||p.materialId)===mId).forEach(item=>{
              mPurchItems.push({date:p.date,vendor:Store.name('vendors',p.vendorId)||'—',company:Store.name('companies',p.companyId)||'—',challan:p.challanNumber||'—',vehicle:p.vehicleFull||'—',crusher:item.crusherSite?Store.name('crushers',item.crusherSite)||item.crusherSite:'—',qty:parseFloat(item.quantity)||0,total:window.gItemAmt(item)});
            });
          } else if(p.materialId===mId){
            mPurchItems.push({date:p.date,vendor:Store.name('vendors',p.vendorId)||'—',company:Store.name('companies',p.companyId)||'—',challan:p.challanNumber||'—',vehicle:p.vehicleFull||'—',crusher:'—',qty:parseFloat(p.quantity)||0,total:window.gAmt(p)});
          }
        });
        const mSales=sales.filter(s=>s.materialId===mId).map(s=>({date:s.date,customer:Store.name('customers',s.customerId)||'—',company:Store.name('companies',s.companyId)||'—',challan:s.challanNumber||'—',vehicle:s.vehicleFull||'—',qty:parseFloat(s.quantity)||0,total:window.gAmt(s)}));
        const mRev=mSales.reduce((s,r)=>s+r.total,0);
        const mCost=mPurchItems.reduce((s,r)=>s+r.total,0);
        const mProfit=mRev-mCost;
        const mSaleQty=mSales.reduce((s,r)=>s+r.qty,0);
        const mPurchQty=mPurchItems.reduce((s,r)=>s+r.qty,0);
        const byCustMap={};mSales.forEach(r=>{if(!byCustMap[r.customer])byCustMap[r.customer]={name:r.customer,trips:0,qty:0,revenue:0};byCustMap[r.customer].trips++;byCustMap[r.customer].qty+=r.qty;byCustMap[r.customer].revenue+=r.total;});
        const byVendMap={};mPurchItems.forEach(r=>{if(!byVendMap[r.vendor])byVendMap[r.vendor]={name:r.vendor,trips:0,qty:0,value:0};byVendMap[r.vendor].trips++;byVendMap[r.vendor].qty+=r.qty;byVendMap[r.vendor].value+=r.total;});
        const byCoMap={};[...mPurchItems.map(r=>({...r,isp:true})),...mSales.map(r=>({...r,isp:false}))].forEach(r=>{if(!byCoMap[r.company])byCoMap[r.company]={name:r.company,purchTrips:0,saleTrips:0,purchQty:0,saleQty:0,purchCost:0,rev:0};if(r.isp){byCoMap[r.company].purchTrips++;byCoMap[r.company].purchQty+=r.qty;byCoMap[r.company].purchCost+=r.total;}else{byCoMap[r.company].saleTrips++;byCoMap[r.company].saleQty+=r.qty;byCoMap[r.company].rev+=r.total;}});
        const byCrMap={};mPurchItems.forEach(r=>{if(r.crusher&&r.crusher!=='—'){if(!byCrMap[r.crusher])byCrMap[r.crusher]={name:r.crusher,trips:0,qty:0,value:0};byCrMap[r.crusher].trips++;byCrMap[r.crusher].qty+=r.qty;byCrMap[r.crusher].value+=r.total;}});
        const mthMap={};[...mPurchItems.map(r=>({...r,tp:'p'})),...mSales.map(r=>({...r,tp:'s'}))].forEach(r=>{const m=(r.date||'').slice(0,7);if(!m)return;if(!mthMap[m])mthMap[m]={month:m,purchQty:0,purchCost:0,saleQty:0,rev:0};if(r.tp==='p'){mthMap[m].purchQty+=r.qty;mthMap[m].purchCost+=r.total;}else{mthMap[m].saleQty+=r.qty;mthMap[m].rev+=r.total;}});
        const mthRows=Object.values(mthMap).sort((a,b)=>b.month.localeCompare(a.month));
        return(
          <window.DashDrillModal title={`${mName}`} subtitle="Material Intelligence · Sales · Purchases · Profit · Customers · Vendors · Crushers" color="#EA580C" onClose={close} width={980}>
            <window.DashKPIs items={[['Revenue',C(mRev),'#EA580C'],['Purchase Cost',C(mCost),'var(--txt2)'],['Gross Profit',C(mProfit),mProfit>=0?'var(--ok)':'var(--err)'],['Profit/Ton',mSaleQty>0?C(Math.round(mProfit/mSaleQty)):'—','var(--or)'],['Sale Trips',mSales.length,'#EA580C'],['Purch Trips',mPurchItems.length,'var(--txt2)'],['Purchased',window.formatQuantity(mPurchQty)+' T','var(--info)'],['Sold',window.formatQuantity(mSaleQty)+' T','var(--ok)']]}/>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Top Customers" rows={Object.values(byCustMap).sort((a,b)=>b.revenue-a.revenue)} cols={[{k:'name',h:'Customer'},{k:'trips',h:'Trips',r:true,b:true,cl:'#EA580C'},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'revenue',h:'Revenue',r:true,cl:'var(--or)',f:v=>C(v)}]} maxH={200}/>
              <window.DashBTable title="Top Vendors" rows={Object.values(byVendMap).sort((a,b)=>b.value-a.value)} cols={[{k:'name',h:'Vendor'},{k:'trips',h:'Trips',r:true,b:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Purchase',r:true,cl:'var(--txt2)',f:v=>C(v)}]} maxH={200}/>
            </div>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Crusher Distribution" rows={Object.values(byCrMap).sort((a,b)=>b.qty-a.qty)} cols={[{k:'name',h:'Crusher'},{k:'trips',h:'Trips',r:true,b:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Value',r:true,f:v=>C(v)}]} maxH={200}/>
              <window.DashBTable title="Company Distribution" rows={Object.values(byCoMap).sort((a,b)=>b.purchCost-a.purchCost)} cols={[{k:'name',h:'Company'},{k:'purchTrips',h:'Purch',r:true},{k:'saleTrips',h:'Sales',r:true},{k:'purchQty',h:'Purch T',r:true,f:v=>v.toFixed(1)},{k:'purchCost',h:'Cost',r:true,f:v=>C(v)}]} maxH={200}/>
            </div>
            <window.DashBTable title="Monthly Trend" rows={mthRows} cols={[{k:'month',h:'Month'},{k:'purchQty',h:'Purch T',r:true,f:v=>v.toFixed(2)},{k:'purchCost',h:'Cost',r:true,f:v=>C(v)},{k:'saleQty',h:'Sale T',r:true,f:v=>v.toFixed(2)},{k:'rev',h:'Revenue',r:true,cl:'var(--or)',f:v=>C(v)}]} maxH={140}/>
            <div className="dd-2col" style={{marginTop:14}}>
              <window.DashBTable title={`Purchase History — ${mPurchItems.length} records`} rows={[...mPurchItems].sort((a,b)=>(b.date||'').localeCompare(a.date||'')).slice(0,200)} cols={[{k:'date',h:'Date',f:v=>window.fmtDate(v)},{k:'vendor',h:'Vendor'},{k:'company',h:'Company'},{k:'challan',h:'Challan',mono:true},{k:'crusher',h:'Crusher'},{k:'qty',h:'T',r:true,f:v=>v.toFixed(3)},{k:'total',h:'Amount',r:true,f:v=>C(v)}]} maxH={260}/>
              <window.DashBTable title={`Sale History — ${mSales.length} records`} rows={[...mSales].sort((a,b)=>(b.date||'').localeCompare(a.date||'')).slice(0,200)} cols={[{k:'date',h:'Date',f:v=>window.fmtDate(v)},{k:'customer',h:'Customer'},{k:'company',h:'Company'},{k:'challan',h:'Challan',mono:true},{k:'qty',h:'T',r:true,f:v=>v.toFixed(3)},{k:'total',h:'Revenue',r:true,cl:'var(--or)',f:v=>C(v)}]} maxH={260}/>
            </div>
          </window.DashDrillModal>
        );
      }

      case 'vendorProfile': {
        const vId=drill.vendorId,vName=drill.vendorName;
        const vPurch=purchases.filter(p=>p.vendorId===vId);
        const vVal=vPurch.reduce((s,p)=>s+(window.gAmt(p)),0);
        const vQty=vPurch.reduce((s,p)=>s+((p.items&&p.items.length)?p.items.reduce((a,i)=>a+(parseFloat(i.quantity)||0),0):(parseFloat(p.quantity)||0)),0);
        const byMatMap={};vPurch.forEach(p=>{
          if(p.items&&p.items.length){p.items.forEach(item=>{const k=Store.name('materials',item.materialId)||'Unknown';if(!byMatMap[k])byMatMap[k]={name:k,trips:0,qty:0,value:0};byMatMap[k].trips++;byMatMap[k].qty+=parseFloat(item.quantity)||0;byMatMap[k].value+=parseFloat(item.total)||0;});}
          else{const k=Store.name('materials',p.materialId)||'Unknown';if(!byMatMap[k])byMatMap[k]={name:k,trips:0,qty:0,value:0};byMatMap[k].trips++;byMatMap[k].qty+=parseFloat(p.quantity)||0;byMatMap[k].value+=window.gAmt(p);}
        });
        const byCoMap={};vPurch.forEach(p=>{const k=Store.name('companies',p.companyId)||'Unknown';if(!byCoMap[k])byCoMap[k]={name:k,trips:0,qty:0,value:0};byCoMap[k].trips++;byCoMap[k].qty+=((p.items&&p.items.length)?p.items.reduce((a,i)=>a+(parseFloat(i.quantity)||0),0):(parseFloat(p.quantity)||0));byCoMap[k].value+=window.gAmt(p);});
        const byCrMap={};vPurch.forEach(p=>{(p.items||[]).forEach(item=>{const k=item.crusherSite?Store.name('crushers',item.crusherSite)||item.crusherSite:null;if(!k)return;if(!byCrMap[k])byCrMap[k]={name:k,trips:0,qty:0,value:0};byCrMap[k].trips++;byCrMap[k].qty+=parseFloat(item.quantity)||0;byCrMap[k].value+=parseFloat(item.total)||0;});});
        const byVehMap={};vPurch.forEach(p=>{const k=p.vehicleFull||p.vehicleNum;if(!k)return;if(!byVehMap[k])byVehMap[k]={name:k,trips:0,qty:0};byVehMap[k].trips++;byVehMap[k].qty+=((p.items&&p.items.length)?p.items.reduce((a,i)=>a+(parseFloat(i.quantity)||0),0):(parseFloat(p.quantity)||0));});
        const mthMap={};vPurch.forEach(p=>{const m=(p.date||'').slice(0,7);if(!m)return;if(!mthMap[m])mthMap[m]={month:m,trips:0,qty:0,value:0};mthMap[m].trips++;mthMap[m].qty+=((p.items&&p.items.length)?p.items.reduce((a,i)=>a+(parseFloat(i.quantity)||0),0):(parseFloat(p.quantity)||0));mthMap[m].value+=window.gAmt(p);});
        const mthRows=Object.values(mthMap).sort((a,b)=>b.month.localeCompare(a.month));
        const pLog=[...vPurch].sort((a,b)=>(b.date||'').localeCompare(a.date||'')).slice(0,200).map(p=>({date:p.date,company:Store.name('companies',p.companyId)||'—',challan:p.challanNumber||'—',vehicle:p.vehicleFull||'—',material:p.items&&p.items[0]?Store.name('materials',p.items[0].materialId)||'—':Store.name('materials',p.materialId)||'—',qty:(p.items&&p.items.length)?p.items.reduce((a,i)=>a+(parseFloat(i.quantity)||0),0):(parseFloat(p.quantity)||0),total:window.gAmt(p)}));
        return(
          <window.DashDrillModal title={`${vName}`} subtitle="Vendor Intelligence · Purchase History · Materials · Companies · Vehicles · Monthly Trend" color="#78350F" onClose={close} width={980}>
            <window.DashKPIs items={[['Total Purchase',C(vVal),'#78350F'],['Total Qty',window.formatQuantity(vQty)+' T','var(--ok)'],['Trips',vPurch.length,'var(--info)'],['Avg/Trip',C(vPurch.length>0?Math.round(vVal/vPurch.length):0),'var(--txt2)'],['Materials',Object.keys(byMatMap).length,'#EA580C'],['Companies',Object.keys(byCoMap).length,'var(--txt2)'],['Crushers Used',Object.keys(byCrMap).length,'#6B7280']]}/>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Materials Purchased" rows={Object.values(byMatMap).sort((a,b)=>b.value-a.value)} cols={[{k:'name',h:'Material'},{k:'trips',h:'Trips',r:true,b:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Amount',r:true,cl:'#78350F',f:v=>C(v)}]} maxH={200}/>
              <window.DashBTable title="Company Distribution" rows={Object.values(byCoMap).sort((a,b)=>b.value-a.value)} cols={[{k:'name',h:'Company'},{k:'trips',h:'Trips',r:true,b:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Amount',r:true,f:v=>C(v)}]} maxH={200}/>
            </div>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Crusher Sources" rows={Object.values(byCrMap).sort((a,b)=>b.value-a.value)} cols={[{k:'name',h:'Crusher'},{k:'trips',h:'Trips',r:true,b:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Amount',r:true,f:v=>C(v)}]} maxH={200}/>
              <window.DashBTable title="Vehicle Distribution" rows={Object.values(byVehMap).sort((a,b)=>b.trips-a.trips).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=>window.formatQuantity(v)}]} maxH={200}/>
            </div>
            <window.DashBTable title="Monthly Trend" rows={mthRows} cols={[{k:'month',h:'Month'},{k:'trips',h:'Trips',r:true,b:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Purchase Value',r:true,cl:'#78350F',f:v=>C(v)}]} maxH={130}/>
            <window.DashBTable title={`Purchase History — ${pLog.length} records`} rows={pLog} cols={[{k:'date',h:'Date',f:v=>window.fmtDate(v)},{k:'company',h:'Company'},{k:'material',h:'Material'},{k:'challan',h:'Challan',mono:true},{k:'vehicle',h:'Vehicle',mono:true},{k:'qty',h:'T',r:true,f:v=>v.toFixed(3)},{k:'total',h:'Amount',r:true,cl:'#78350F',f:v=>C(v)}]} maxH={260}/>
          </window.DashDrillModal>
        );
      }

      case 'crusherProfile': {
        const crId=drill.crusherId,crName=drill.crusherName;
        const crInfo=Store.all('crushers').find(c=>c.id===crId)||{};
        const crItems=[];
        purchases.forEach(p=>{
          (p.items||[]).filter(i=>i.crusherSite===crId).forEach(item=>{
            crItems.push({date:p.date,vendor:Store.name('vendors',p.vendorId)||'—',company:Store.name('companies',p.companyId)||'—',challan:p.challanNumber||'—',vehicle:p.vehicleFull||'—',material:Store.name('materials',item.materialId)||'—',qty:parseFloat(item.quantity)||0,total:window.gItemAmt(item)});
          });
        });
        const crVal=crItems.reduce((s,r)=>s+r.total,0);
        const crQty=crItems.reduce((s,r)=>s+r.qty,0);
        const byMatMap={};crItems.forEach(r=>{if(!byMatMap[r.material])byMatMap[r.material]={name:r.material,trips:0,qty:0,value:0};byMatMap[r.material].trips++;byMatMap[r.material].qty+=r.qty;byMatMap[r.material].value+=r.total;});
        const byVendMap={};crItems.forEach(r=>{if(!byVendMap[r.vendor])byVendMap[r.vendor]={name:r.vendor,trips:0,qty:0,value:0};byVendMap[r.vendor].trips++;byVendMap[r.vendor].qty+=r.qty;byVendMap[r.vendor].value+=r.total;});
        const byCoMap={};crItems.forEach(r=>{if(!byCoMap[r.company])byCoMap[r.company]={name:r.company,trips:0,qty:0,value:0};byCoMap[r.company].trips++;byCoMap[r.company].qty+=r.qty;byCoMap[r.company].value+=r.total;});
        const byVehMap={};crItems.forEach(r=>{if(!byVehMap[r.vehicle])byVehMap[r.vehicle]={name:r.vehicle,trips:0,qty:0};byVehMap[r.vehicle].trips++;byVehMap[r.vehicle].qty+=r.qty;});
        const mthMap={};crItems.forEach(r=>{const m=(r.date||'').slice(0,7);if(!m)return;if(!mthMap[m])mthMap[m]={month:m,trips:0,qty:0,value:0};mthMap[m].trips++;mthMap[m].qty+=r.qty;mthMap[m].value+=r.total;});
        const mthRows=Object.values(mthMap).sort((a,b)=>b.month.localeCompare(a.month));
        return(
          <window.DashDrillModal title={crName} subtitle={`Crusher Profile${crInfo.owner?' · Owner: '+crInfo.owner:''}${crInfo.location?' · '+crInfo.location:''}`} color="#6B7280" onClose={close} width={980}>
            <window.DashKPIs items={[['Total Purchase',C(crVal),'#6B7280'],['Total Qty',window.formatQuantity(crQty)+' T','var(--ok)'],['Trips',crItems.length,'var(--info)'],['Materials',Object.keys(byMatMap).length,'#EA580C'],['Vendors',Object.keys(byVendMap).length,'#78350F'],['Companies',Object.keys(byCoMap).length,'var(--txt2)'],['Owner',crInfo.owner||'—','var(--txt2)'],['Location',crInfo.location||'—','var(--txt2)']]}/>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Materials Sourced" rows={Object.values(byMatMap).sort((a,b)=>b.qty-a.qty)} cols={[{k:'name',h:'Material'},{k:'trips',h:'Trips',r:true,b:true,cl:'var(--info)'},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Value',r:true,cl:'#6B7280',f:v=>C(v)}]} maxH={200}/>
              <window.DashBTable title="Vendor Distribution" rows={Object.values(byVendMap).sort((a,b)=>b.value-a.value)} cols={[{k:'name',h:'Vendor'},{k:'trips',h:'Trips',r:true,b:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Amount',r:true,f:v=>C(v)}]} maxH={200}/>
            </div>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Company Distribution" rows={Object.values(byCoMap).sort((a,b)=>b.value-a.value)} cols={[{k:'name',h:'Company'},{k:'trips',h:'Trips',r:true,b:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Amount',r:true,f:v=>C(v)}]} maxH={200}/>
              <window.DashBTable title="Vehicle Distribution" rows={Object.values(byVehMap).sort((a,b)=>b.trips-a.trips).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=>window.formatQuantity(v)}]} maxH={200}/>
            </div>
            <window.DashBTable title="Monthly Trend" rows={mthRows} cols={[{k:'month',h:'Month'},{k:'trips',h:'Trips',r:true,b:true},{k:'qty',h:'Qty (T)',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Value',r:true,cl:'#6B7280',f:v=>C(v)}]} maxH={130}/>
            <window.DashBTable title={`Purchase History — ${crItems.length} records`} rows={[...crItems].sort((a,b)=>(b.date||'').localeCompare(a.date||'')).slice(0,200)} cols={[{k:'date',h:'Date',f:v=>window.fmtDate(v)},{k:'vendor',h:'Vendor'},{k:'company',h:'Company'},{k:'material',h:'Material'},{k:'challan',h:'Challan',mono:true},{k:'vehicle',h:'Vehicle',mono:true},{k:'qty',h:'T',r:true,f:v=>v.toFixed(3)},{k:'total',h:'Amount',r:true,f:v=>C(v)}]} maxH={260}/>
          </window.DashDrillModal>
        );
      }

      case 'matUniqueMaterials': {
        const now30v=new Date(Date.now()-30*86400000).toISOString().slice(0,10);
        const now90v=new Date(Date.now()-90*86400000).toISOString().slice(0,10);
        const matDirRows=materialIntel.rows.map(r=>{
          const mP=purchases.filter(p=>p.materialId===r.id||(p.items||[]).some(i=>i.materialId===r.id));
          const mS=sales.filter(s=>s.materialId===r.id);
          const allD=[...mP,...mS].map(x=>x.date||'').filter(Boolean).sort();
          const firstDate=allD[0]||'';const lastDate=allD[allD.length-1]||'';
          const status=!lastDate?'Never':lastDate>=now30v?'Active':lastDate>=now90v?'Slow':'Inactive';
          return{...r,firstDate,lastDate,status};
        }).sort((a,b)=>(a.name||'').localeCompare(b.name||''));
        return(
          <window.DashDrillModal title={`Material Directory \u2014 ${materialIntel.uniqueMaterials} Materials`} subtitle="Complete material registry \u00b7 activity status \u00b7 purchase & sales frequency" color="#EA580C" onClose={close} width={1020}>
            <window.DashKPIs items={[['Total Materials',materialIntel.uniqueMaterials,'#EA580C'],['Active \u226430d',matDirRows.filter(r=>r.status==='Active').length,'var(--ok)'],['Slow 30\u201390d',matDirRows.filter(r=>r.status==='Slow').length,'var(--warn)'],['Inactive',matDirRows.filter(r=>r.status==='Inactive').length,'var(--err)'],['With Revenue',materialIntel.rows.filter(r=>r.rev>0).length,'var(--or)'],['Purchased',materialIntel.rows.filter(r=>r.purchTrips>0).length,'var(--txt2)']]}/>
            <window.DashBTable title="Material Directory" rows={matDirRows} cols={[{k:'name',h:'Material',b:true},{k:'status',h:'Status'},{k:'purchTrips',h:'Purch Trips',r:true,cl:'var(--txt2)'},{k:'saleTrips',h:'Sale Trips',r:true,cl:'#EA580C'},{k:'vendors',h:'Vendors',r:true},{k:'companies',h:'Companies',r:true},{k:'purchQty',h:'Purch T',r:true,f:v=>v.toFixed(1)},{k:'saleQty',h:'Sold T',r:true,f:v=>v.toFixed(1)},{k:'firstDate',h:'First',f:v=>v?window.fmtDate(v):'\u2014'},{k:'lastDate',h:'Last Activity',f:v=>v?window.fmtDate(v):'\u2014'}]} maxH={520}/>
          </window.DashDrillModal>
        );
      }

      case 'matRevenue': {
        const revRows=[...materialIntel.rows].sort((a,b)=>b.rev-a.rev).map((r,i)=>({...r,rank:i+1,revPct:materialIntel.totalRev>0?(r.rev/materialIntel.totalRev*100).toFixed(1):'0.0',revPerTon:r.saleQty>0?Math.round(r.rev/r.saleQty):0}));
        const byCoRev={};sales.forEach(s=>{const k=Store.name('companies',s.companyId)||'Unknown';if(!byCoRev[k])byCoRev[k]={name:k,rev:0,qty:0,orders:0};byCoRev[k].rev+=window.gAmt(s);byCoRev[k].qty+=parseFloat(s.quantity)||0;byCoRev[k].orders++;});
        const byCuRev={};sales.forEach(s=>{const k=Store.name('customers',s.customerId)||'Unknown';if(!byCuRev[k])byCuRev[k]={name:k,rev:0,qty:0};byCuRev[k].rev+=window.gAmt(s);byCuRev[k].qty+=parseFloat(s.quantity)||0;});
        const byMthRev={};sales.forEach(s=>{const m=(s.date||'').slice(0,7);if(!m)return;if(!byMthRev[m])byMthRev[m]={month:m,rev:0,qty:0};byMthRev[m].rev+=window.gAmt(s);byMthRev[m].qty+=parseFloat(s.quantity)||0;});
        const totalSQ=materialIntel.rows.reduce((s,r)=>s+r.saleQty,0);
        return(
          <window.DashDrillModal title={`Material Revenue \u2014 ${C(materialIntel.totalRev)}`} subtitle="Revenue by material \u00b7 trend \u00b7 company \u00b7 customer \u00b7 per-ton analysis" color="#EA580C" onClose={close} width={1020}>
            <window.DashKPIs items={[['Total Revenue',C(materialIntel.totalRev),'#EA580C'],['Top Material',revRows[0]?.name||'\u2014','var(--or)'],['Top Revenue',C(revRows[0]?.rev||0),'var(--ok)'],['Avg Rev/Ton',totalSQ>0?C(Math.round(materialIntel.totalRev/totalSQ)):'\u2014','var(--info)'],['Active Materials',revRows.filter(r=>r.rev>0).length,'var(--txt2)']]}/>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Revenue by Material" rows={revRows} cols={[{k:'rank',h:'#',r:true},{k:'name',h:'Material',b:true},{k:'rev',h:'Revenue',r:true,b:true,cl:'#EA580C',f:v=>C(v)},{k:'saleQty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'revPerTon',h:'Rev/Ton',r:true,f:v=>C(v)},{k:'revPct',h:'Share%',r:true}]} maxH={320}/>
              <window.DashBTable title="Revenue by Month" rows={Object.values(byMthRev).sort((a,b)=>b.month.localeCompare(a.month))} cols={[{k:'month',h:'Month'},{k:'rev',h:'Revenue',r:true,b:true,cl:'#EA580C',f:v=>C(v)},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)}]} maxH={320}/>
            </div>
            <div className="dd-2col">
              <window.DashBTable title="Revenue by Company" rows={Object.values(byCoRev).sort((a,b)=>b.rev-a.rev)} cols={[{k:'name',h:'Company',b:true},{k:'rev',h:'Revenue',r:true,cl:'var(--or)',f:v=>C(v)},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'orders',h:'Orders',r:true}]} maxH={220}/>
              <window.DashBTable title="Revenue by Customer" rows={Object.values(byCuRev).sort((a,b)=>b.rev-a.rev)} cols={[{k:'name',h:'Customer',b:true},{k:'rev',h:'Revenue',r:true,cl:'#EA580C',f:v=>C(v)},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)}]} maxH={220}/>
            </div>
          </window.DashDrillModal>
        );
      }

      case 'matPurchCost': {
        const costRows=[...materialIntel.rows].filter(r=>r.purchCost>0).sort((a,b)=>b.purchCost-a.purchCost).map((r,i)=>({...r,rank:i+1,costPerTon:r.purchQty>0?Math.round(r.purchCost/r.purchQty):0,pct:materialIntel.totalPC>0?(r.purchCost/materialIntel.totalPC*100).toFixed(1):'0.0'}));
        const byVendC={};purchases.forEach(p=>{const k=Store.name('vendors',p.vendorId)||'Unknown';const v=window.gAmt(p);const q=(p.items&&p.items.length)?p.items.reduce((s,i)=>s+(parseFloat(i.quantity)||0),0):(parseFloat(p.quantity)||0);if(!byVendC[k])byVendC[k]={name:k,value:0,qty:0,trips:0};byVendC[k].value+=v;byVendC[k].qty+=q;byVendC[k].trips++;});
        const byCrC={};purchases.forEach(p=>{(p.items||[]).forEach(item=>{const k=item.crusherSite?Store.name('crushers',item.crusherSite)||item.crusherSite:null;if(!k)return;if(!byCrC[k])byCrC[k]={name:k,value:0,qty:0,trips:0};byCrC[k].value+=parseFloat(item.total)||0;byCrC[k].qty+=parseFloat(item.quantity)||0;byCrC[k].trips++;});});
        const byMthC={};purchases.forEach(p=>{const m=(p.date||'').slice(0,7);if(!m)return;const v=window.gAmt(p);const q=(p.items&&p.items.length)?p.items.reduce((s,i)=>s+(parseFloat(i.quantity)||0),0):(parseFloat(p.quantity)||0);if(!byMthC[m])byMthC[m]={month:m,value:0,qty:0,trips:0};byMthC[m].value+=v;byMthC[m].qty+=q;byMthC[m].trips++;});
        const totalPQ=materialIntel.rows.reduce((s,r)=>s+r.purchQty,0);
        return(
          <window.DashDrillModal title={`Purchase Cost \u2014 ${C(materialIntel.totalPC)}`} subtitle="Cost by material \u00b7 vendor-wise \u00b7 crusher-wise \u00b7 trend \u00b7 cost per ton" color="#EA580C" onClose={close} width={1020}>
            <window.DashKPIs items={[['Total Cost',C(materialIntel.totalPC),'#EA580C'],['Highest Mat',costRows[0]?.name||'\u2014','var(--err)'],['Highest Cost',C(costRows[0]?.purchCost||0),'var(--err)'],['Avg Cost/Ton',totalPQ>0?C(Math.round(materialIntel.totalPC/totalPQ)):'\u2014','var(--warn)'],['Total Qty',window.formatQuantity(totalPQ)+' T','var(--ok)']]}/>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Cost by Material" rows={costRows} cols={[{k:'rank',h:'#',r:true},{k:'name',h:'Material',b:true},{k:'purchCost',h:'Total Cost',r:true,b:true,cl:'#EA580C',f:v=>C(v)},{k:'purchQty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'costPerTon',h:'Cost/Ton',r:true,f:v=>C(v)},{k:'pct',h:'Share%',r:true}]} maxH={300}/>
              <window.DashBTable title="Vendor-wise Cost" rows={Object.values(byVendC).sort((a,b)=>b.value-a.value)} cols={[{k:'name',h:'Vendor',b:true},{k:'trips',h:'Trips',r:true},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Cost',r:true,b:true,cl:'#EA580C',f:v=>C(v)}]} maxH={300}/>
            </div>
            <div className="dd-2col">
              <window.DashBTable title="Crusher-wise Cost" rows={Object.values(byCrC).sort((a,b)=>b.value-a.value)} cols={[{k:'name',h:'Crusher',b:true},{k:'trips',h:'Trips',r:true},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Cost',r:true,f:v=>C(v)}]} maxH={200}/>
              <window.DashBTable title="Cost by Month" rows={Object.values(byMthC).sort((a,b)=>b.month.localeCompare(a.month))} cols={[{k:'month',h:'Month'},{k:'trips',h:'Trips',r:true},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Cost',r:true,b:true,cl:'#EA580C',f:v=>C(v)}]} maxH={200}/>
            </div>
          </window.DashDrillModal>
        );
      }

      case 'matGrossProfit': {
        const totalProfit=materialIntel.totalRev-materialIntel.totalPC;
        const profRows=[...materialIntel.rows].sort((a,b)=>b.profit-a.profit).map((r,i)=>({...r,rank:i+1,margin:r.rev>0?(r.profit/r.rev*100).toFixed(1):'\u2014',profPerTon:r.saleQty>0?Math.round(r.profit/r.saleQty):0}));
        const byCoP={};
        sales.forEach(s=>{const k=Store.name('companies',s.companyId)||'Unknown';if(!byCoP[k])byCoP[k]={name:k,rev:0,cost:0};byCoP[k].rev+=window.gAmt(s);});
        purchases.forEach(p=>{const k=Store.name('companies',p.companyId)||'Unknown';if(!byCoP[k])byCoP[k]={name:k,rev:0,cost:0};const v=window.gAmt(p);byCoP[k].cost+=v;});
        const coPRows=Object.values(byCoP).map(r=>({...r,profit:r.rev-r.cost,margin:r.rev>0?((r.rev-r.cost)/r.rev*100).toFixed(1):'\u2014'})).sort((a,b)=>b.profit-a.profit);
        const byMthP={};
        sales.forEach(s=>{const m=(s.date||'').slice(0,7);if(!m)return;if(!byMthP[m])byMthP[m]={month:m,rev:0,cost:0};byMthP[m].rev+=window.gAmt(s);});
        purchases.forEach(p=>{const m=(p.date||'').slice(0,7);if(!m)return;if(!byMthP[m])byMthP[m]={month:m,rev:0,cost:0};const v=window.gAmt(p);byMthP[m].cost+=v;});
        const mthPRows=Object.values(byMthP).map(r=>({...r,profit:r.rev-r.cost,margin:r.rev>0?((r.rev-r.cost)/r.rev*100).toFixed(1):'\u2014'})).sort((a,b)=>b.month.localeCompare(a.month));
        const byCuP={};sales.forEach(s=>{const k=Store.name('customers',s.customerId)||'Unknown';if(!byCuP[k])byCuP[k]={name:k,rev:0,qty:0};byCuP[k].rev+=window.gAmt(s);byCuP[k].qty+=parseFloat(s.quantity)||0;});
        const totalSQ2=materialIntel.rows.reduce((s,r)=>s+r.saleQty,0);
        return(
          <window.DashDrillModal title={`Gross Profit \u2014 ${C(totalProfit)}`} subtitle="Profit by material \u00b7 trend \u00b7 margin \u00b7 per-ton \u00b7 company & customer contribution" color={totalProfit>=0?'var(--ok)':'var(--err)'} onClose={close} width={1020}>
            <window.DashKPIs items={[['Gross Profit',C(totalProfit),totalProfit>=0?'var(--ok)':'var(--err)'],['Margin',materialIntel.totalRev>0?((totalProfit/materialIntel.totalRev)*100).toFixed(1)+'%':'\u2014',totalProfit>=0?'var(--ok)':'var(--err)'],['Best Material',profRows[0]?.name||'\u2014','var(--ok)'],['Best Profit',C(profRows[0]?.profit||0),'var(--ok)'],['Avg Profit/Ton',totalSQ2>0?C(Math.round(totalProfit/totalSQ2)):'\u2014','var(--info)']]}/>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Profit by Material" rows={profRows} cols={[{k:'rank',h:'#',r:true},{k:'name',h:'Material',b:true},{k:'profit',h:'Gross Profit',r:true,b:true,cl:'var(--ok)',f:v=>C(v)},{k:'margin',h:'Margin%',r:true,cl:'var(--info)'},{k:'profPerTon',h:'Profit/Ton',r:true,f:v=>C(v)}]} maxH={300}/>
              <window.DashBTable title="Profit Trend by Month" rows={mthPRows} cols={[{k:'month',h:'Month'},{k:'rev',h:'Revenue',r:true,f:v=>C(v)},{k:'cost',h:'Cost',r:true,f:v=>C(v)},{k:'profit',h:'Profit',r:true,b:true,cl:'var(--ok)',f:v=>C(v)},{k:'margin',h:'Margin%',r:true}]} maxH={300}/>
            </div>
            <div className="dd-2col">
              <window.DashBTable title="Company Contribution" rows={coPRows} cols={[{k:'name',h:'Company',b:true},{k:'rev',h:'Revenue',r:true,f:v=>C(v)},{k:'cost',h:'Cost',r:true,f:v=>C(v)},{k:'profit',h:'Profit',r:true,b:true,cl:'var(--ok)',f:v=>C(v)},{k:'margin',h:'Margin%',r:true}]} maxH={200}/>
              <window.DashBTable title="Customer Revenue Contribution" rows={Object.values(byCuP).sort((a,b)=>b.rev-a.rev)} cols={[{k:'name',h:'Customer',b:true},{k:'rev',h:'Revenue',r:true,b:true,cl:'var(--or)',f:v=>C(v)},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)}]} maxH={200}/>
            </div>
          </window.DashDrillModal>
        );
      }

      case 'vendUnique': {
        const vNow30=new Date(Date.now()-30*86400000).toISOString().slice(0,10);
        const vNow90=new Date(Date.now()-90*86400000).toISOString().slice(0,10);
        const vendDirRows=vendorIntel.rows.map((v,i)=>{
          const vP=purchases.filter(p=>p.vendorId===v.id);
          const dates=vP.map(p=>p.date||'').filter(Boolean).sort();
          const firstDate=dates[0]||'';const lastDate=dates[dates.length-1]||'';
          const status=!lastDate?'Never':lastDate>=vNow30?'Active':lastDate>=vNow90?'Slow':'Inactive';
          return{...v,rank:i+1,firstDate,lastDate,status};
        }).sort((a,b)=>(a.name||'').localeCompare(b.name||''));
        const matSupMap={};
        purchases.forEach(p=>{
          if(p.items&&p.items.length){p.items.forEach(item=>{const k=Store.name('materials',item.materialId)||'Unknown';if(!matSupMap[k])matSupMap[k]={name:k,vendors:new Set(),qty:0,value:0};matSupMap[k].vendors.add(p.vendorId);matSupMap[k].qty+=parseFloat(item.quantity)||0;matSupMap[k].value+=parseFloat(item.total)||0;});}
          else{const k=Store.name('materials',p.materialId)||'Unknown';if(!matSupMap[k])matSupMap[k]={name:k,vendors:new Set(),qty:0,value:0};matSupMap[k].vendors.add(p.vendorId);matSupMap[k].qty+=parseFloat(p.quantity)||0;matSupMap[k].value+=window.gAmt(p);}
        });
        const matSupRows=Object.values(matSupMap).map(r=>({...r,vendors:r.vendors.size})).sort((a,b)=>b.value-a.value);
        return(
          <window.DashDrillModal title={`Vendor Directory \u2014 ${vendorIntel.uniqueVendors} Vendors`} subtitle="Complete vendor registry \u00b7 activity status \u00b7 material supply mix \u00b7 company distribution" color="#78350F" onClose={close} width={1020}>
            <window.DashKPIs items={[['Total Vendors',vendorIntel.uniqueVendors,'#78350F'],['Active \u226430d',vendDirRows.filter(r=>r.status==='Active').length,'var(--ok)'],['Slow 30\u201390d',vendDirRows.filter(r=>r.status==='Slow').length,'var(--warn)'],['Inactive',vendDirRows.filter(r=>r.status==='Inactive').length,'var(--err)'],['Total Value',C(vendorIntel.totalValue),'var(--or)'],['Avg/Vendor',C(vendorIntel.avgPerVendor),'var(--txt2)']]}/>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Vendor Directory" rows={vendDirRows} cols={[{k:'name',h:'Vendor',b:true},{k:'status',h:'Status'},{k:'trips',h:'Trips',r:true,b:true,cl:'#78350F'},{k:'value',h:'Total Value',r:true,cl:'var(--or)',f:v=>C(v)},{k:'mats',h:'Materials',r:true},{k:'companies',h:'Companies',r:true},{k:'lastDate',h:'Last Activity',f:v=>v?window.fmtDate(v):'\u2014'}]} maxH={400}/>
              <window.DashBTable title="Material Supply Mix" rows={matSupRows} cols={[{k:'name',h:'Material',b:true},{k:'vendors',h:'Vendors',r:true,b:true,cl:'#78350F'},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Value',r:true,f:v=>C(v)}]} maxH={400}/>
            </div>
          </window.DashDrillModal>
        );
      }

      case 'vendTotalValue': {
        const vtvRows=[...vendorIntel.rows].sort((a,b)=>b.value-a.value).map((r,i)=>({...r,rank:i+1,pct:vendorIntel.totalValue>0?(r.value/vendorIntel.totalValue*100).toFixed(1):'0.0',valuePerTrip:r.trips>0?Math.round(r.value/r.trips):0}));
        const byCoVtv={};purchases.forEach(p=>{const k=Store.name('companies',p.companyId)||'Unknown';const v=window.gAmt(p);if(!byCoVtv[k])byCoVtv[k]={name:k,value:0,trips:0};byCoVtv[k].value+=v;byCoVtv[k].trips++;});
        const byMthVtv={};purchases.forEach(p=>{const m=(p.date||'').slice(0,7);if(!m)return;const v=window.gAmt(p);if(!byMthVtv[m])byMthVtv[m]={month:m,value:0,trips:0};byMthVtv[m].value+=v;byMthVtv[m].trips++;});
        const top3Vtv=vtvRows.slice(0,3).reduce((s,r)=>s+r.value,0);
        const top3PctVtv=vendorIntel.totalValue>0?(top3Vtv/vendorIntel.totalValue*100).toFixed(1):'0.0';
        return(
          <window.DashDrillModal title={`Total Purchase Value \u2014 ${C(vendorIntel.totalValue)}`} subtitle="Value by vendor \u00b7 company split \u00b7 monthly trend \u00b7 concentration analysis" color="#78350F" onClose={close} width={1020}>
            <window.DashKPIs items={[['Total Value',C(vendorIntel.totalValue),'#78350F'],['Total Trips',purchases.length,'var(--info)'],['Top Vendor',vtvRows[0]?.name||'\u2014','var(--ok)'],['Top Value',C(vtvRows[0]?.value||0),'var(--ok)'],['Top 3 Share',top3PctVtv+'%',parseFloat(top3PctVtv)>60?'var(--err)':'var(--ok)'],['Avg/Vendor',C(vendorIntel.avgPerVendor),'var(--txt2)']]}/>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Value by Vendor (Ranked)" rows={vtvRows} cols={[{k:'rank',h:'#',r:true},{k:'name',h:'Vendor',b:true},{k:'value',h:'Purchase Value',r:true,b:true,cl:'#78350F',f:v=>C(v)},{k:'trips',h:'Trips',r:true},{k:'valuePerTrip',h:'Avg/Trip',r:true,f:v=>C(v)},{k:'pct',h:'Share%',r:true,cl:'#78350F'}]} maxH={380}/>
              <window.DashBTable title="Monthly Trend" rows={Object.values(byMthVtv).sort((a,b)=>b.month.localeCompare(a.month))} cols={[{k:'month',h:'Month'},{k:'trips',h:'Trips',r:true},{k:'value',h:'Value',r:true,b:true,cl:'#78350F',f:v=>C(v)}]} maxH={380}/>
            </div>
            <window.DashBTable title="Company Distribution" rows={Object.values(byCoVtv).sort((a,b)=>b.value-a.value)} cols={[{k:'name',h:'Company',b:true},{k:'trips',h:'Trips',r:true},{k:'value',h:'Value',r:true,b:true,cl:'var(--or)',f:v=>C(v)}]} maxH={160}/>
          </window.DashDrillModal>
        );
      }

      case 'vendAvgSpend': {
        const avgSpend=vendorIntel.avgPerVendor;
        const segRows=[...vendorIntel.rows].sort((a,b)=>b.value-a.value).map((r,i)=>({...r,rank:i+1,segment:r.value>avgSpend*2?'Premium':r.value>avgSpend?'Above Avg':r.value>avgSpend*0.5?'Below Avg':'Low',avgPerTrip:r.trips>0?Math.round(r.value/r.trips):0,devPct:avgSpend>0?(((r.value-avgSpend)/avgSpend)*100).toFixed(1):'0.0'}));
        const sortedByVal=[...vendorIntel.rows].sort((a,b)=>b.value-a.value);
        const medianSpend=sortedByVal[Math.floor(sortedByVal.length/2)]?.value||0;
        return(
          <window.DashDrillModal title={`Avg Vendor Spend \u2014 ${C(avgSpend)}`} subtitle="Vendor spend distribution \u00b7 segments \u00b7 ranking \u00b7 deviation from average" color="#78350F" onClose={close} width={1020}>
            <window.DashKPIs items={[['Avg/Vendor',C(avgSpend),'#78350F'],['Median Spend',C(medianSpend),'var(--info)'],['Premium Vendors',segRows.filter(r=>r.segment==='Premium').length,'var(--ok)'],['Above Average',segRows.filter(r=>r.segment==='Above Avg').length,'var(--warn)'],['Highest',C(segRows[0]?.value||0),'var(--err)'],['Lowest',C(segRows[segRows.length-1]?.value||0),'var(--txt2)']]}/>
            <window.DashBTable title="Vendor Spend Ranking" rows={segRows} cols={[{k:'rank',h:'#',r:true},{k:'name',h:'Vendor',b:true},{k:'value',h:'Total Spend',r:true,b:true,cl:'#78350F',f:v=>C(v)},{k:'trips',h:'Trips',r:true},{k:'avgPerTrip',h:'Avg/Trip',r:true,f:v=>C(v)},{k:'segment',h:'Segment'},{k:'devPct',h:'vs Avg%',r:true}]} maxH={520}/>
          </window.DashDrillModal>
        );
      }

      case 'crushActive': {
        const crNow30=new Date(Date.now()-30*86400000).toISOString().slice(0,10);
        const crDirRows=crusherIntel.rows.map((cr,i)=>{
          const crInfo=Store.all('crushers').find(c=>c.id===cr.id)||{};
          const crP=purchases.filter(p=>(p.items||[]).some(i=>i.crusherSite===cr.id));
          const crDates=crP.map(p=>p.date||'').filter(Boolean).sort();
          const lastDate=crDates[crDates.length-1]||'';
          const status=lastDate>=crNow30?'Active':'Slow';
          return{...cr,rank:i+1,owner:crInfo.owner||'\u2014',location:crInfo.location||'\u2014',lastDate,status};
        });
        return(
          <window.DashDrillModal title={`Active Crushers \u2014 ${crusherIntel.uniqueCrushers}`} subtitle="All crusher sites \u00b7 owner \u00b7 location \u00b7 activity status \u00b7 full metrics" color="#6B7280" onClose={close} width={1020}>
            <window.DashKPIs items={[['Total Crushers',crusherIntel.uniqueCrushers,'#6B7280'],['Active \u226430d',crDirRows.filter(r=>r.status==='Active').length,'var(--ok)'],['Total Value',C(crusherIntel.totalValue),'var(--or)'],['Total Trips',crusherIntel.rows.reduce((s,r)=>s+r.trips,0),'var(--info)'],['Top Crusher',crusherIntel.topCrusher?.name||'\u2014','var(--txt)'],['Top Value',C(crusherIntel.topCrusher?.value||0),'var(--txt2)']]}/>
            <window.DashBTable title="Crusher Directory" rows={crDirRows} cols={[{k:'rank',h:'#',r:true},{k:'name',h:'Crusher',b:true},{k:'owner',h:'Owner'},{k:'location',h:'Location'},{k:'status',h:'Status'},{k:'trips',h:'Trips',r:true,b:true,cl:'#6B7280'},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Value',r:true,cl:'var(--or)',f:v=>C(v)},{k:'mats',h:'Materials',r:true},{k:'vendors',h:'Vendors',r:true},{k:'lastDate',h:'Last Activity',f:v=>v?window.fmtDate(v):'\u2014'}]} maxH={500}/>
          </window.DashDrillModal>
        );
      }

      case 'crushTotalValue': {
        const ctvRows=[...crusherIntel.rows].sort((a,b)=>b.value-a.value).map((r,i)=>({...r,rank:i+1,pct:crusherIntel.totalValue>0?(r.value/crusherIntel.totalValue*100).toFixed(1):'0.0',valuePerTrip:r.trips>0?Math.round(r.value/r.trips):0}));
        const crMatMap2={};purchases.forEach(p=>{(p.items||[]).filter(i=>i.crusherSite).forEach(item=>{const k=Store.name('materials',item.materialId)||'Unknown';if(!crMatMap2[k])crMatMap2[k]={name:k,crushers:new Set(),qty:0,value:0};crMatMap2[k].crushers.add(item.crusherSite);crMatMap2[k].qty+=parseFloat(item.quantity)||0;crMatMap2[k].value+=parseFloat(item.total)||0;});});
        const crVendMap2={};purchases.forEach(p=>{(p.items||[]).filter(i=>i.crusherSite).forEach(item=>{const k=Store.name('vendors',p.vendorId)||'Unknown';if(!crVendMap2[k])crVendMap2[k]={name:k,crushers:new Set(),trips:0,value:0};crVendMap2[k].crushers.add(item.crusherSite);crVendMap2[k].trips++;crVendMap2[k].value+=parseFloat(item.total)||0;});});
        const crMthMap2={};purchases.forEach(p=>{const m=(p.date||'').slice(0,7);if(!m)return;(p.items||[]).filter(i=>i.crusherSite).forEach(item=>{if(!crMthMap2[m])crMthMap2[m]={month:m,value:0,qty:0,trips:0};crMthMap2[m].value+=parseFloat(item.total)||0;crMthMap2[m].qty+=parseFloat(item.quantity)||0;crMthMap2[m].trips++;});});
        return(
          <window.DashDrillModal title={`Total Source Value \u2014 ${C(crusherIntel.totalValue)}`} subtitle="Value by crusher \u00b7 material mix \u00b7 vendor relationships \u00b7 monthly trend" color="#6B7280" onClose={close} width={1020}>
            <window.DashKPIs items={[['Total Value',C(crusherIntel.totalValue),'#6B7280'],['Crushers',crusherIntel.uniqueCrushers,'var(--txt2)'],['Total Trips',crusherIntel.rows.reduce((s,r)=>s+r.trips,0),'var(--info)'],['Top Crusher',ctvRows[0]?.name||'\u2014','var(--or)'],['Top Value',C(ctvRows[0]?.value||0),'var(--or)'],['Avg/Crusher',C(crusherIntel.uniqueCrushers>0?Math.round(crusherIntel.totalValue/crusherIntel.uniqueCrushers):0),'var(--txt2)']]}/>
            <div className="dd-2col" style={{marginBottom:14}}>
              <window.DashBTable title="Value by Crusher" rows={ctvRows} cols={[{k:'rank',h:'#',r:true},{k:'name',h:'Crusher',b:true},{k:'value',h:'Total Value',r:true,b:true,cl:'#6B7280',f:v=>C(v)},{k:'trips',h:'Trips',r:true},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'pct',h:'Share%',r:true}]} maxH={300}/>
              <window.DashBTable title="Material Mix" rows={Object.values(crMatMap2).map(r=>({...r,crushers:r.crushers.size})).sort((a,b)=>b.value-a.value)} cols={[{k:'name',h:'Material',b:true},{k:'crushers',h:'Crushers',r:true},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Value',r:true,cl:'var(--or)',f:v=>C(v)}]} maxH={300}/>
            </div>
            <div className="dd-2col">
              <window.DashBTable title="Vendor Relationships" rows={Object.values(crVendMap2).map(r=>({...r,crushers:r.crushers.size})).sort((a,b)=>b.value-a.value)} cols={[{k:'name',h:'Vendor',b:true},{k:'crushers',h:'Crushers',r:true},{k:'trips',h:'Trips',r:true},{k:'value',h:'Value',r:true,cl:'#6B7280',f:v=>C(v)}]} maxH={200}/>
              <window.DashBTable title="Monthly Trend" rows={Object.values(crMthMap2).sort((a,b)=>b.month.localeCompare(a.month))} cols={[{k:'month',h:'Month'},{k:'trips',h:'Trips',r:true},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'value',h:'Value',r:true,b:true,cl:'#6B7280',f:v=>C(v)}]} maxH={200}/>
            </div>
          </window.DashDrillModal>
        );
      }

      case 'crushTopShare': {
        let cumShare=0;
        const crRanked=[...crusherIntel.rows].sort((a,b)=>b.value-a.value).map((r,i)=>{cumShare+=r.value;return{...r,rank:i+1,pct:crusherIntel.totalValue>0?(r.value/crusherIntel.totalValue*100).toFixed(2):'0.00',cumPct:crusherIntel.totalValue>0?(cumShare/crusherIntel.totalValue*100).toFixed(1):'0.0'};});
        const top1PctCr=crRanked[0]?parseFloat(crRanked[0].pct):0;
        const top3ValCr=crRanked.slice(0,3).reduce((s,r)=>s+r.value,0);
        const top3PctCr=crusherIntel.totalValue>0?(top3ValCr/crusherIntel.totalValue*100).toFixed(1):'0.0';
        const riskCr=top1PctCr>50?'HIGH':top1PctCr>30?'MEDIUM':'LOW';
        return(
          <window.DashDrillModal title="Crusher Source Concentration" subtitle="Top source dependency \u00b7 diversification risk \u00b7 cumulative share analysis" color="#6B7280" onClose={close} width={960}>
            <window.DashKPIs items={[['Top Crusher Share',(crRanked[0]?.pct||'0.00')+'%',top1PctCr>50?'var(--err)':'var(--ok)'],['Top 3 Share',top3PctCr+'%',parseFloat(top3PctCr)>70?'var(--err)':'var(--ok)'],['Concentration Risk',riskCr,riskCr==='HIGH'?'var(--err)':riskCr==='MEDIUM'?'var(--warn)':'var(--ok)'],['Total Crushers',crusherIntel.uniqueCrushers,'#6B7280'],['Total Value',C(crusherIntel.totalValue),'var(--or)']]}/>
            <window.DashBTable title="Crusher Concentration Ranking" rows={crRanked} cols={[{k:'rank',h:'#',r:true},{k:'name',h:'Crusher',b:true},{k:'value',h:'Purchase Value',r:true,b:true,cl:'#6B7280',f:v=>C(v)},{k:'trips',h:'Trips',r:true},{k:'qty',h:'Qty T',r:true,f:v=>window.formatQuantity(v)},{k:'pct',h:'Share%',r:true,cl:'#6B7280'},{k:'cumPct',h:'Cumulative%',r:true}]} maxH={480}/>
          </window.DashDrillModal>
        );
      }

      default: return null;
    }
  }

  // Aging bucket config (shared for bar chart + KPI)
  const AGING_CFG=[
    {label:'0 – 30 Days', bucket:stockAging.d30, color:'var(--ok)',  min:0,  max:30},
    {label:'31 – 60 Days',bucket:stockAging.d60, color:'var(--warn)',min:31, max:60},
    {label:'61 – 90 Days',bucket:stockAging.d90, color:'var(--or)', min:61, max:90},
    {label:'90+ Days',    bucket:stockAging.d90p,color:'var(--err)', min:91, max:9999},
  ];

  return (
    <div>
      {/* Consolidated banner */}
      <div style={{display:'flex',alignItems:'center',gap:10,padding:'9px 14px',marginBottom:12,background:'var(--or-lt)',border:'1px solid var(--or-bdr)',borderRadius:'var(--r)'}}>
        <span style={{fontWeight:700,fontSize:13}}>OM Group Consolidated View</span>
        <span style={{fontSize:11.5,color:'var(--txt2)'}}>All companies combined · Internal transfers excluded from P&amp;L · Click any KPI or row to drill down</span>
        {(fComp||fMat)&&<span style={{marginLeft:'auto',background:'var(--or)',color:'#fff',fontSize:10.5,fontWeight:600,padding:'2px 10px',borderRadius:3}}>Filtered: {fComp?Store.name('companies',fComp):'All'} · {fMat?Store.name('materials',fMat):'All Materials'}</span>}
      </div>

      <div className="ph">
        <div><h1 style={{fontWeight:700}}>OM Group Dashboard</h1><p>Operational Intelligence — OM Group</p></div>
      </div>

      {/* Date presets */}
      <div style={{display:'flex',alignItems:'center',gap:8,marginBottom:10,flexWrap:'wrap',rowGap:6}}>
        <div className="dtf-row" style={{display:'flex',alignItems:'center',gap:6,flexWrap:'wrap'}}>
          {PRESETS.map(p=><button key={p.id} className={`btn btn-sm ${preset===p.id?'btn-or':'btn-wh'}`} onClick={()=>setPreset(p.id)}>{p.label}</button>)}
          {preset==='custom'&&<><input className="inp" type="date" value={cFrom} onChange={e=>setCFrom(e.target.value)} style={{height:28,fontSize:11.5,width:130,padding:'3px 7px'}}/><span style={{fontSize:11.5,color:'var(--txt2)'}}>to</span><input className="inp" type="date" value={cTo} onChange={e=>setCTo(e.target.value)} style={{height:28,fontSize:11.5,width:130,padding:'3px 7px'}}/></>}
        </div>
        {range.from&&<span style={{fontSize:11,color:'var(--txt2)'}}>{window.fmtDate(range.from)}{range.from!==range.to?` — ${window.fmtDate(range.to)}`:''}</span>}
      </div>

      {/* Filters */}
      <div className="frow" style={{marginBottom:12}}>
        <window.FiltSelect
          value={fComp}
          onChange={v=>setFComp(v)}
          options={[{value:'',label:'All Companies'},...companies.map(c=>({value:c.id,label:c.name}))]}
          placeholder="All Companies"
        />
        <window.FiltSelect
          value={fMat}
          onChange={v=>setFMat(v)}
          options={[{value:'',label:'All Materials'},...materials.filter((m,i,a)=>a.findIndex(x=>x.name===m.name)===i).map(m=>({value:m.id,label:m.name}))]}
          placeholder="All Materials"
        />
        {(fComp||fMat)&&<button className="btn btn-gh btn-sm" onClick={()=>{setFComp('');setFMat('');}}>Clear</button>}
        <span className="f-cnt">{sales.length} sales · {purchases.length} purchases</span>
      </div>

      {purchasesUnavailable && (
        <div style={{background:'#FEF3C7',border:'1px solid #FDE68A',borderRadius:8,padding:'10px 14px',marginBottom:12,display:'flex',alignItems:'center',gap:10,fontSize:12.5,color:'#92400E'}}>
          <strong style={{whiteSpace:'nowrap'}}>Purchase data unavailable — recovery required.</strong>
          <span style={{flex:1}}>Storage could not load the purchases collection ({(purchLoadState.detail && purchLoadState.detail.reason) || 'write blocked by fail-safe'}). Nothing has been deleted — the records are locked against overwriting. Purchase Cost, Gross Profit, Net Profit and Purchased tonnage below exclude purchases and are not shown as ₹0/zero.</span>
          <button className="btn btn-sm" style={{background:'#92400E',color:'#fff',border:'none',whiteSpace:'nowrap'}} onClick={()=>navigate && navigate('datahealth')}>Open Data Health</button>
        </div>
      )}

      {/* ── Financial KPIs ── */}
      <div style={{fontSize:10.5,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'0.06em',marginBottom:6}}>Financial Performance — {periodLabel}</div>
      <div className="g-kpi-row-6" style={{display:'grid',gridTemplateColumns:'repeat(6,1fr)',gap:8,marginBottom:12}}>
        <GKpi label="Total Revenue"        value={C(totalRevenue)}                sub={`${sales.length} sales orders`}        color="var(--or)"   onClick={()=>setDrill({type:'revenue'})}/>
        <GKpi label="Purchase Cost"        value={purchasesUnavailable?uv():C(totalPurchCost)}              sub={uvSub(`${purchases.length} purchases`)}       color={purchasesUnavailable?'#B45309':'var(--txt)'}  onClick={()=>setDrill({type:'cost'})}/>
        <GKpi label="Gross Profit"         value={purchasesUnavailable?uv():C(grossProfit)}                 sub={uvSub("Revenue − Purchase Cost")}               color={purchasesUnavailable?'#B45309':(grossProfit>=0?'var(--ok)':'var(--err)')} onClick={()=>setDrill({type:'profit'})}/>
        <GKpi label="Profit Margin"        value={purchasesUnavailable?uv():`${profitMargin}%`}             sub={purchasesUnavailable?uvSub(''):`Net (Profit Engine): ${C(netProfit)}`} color={purchasesUnavailable?'#B45309':(grossProfit>=0?'var(--ok)':'var(--err)')} onClick={()=>setDrill({type:'margin'})}/>
        <GKpi label="Profit Per Ton"       value={purchasesUnavailable?uv():C(profitPerTon)}                sub={uvSub(`${window.formatQuantity(totalSoldTons)} T sold`)}  color={purchasesUnavailable?'#B45309':'var(--info)'} onClick={()=>setDrill({type:'profitPerTon'})}/>
        <GKpi label="Avg Rev / Sale Order" value={C(Math.round(avgRevPerOrder))}  sub={`${sales.length} orders used`}        color="var(--or)"   tooltip="Avg revenue per sale order analysis" onClick={()=>setDrill({type:'avgRevPerOrder'})}/>
      </div>

      {/* ── Profit Engine KPIs (Method 1 Commercial / Method 2 Operational × GST incl/excl) ── */}
      <div style={{fontSize:10.5,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'0.06em',marginBottom:6}}>Profit Engine — Diesel Treated as Recoverable Advance, Not an Expense</div>
      <div className="g-kpi-row-4" style={{gap:8,marginBottom:12}}>
        <GKpi label="Method 1 Profit (Incl. GST)" value={purchasesUnavailable?uv():C(peM1Incl.netProfit)} sub={uvSub("Sales − Purchase − Transport + Diesel Margin")} color={purchasesUnavailable?'#B45309':(peM1Incl.netProfit>=0?'var(--ok)':'var(--err)')} tooltip="Commercial Profit, GST-inclusive" onClick={()=>setDrill({type:'netProfit'})}/>
        <GKpi label="Method 1 Profit (Excl. GST)" value={purchasesUnavailable?uv():C(peM1Excl.netProfit)} sub={uvSub("Sales − Purchase − Transport + Diesel Margin")} color={purchasesUnavailable?'#B45309':(peM1Excl.netProfit>=0?'var(--ok)':'var(--err)')} tooltip="Commercial Profit, GST-exclusive" onClick={()=>setDrill({type:'netProfit'})}/>
        <GKpi label="Method 2 Profit (Incl. GST)" value={purchasesUnavailable?uv():C(peM2Incl.netProfit)} sub={uvSub("Sales − Purchase Cost − Actual Diesel Bills")} color={purchasesUnavailable?'#B45309':(peM2Incl.netProfit>=0?'var(--ok)':'var(--err)')} tooltip="Operational Profit, GST-inclusive" onClick={()=>setDrill({type:'netProfit'})}/>
        <GKpi label="Method 2 Profit (Excl. GST)" value={purchasesUnavailable?uv():C(peM2Excl.netProfit)} sub={uvSub("Sales − Purchase Cost − Actual Diesel Bills")} color={purchasesUnavailable?'#B45309':(peM2Excl.netProfit>=0?'var(--ok)':'var(--err)')} tooltip="Operational Profit, GST-exclusive" onClick={()=>setDrill({type:'netProfit'})}/>
      </div>

      {/* ── Operational KPIs ── */}
      <div style={{fontSize:10.5,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'0.06em',marginBottom:6}}>Operational Overview</div>
      <div className="g-kpi-row-6" style={{display:'grid',gridTemplateColumns:'repeat(6,1fr)',gap:8,marginBottom:12}}>
        <GKpi label="Purchased"           value={purchasesUnavailable?uv():`${window.formatQuantity(totalPurchTons)} T`} sub={uvSub(`${purchases.length} orders`)}   color={purchasesUnavailable?'#B45309':undefined} onClick={()=>setDrill({type:'purchased'})}/>
        <GKpi label="Sold"                value={`${window.formatQuantity(totalSoldTons)} T`}  sub={`${sales.length} orders`}       color="var(--ok)"   onClick={()=>setDrill({type:'sold'})}/>
        <GKpi label="Diesel Cost"         value={C(dieselCost)}                    sub={`${diesel.length} records`}     color="var(--warn)" onClick={()=>setDrill({type:'diesel'})}/>
        <GKpi label="Trip Efficiency"    value={`${tripEffStats.efficiencyPct.toFixed(1)}%`} sub={`Completed ${tripEffStats.executed} / ${tripEffStats.total} Trips`} color={tripEffStats.efficiencyPct>=90?'var(--ok)':tripEffStats.efficiencyPct>=75?'var(--warn)':'var(--err)'} onClick={()=>setDrill({type:'tripEfficiency'})}/>
        <GKpi label="Total Trips"         value={allTripsUnified.length}           sub={`${[...new Set(allTripsUnified.map(t=>t.module))].length} modules · all types`} color="var(--info)" tooltip="Comprehensive trip analysis — all modules" onClick={()=>setDrill({type:'totalTripsAll'})}/>
        <GKpi label="Vehicle Utilization" value={`${utilizationPct}%`}             sub={`${activeVehCount} active · ${idleVehCount} idle`} color={parseFloat(utilizationPct)>=70?'var(--ok)':'var(--warn)'} tooltip="View vehicle utilization & fleet analysis" onClick={()=>setDrill({type:'vehicleUtilization'})}/>
      </div>

      {/* ── Inventory + Transfers KPIs ── */}
      <div style={{fontSize:10.5,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'0.06em',marginBottom:6}}>Inventory &amp; Transfers</div>
      <div className="g-kpi-row-4" style={{gap:8,marginBottom:12}}>
        <GKpi label="Total Inventory Value"  value={C(inventoryVal)}    sub={`${window.formatQuantity(inventoryTons)} T · ${stockyards.filter(s=>s.status==='Active').length} yards`} color="var(--info)" onClick={()=>setDrill({type:'inventory'})}/>
        <GKpi label="Dead Stock Value"       value={C(deadStockVal)}    sub="≥ 90 days no movement"           color={deadStockVal>0?'var(--err)':'var(--ok)'} onClick={()=>setDrill({type:'deadstock'})}/>
        <GKpi label="Internal Transfers"     value={trfSummary.count}   sub={`${window.formatQuantity(trfSummary.qty)} T · ${C(trfSummary.val)}`} color="var(--txt2)" onClick={()=>setDrill({type:'transfers'})}/>
        <GKpi label="Settlement Efficiency" value={`${settlementEfficiencyPct.toFixed(1)}%`} sub="Vendor + Transport Settlements completed within target cycle" color={settlementEfficiencyPct>=90?'var(--ok)':settlementEfficiencyPct>=75?'var(--warn)':'var(--err)'} onClick={()=>setDrill({type:'settlementEfficiency'})}/>
      </div>

      {/* ── Inventory Intelligence KPIs ── */}
      <div style={{fontSize:10.5,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'0.06em',marginBottom:6}}>Inventory Intelligence</div>
      <div className="g-kpi-row-4" style={{gap:8,marginBottom:10}}>
        <GKpi label="Inventory Turnover Ratio" value={invTurnover?`${invTurnover}×`:'—'} sub="COGS ÷ Inventory Value" color="var(--info)" onClick={()=>setDrill({type:'inventory'})}/>
        <GKpi label="Days Inventory Outstanding" value={dioValue?`${dioValue} days`:'—'} sub={`Avg stock ÷ daily use · ${daysInPeriod}d`} color="var(--or)" onClick={()=>setDrill({type:'dio'})}/>
        <GKpi label="Aging Stock ≥60 Days" value={C(stockAging.d90.val+stockAging.d90p.val)} sub="61–90 + 90+ day buckets" color={stockAging.d90.val+stockAging.d90p.val>0?'var(--warn)':'var(--ok)'} onClick={()=>setDrill({type:'agingBucket',label:'Aging Stock ≥60 Days',color:'var(--warn)',minDays:61,maxDays:9999})}/>
        <GKpi label="Dead Stock ≥90 Days" value={C(stockAging.d90p.val)} sub="No movement ≥ 90 days" color={stockAging.d90p.val>0?'var(--err)':'var(--ok)'} onClick={()=>setDrill({type:'agingBucket',label:'Dead Stock ≥90 Days',color:'var(--err)',minDays:90,maxDays:9999})}/>
      </div>

      <div className="g-stock-2col" style={{gap:10,marginBottom:12}}>
        {/* Stock Aging — clickable bars */}
        <div className="card">
          <div className="card-hd"><h3>Stock Aging Distribution</h3><span style={{fontSize:11.5,color:'var(--txt2)'}}>Click a bucket to drill down</span></div>
          <div style={{padding:'10px 14px',display:'flex',flexDirection:'column',gap:10}}>
            {AGING_CFG.map(({label,bucket,color,min,max})=>{
              const total=stockAging.d30.val+stockAging.d60.val+stockAging.d90.val+stockAging.d90p.val;
              const pct=total>0?bucket.val/total*100:0;
              return (
                <div key={label} onClick={()=>setDrill({type:'agingBucket',label,color,minDays:min,maxDays:max})}
                  style={{cursor:'pointer',borderRadius:4,padding:'4px 0'}}
                  onMouseEnter={e=>e.currentTarget.style.background='#F9FAFB'}
                  onMouseLeave={e=>e.currentTarget.style.background=''}>
                  <div style={{display:'flex',justifyContent:'space-between',marginBottom:4,fontSize:12}}>
                    <span style={{fontWeight:600,color}}>{label}</span>
                    <span style={{color:'var(--txt2)',fontSize:11.5}}>{window.formatQuantity(bucket.qty)} T · {C(bucket.val)}</span>
                  </div>
                  <window.PremiumProgress pct={pct} color={color} height={8} />
                </div>
              );
            })}
          </div>
        </div>

        {/* Dead Stock Detail — clickable rows */}
        <div className="card">
          <div className="card-hd"><h3>Dead Stock Detail</h3><span style={{fontSize:11.5,color:'var(--txt2)'}}>No movement ≥ 30 days · click to expand</span></div>
          {deadStockItems.length===0
            ?<div style={{padding:'28px 16px',textAlign:'center',color:'var(--txt2)',fontSize:12}}><svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" style={{display:'inline',verticalAlign:'-1px',marginRight:4}}><path d="M5 13l4 4L19 7"/></svg>No dead stock detected</div>
            :<div className="tbl-w"><table className="tbl">
              <thead><tr><th>MATERIAL</th><th>LOCATION</th><th>VALUE</th><th>DAYS</th></tr></thead>
              <tbody>
                {deadStockItems.map((item,i)=>(
                  <tr key={i} onClick={()=>setDrill({type:'deadstock'})} style={{cursor:'pointer'}}
                    onMouseEnter={e=>e.currentTarget.style.background='#FEF2F2'} onMouseLeave={e=>e.currentTarget.style.background=''}>
                    <td style={{fontWeight:500,fontSize:12}}>{item.material||'—'}</td>
                    <td style={{fontSize:11.5,color:'var(--txt2)'}}>{item.stockyard||'—'}</td>
                    <td style={{fontWeight:600,color:'var(--err)'}}>{C(item.val)}</td>
                    <td><span className={`bdg ${item.days>=90?'bg-rd':item.days>=60?'bg-or':'bg-yw'}`}>{item.days}d</span></td>
                  </tr>
                ))}
              </tbody>
            </table></div>}
        </div>
      </div>

      {/* ── Company Leaderboard — clickable rows ── */}
      <div className="card" style={{marginBottom:10}}>
        <div className="card-hd">
          <h3>Company Performance Leaderboard</h3>
          <span style={{fontSize:11.5,color:'var(--txt2)'}}>{companies.length} companies · {periodLabel} · click row to drill down</span>
        </div>
        <div className="tbl-w">
          <table className="tbl">
            <thead><tr>
              <th style={{width:32,textAlign:'center'}}>#</th><th>COMPANY</th>
              <th>REVENUE</th><th>PURCHASE COST</th><th>GROSS PROFIT</th>
              <th style={{minWidth:130}}>MARGIN</th><th>TONS PURCHASED</th><th>TONS SOLD</th><th>DIESEL COST</th>
              <th style={{textAlign:'center'}}>TRIPS</th>
            </tr></thead>
            <tbody>
              {leaderboard.map((co,i)=>(
                <tr key={co.id} onClick={()=>setDrill({type:'company',co})} style={{cursor:'pointer'}}
                  onMouseEnter={e=>e.currentTarget.style.background='#FFF7ED'} onMouseLeave={e=>e.currentTarget.style.background=''}>
                  <td style={{textAlign:'center',color:'var(--txt2)',fontWeight:700}}>{i+1}</td>
                  <td><div style={{display:'flex',alignItems:'center',gap:7}}>
                    <span style={{width:9,height:9,borderRadius:'50%',background:co.color,flexShrink:0,display:'inline-block'}}></span>
                    <strong>{co.name}</strong>
                  </div></td>
                  <td style={{fontWeight:600,color:'var(--or)'}}>{C(co.rev)}</td>
                  <td style={{color:'var(--txt2)'}}>{C(co.cost)}</td>
                  <td style={{fontWeight:600,color:co.profit>=0?'var(--ok)':'var(--err)'}}>{C(co.profit)}</td>
                  <td><div style={{display:'flex',alignItems:'center',gap:8}}>
                    <MiniBar pct={Math.max(co.margin,0)} color={co.margin>=20?'var(--ok)':co.margin>=10?'var(--warn)':'var(--err)'}/>
                    <span style={{fontSize:12,fontWeight:600,minWidth:38,textAlign:'right',color:co.margin>=0?'var(--txt)':'var(--err)'}}>{co.margin.toFixed(1)}%</span>
                  </div></td>
                  <td style={{fontWeight:600,color:'var(--info)'}}>{window.formatQuantity(co.pTons)} T</td>
                  <td style={{fontWeight:600}}>{window.formatQuantity(co.tons)} T</td>
                  <td style={{color:'var(--txt2)'}}>{C(co.dsl)}</td>
                  <td style={{textAlign:'center',fontWeight:600,color:'var(--info)'}}>{co.trips}</td>
                </tr>
              ))}
              {leaderboard.length===0&&<tr className="empty"><td colSpan="9" style={{textAlign:'center',padding:36,color:'var(--txt2)'}}>No data for selected period.</td></tr>}
            </tbody>
            {leaderboard.length===0&&<tr className="empty"><td colSpan="10" style={{textAlign:'center',padding:36,color:'var(--txt2)'}}>No data for selected period.</td></tr>}
            {leaderboard.length>0&&<tfoot><tr
              onClick={()=>setDrill({type:'omgroupExec'})}
              style={{cursor:'pointer'}}
              onMouseEnter={e=>{e.currentTarget.style.background='#FEF9F0';}}
              onMouseLeave={e=>{e.currentTarget.style.background='';}}>
              <td colSpan="2" style={{fontWeight:700,background:'inherit',padding:'7px 10px',borderTop:'1px solid var(--bdr)',color:'var(--or)'}}>OM GROUP TOTAL <span style={{fontSize:10,fontWeight:500,color:'var(--txt3)',marginLeft:6}}>View Analysis →</span></td>
              <td style={{fontWeight:700,color:'var(--or)',background:'inherit',padding:'7px 10px',borderTop:'1px solid var(--bdr)'}}>{C(totalRevenue)}</td>
              <td style={{background:'inherit',padding:'7px 10px',borderTop:'1px solid var(--bdr)',color:'var(--txt2)'}}>{C(totalPurchCost)}</td>
              <td style={{fontWeight:700,color:grossProfit>=0?'var(--ok)':'var(--err)',background:'inherit',padding:'7px 10px',borderTop:'1px solid var(--bdr)'}}>{C(grossProfit)}</td>
              <td style={{fontWeight:700,background:'inherit',padding:'7px 10px',borderTop:'1px solid var(--bdr)'}}>{profitMargin}%</td>
              <td style={{fontWeight:700,background:'inherit',padding:'7px 10px',borderTop:'1px solid var(--bdr)',color:'var(--info)'}}>{window.formatQuantity(totalPurchTons)} T</td>
              <td style={{fontWeight:700,background:'inherit',padding:'7px 10px',borderTop:'1px solid var(--bdr)'}}>{window.formatQuantity(totalSoldTons)} T</td>
              <td style={{background:'inherit',padding:'7px 10px',borderTop:'1px solid var(--bdr)',color:'var(--txt2)'}}>{C(dieselCost)}</td>
              <td style={{fontWeight:700,background:'inherit',padding:'7px 10px',borderTop:'1px solid var(--bdr)',textAlign:'center',color:'var(--info)'}}>{transport.length}</td>
            </tr></tfoot>}
          </table>
        </div>
      </div>

      {/* ── Premium Analytics Charts ── */}
      {window.AnalyticsChartsSection&&(
        <window.AnalyticsChartsSection
          companyId={fComp}
          onMonthClick={month=>{
            const [yr,mo]=month.split('-').map(Number);
            const days=new Date(yr,mo,0).getDate();
            const p=n=>String(n).padStart(2,'0');
            setCFrom(`${month}-01`);
            setCTo(`${month}-${p(days)}`);
            setPreset('custom');
          }}
        />
      )}

      {/* ── Charts — clickable bars ── */}
      <div className="ch-grid" style={{marginBottom:10}}>
        <div className="ch-card">
          <div className="ch-ttl">Revenue by Company</div>
          <div className="ch-sub">Click bar to open company drill-down · {periodLabel}</div>
          <div style={{display:'flex',flexDirection:'column',gap:5,marginTop:4,maxHeight:leaderboard.length>8?260:undefined,overflowY:leaderboard.length>8?'auto':'visible',paddingRight:2}}>
            {leaderboard.map((co,i)=>{
              const pct=totalRevenue>0?(co.rev/totalRevenue*100).toFixed(1):'0.0';
              return (
                <div key={co.id} onClick={()=>setDrill({type:'company',co})}
                  title={`#${i+1} ${co.name} · ${C(co.rev)} · ${pct}% of total revenue · Click to drill down`}
                  style={{display:'grid',gridTemplateColumns:'18px 115px 1fr 105px',gap:7,alignItems:'center',cursor:'pointer',borderRadius:4,padding:'3px 5px'}}
                  onMouseEnter={e=>e.currentTarget.style.background='#FFF7ED'} onMouseLeave={e=>e.currentTarget.style.background=''}>
                  <div style={{fontSize:10,fontWeight:700,color:'var(--txt3)',textAlign:'center',lineHeight:1}}>{i+1}</div>
                  <div style={{fontSize:11,color:'var(--txt2)',textAlign:'right',overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap'}}>{co.name}</div>
                  <window.PremiumProgress pct={co.revPct} color={co.color} height={16} />
                  <div style={{display:'flex',alignItems:'center',gap:4,justifyContent:'flex-end'}}>
                    <span style={{fontSize:10,color:'var(--txt3)',minWidth:34,textAlign:'right'}}>{pct}%</span>
                    <span style={{fontSize:11,fontWeight:600,minWidth:60,textAlign:'right'}}>{C(co.rev)}</span>
                  </div>
                </div>
              );
            })}
            {leaderboard.length===0&&<div style={{textAlign:'center',color:'var(--txt3)',fontSize:12,padding:'20px 0'}}>No company data.</div>}
          </div>
        </div>
        <div className="ch-card">
          <div className="ch-ttl">Profit Margin by Company</div>
          <div className="ch-sub">Click bar to open company drill-down · {periodLabel}</div>
          <div style={{display:'flex',flexDirection:'column',gap:5,marginTop:4,maxHeight:leaderboard.length>8?260:undefined,overflowY:leaderboard.length>8?'auto':'visible',paddingRight:2}}>
            {leaderboard.map((co,i)=>{
              const mc=co.margin>=20?'var(--ok)':co.margin>=10?'var(--warn)':'var(--err)';
              return (
                <div key={co.id} onClick={()=>setDrill({type:'company',co})}
                  title={`#${i+1} ${co.name} · Margin: ${co.margin.toFixed(1)}% · Revenue: ${C(co.rev)} · Profit: ${C(co.profit)} · Click to drill down`}
                  style={{display:'grid',gridTemplateColumns:'18px 115px 1fr 48px',gap:7,alignItems:'center',cursor:'pointer',borderRadius:4,padding:'3px 5px'}}
                  onMouseEnter={e=>e.currentTarget.style.background='#FFF7ED'} onMouseLeave={e=>e.currentTarget.style.background=''}>
                  <div style={{fontSize:10,fontWeight:700,color:'var(--txt3)',textAlign:'center',lineHeight:1}}>{i+1}</div>
                  <div style={{fontSize:11,color:'var(--txt2)',textAlign:'right',overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap'}}>{co.name}</div>
                  <MiniBar pct={Math.max(co.margin,0)} color={mc}/>
                  <div style={{fontSize:11.5,fontWeight:600,color:co.margin>=0?mc:'var(--err)',textAlign:'right'}}>{co.margin.toFixed(1)}%</div>
                </div>
              );
            })}
            {leaderboard.length===0&&<div style={{textAlign:'center',color:'var(--txt3)',fontSize:12,padding:'20px 0'}}>No company data.</div>}
          </div>
        </div>
      </div>

      {/* ── Customer Intelligence ── */}
      <div style={{fontSize:10.5,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'0.06em',marginBottom:6}}>Customer Intelligence</div>
      <div className="g-kpi-row-4" style={{gap:8,marginBottom:10}}>
        <GKpi label="Unique Customers"       value={customerIntel.uniqueCustomers}       sub={`${sales.length} sales orders`}                                                          color="#7C3AED" tooltip="View full customer master list" onClick={()=>setDrill({type:'uniqueCustomers'})}/>
        <GKpi label="Top 3 Concentration"    value={`${customerIntel.top3Pct}%`}          sub="Top 3 customers share of revenue"                                                        color="#7C3AED" tooltip="View concentration & dependency analysis" onClick={()=>setDrill({type:'top3Concentration'})}/>
        <GKpi label="Repeat Customers"       value={customerIntel.repeatCustomers}         sub="Customers with more than 1 order"                                                        color="#7C3AED" tooltip="View repeat customer loyalty analysis" onClick={()=>setDrill({type:'repeatCustomers'})}/>
        <GKpi label="Avg Revenue / Customer" value={C(customerIntel.avgRevPerCustomer)}    sub={customerIntel.topCustomer?`Top: ${customerIntel.topCustomer.name}`:'No customers yet'}  color="#7C3AED" tooltip="View revenue distribution & ranking" onClick={()=>setDrill({type:'avgRevPerCustomer'})}/>
      </div>
      {customerIntel.rows.length>0&&(
        <div className="card" style={{marginBottom:10,padding:'12px 16px'}}>
          <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:10}}>
            <div style={{fontWeight:600,fontSize:13}}>Top Customer Revenue Distribution</div>
            <button className="btn btn-wh btn-sm" onClick={()=>setDrill({type:'customer'})} style={{fontSize:11}}>View Full Analysis →</button>
          </div>
          <div style={{display:'flex',flexDirection:'column',gap:9}}>
            {customerIntel.rows.slice(0,8).map((cu,i)=>{
              const pct=customerIntel.totalRev>0?cu.rev/customerIntel.totalRev*100:0;
              return (
                <div key={cu.id} className="g-cust-row" style={{display:'grid',gridTemplateColumns:'180px 1fr 110px',gap:10,alignItems:'center',cursor:'pointer',borderRadius:4,padding:'3px 4px'}}
                  title="View Customer Analysis"
                  onClick={()=>setDrill({type:'customerProfile',customerId:cu.id})}
                  onMouseEnter={e=>e.currentTarget.style.background='#F5F3FF'} onMouseLeave={e=>e.currentTarget.style.background=''}>
                  <div style={{fontSize:11.5,overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap',fontWeight:500}}>{cu.name}</div>
                  <window.PremiumProgress pct={+pct} color="#7C3AED" height={14} />
                  <div style={{fontSize:11.5,fontWeight:600,textAlign:'right',color:'#7C3AED'}}>{C(cu.rev)}</div>
                </div>
              );
            })}
          </div>
        </div>
      )}

      {/* ── Transport Intelligence ── */}
      <div style={{fontSize:10.5,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'0.06em',marginBottom:6}}>Transport Intelligence</div>
      <div className="g-kpi-row-4" style={{gap:8,marginBottom:10}}>
        <GKpi label="Total Trips"       value={transportIntel.totalTrips}                    sub={`${transportIntel.uniqueTransporters} active transporters`}                                                                            color="var(--info)" tooltip="View trip history & breakdown"        onClick={()=>setDrill({type:'totalTrips'})}/>
        <GKpi label="Transport Value"   value={C(transportIntel.totalValue)}                 sub={`Avg ₹${window.fmtNum(transportIntel.avgTripValue)}/trip`}                                                                              color="var(--info)" tooltip="View transport value & cost analysis"  onClick={()=>setDrill({type:'transportValue'})}/>
        <GKpi label="Unique Vehicles"   value={transportIntel.uniqueVehicles}                sub="Active fleet across all companies"                                                                                                        color="var(--info)" tooltip="View complete fleet list"             onClick={()=>setDrill({type:'uniqueVehicles'})}/>
        <GKpi label="Top Transporter"   value={transportIntel.topTransporter?.name||'—'}    sub={transportIntel.topTransporter?`${transportIntel.topTransporter.trips} trips · ${C(transportIntel.topTransporter.value)}`:'No data'}      color="var(--info)" tooltip="View transporter ranking"            onClick={()=>setDrill({type:'topTransporterKpi'})}/>
      </div>
      {transportIntel.transporterRows.length>0&&(
        <div className="card" style={{marginBottom:10,padding:'12px 16px'}}>
          <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:10}}>
            <div style={{fontWeight:600,fontSize:13}}>Transporter Trip Distribution</div>
            <button className="btn btn-wh btn-sm" onClick={()=>setDrill({type:'transport'})} style={{fontSize:11}}>View Full Analysis →</button>
          </div>
          <div style={{display:'flex',flexDirection:'column',gap:9}}>
            {transportIntel.transporterRows.slice(0,8).map((tr,i)=>{
              const maxTrips=transportIntel.transporterRows[0]?.trips||1;
              const pct=tr.trips/maxTrips*100;
              return (
                <div key={tr.id} className="g-trans-row" style={{display:'grid',gridTemplateColumns:'180px 1fr 90px',gap:10,alignItems:'center',cursor:'pointer',borderRadius:4,padding:'3px 4px'}}
                  title="View Transporter Analysis"
                  onClick={()=>setDrill({type:'transporterProfile',transporterName:tr.name,transporterId:tr.id})}
                  onMouseEnter={e=>e.currentTarget.style.background='#EFF6FF'} onMouseLeave={e=>e.currentTarget.style.background=''}>
                  <div style={{fontSize:11.5,overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap',fontWeight:500}}>{tr.name}</div>
                  <window.PremiumProgress pct={pct} color="var(--info)" height={14} />
                  <div style={{fontSize:11.5,fontWeight:600,textAlign:'right',color:'var(--info)'}}>{tr.trips} trips</div>
                </div>
              );
            })}
          </div>
        </div>
      )}

      {/* ── Material Intelligence ── */}
      <div style={{fontSize:10.5,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'0.06em',marginBottom:6}}>Material Intelligence</div>
      <div className="g-kpi-row-4" style={{gap:8,marginBottom:10}}>
        <GKpi label="Unique Materials" value={materialIntel.uniqueMaterials} sub={`${materialIntel.rows.filter(r=>r.rev>0).length} with revenue · ${materialIntel.rows.filter(r=>r.purchTrips>0).length} purchased`} color="#EA580C" onClick={()=>setDrill({type:'matUniqueMaterials'})}/>
        <GKpi label="Material Revenue" value={C(materialIntel.totalRev)} sub={materialIntel.topMaterial?`Top: ${materialIntel.topMaterial.name}`:'No sales data'} color="#EA580C" onClick={()=>setDrill({type:'matRevenue'})}/>
        <GKpi label="Purchase Cost" value={C(materialIntel.totalPC)} sub={materialIntel.topByQty?`Most by qty: ${materialIntel.topByQty.name}`:'No data'} color="#EA580C" onClick={()=>setDrill({type:'matPurchCost'})}/>
        <GKpi label="Top Moving Material" value={materialIntel.topMoving?.name||'—'} sub={materialIntel.topMoving&&materialIntel.totalSaleQty>0?`${window.formatQuantity(materialIntel.topMoving.saleQty)} T · ${(materialIntel.topMoving.saleQty/materialIntel.totalSaleQty*100).toFixed(1)}% · ${C(materialIntel.topMoving.rev)}`:'No sales data'} color="#EA580C" onClick={materialIntel.topMoving?()=>setDrill({type:'materialProfile',materialId:materialIntel.topMoving.id,materialName:materialIntel.topMoving.name}):undefined}/>
      </div>
      {materialIntel.rows.length>0&&(
        <div className="card" style={{marginBottom:10,padding:'12px 16px'}}>
          <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:10}}>
            <div style={{fontWeight:600,fontSize:13}}>Top Material Revenue Distribution</div>
            <span style={{fontSize:11,color:'var(--txt2)'}}>{materialIntel.rows.length} materials · click row to drill down</span>
          </div>
          <div style={{display:'flex',flexDirection:'column',gap:8}}>
            {materialIntel.rows.slice(0,8).map((mat,i)=>{
              const pct=materialIntel.totalRev>0?mat.rev/materialIntel.totalRev*100:0;
              return(
                <div key={mat.id} className="mat-bar-row" style={{display:'grid',gridTemplateColumns:'140px 1fr 140px',gap:10,alignItems:'center',cursor:'pointer',borderRadius:4,padding:'3px 4px'}}
                  onClick={()=>setDrill({type:'materialProfile',materialId:mat.id,materialName:mat.name})}
                  onMouseEnter={e=>e.currentTarget.style.background='#FFF7ED'} onMouseLeave={e=>e.currentTarget.style.background=''}>
                  <div style={{fontSize:11.5,overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap',fontWeight:500}}>{mat.name}</div>
                  <window.PremiumProgress pct={pct} color="#EA580C" height={14} />
                  <div style={{fontSize:11,fontWeight:600,textAlign:'right',color:'#EA580C'}}>{C(mat.rev)} <span style={{fontWeight:400,color:'var(--txt3)',fontSize:10}}>({pct.toFixed(1)}%)</span></div>
                </div>
              );
            })}
          </div>
        </div>
      )}

      {/* ── Vendor Intelligence ── */}
      <div style={{fontSize:10.5,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'0.06em',marginBottom:6}}>Vendor Intelligence</div>
      <div className="g-kpi-row-4" style={{gap:8,marginBottom:10}}>
        <GKpi label="Unique Vendors" value={vendorIntel.uniqueVendors} sub={`${purchases.length} purchase orders · ${vendorIntel.rows.filter(r=>r.trips>0).length} active`} color="#78350F" onClick={()=>setDrill({type:'vendUnique'})}/>
        <GKpi label="Total Purchase Value" value={C(vendorIntel.totalValue)} sub={vendorIntel.topVendor?`Top: ${vendorIntel.topVendor.name}`:'No purchases'} color="#78350F" onClick={()=>setDrill({type:'vendTotalValue'})}/>
        <GKpi label="Avg / Vendor" value={C(vendorIntel.avgPerVendor)} sub="Average spend per vendor" color="#78350F" onClick={()=>setDrill({type:'vendAvgSpend'})}/>
        <GKpi label="Top Vendor" value={vendorIntel.topVendor?.name||'—'} sub={vendorIntel.topVendor?`${vendorIntel.topVendor.trips} trips · ${C(vendorIntel.topVendor.value)}`:'No data'} color="#78350F" onClick={vendorIntel.topVendor?()=>setDrill({type:'vendorProfile',vendorId:vendorIntel.topVendor.id,vendorName:vendorIntel.topVendor.name}):undefined}/>
      </div>
      {vendorIntel.rows.length>0&&(
        <div className="card" style={{marginBottom:10,padding:'12px 16px'}}>
          <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:10}}>
            <div style={{fontWeight:600,fontSize:13}}>Vendor Purchase Distribution</div>
            <span style={{fontSize:11,color:'var(--txt2)'}}>{vendorIntel.rows.length} vendors · click row to drill down</span>
          </div>
          <div style={{display:'flex',flexDirection:'column',gap:8}}>
            {vendorIntel.rows.slice(0,8).map((v,i)=>{
              const maxVal=vendorIntel.rows[0]?.value||1;
              const pct=v.value/maxVal*100;
              return(
                <div key={v.id} className="vend-bar-row" style={{display:'grid',gridTemplateColumns:'180px 1fr 150px',gap:10,alignItems:'center',cursor:'pointer',borderRadius:4,padding:'3px 4px'}}
                  onClick={()=>setDrill({type:'vendorProfile',vendorId:v.id,vendorName:v.name})}
                  onMouseEnter={e=>e.currentTarget.style.background='#FEF3E8'} onMouseLeave={e=>e.currentTarget.style.background=''}>
                  <div style={{fontSize:11.5,overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap',fontWeight:500}}>{v.name}</div>
                  <window.PremiumProgress pct={pct} color="#78350F" height={14} />
                  <div style={{fontSize:11,fontWeight:600,textAlign:'right',color:'#78350F'}}>{C(v.value)} <span style={{fontWeight:400,color:'var(--txt3)',fontSize:10}}>· {v.trips} trips</span></div>
                </div>
              );
            })}
          </div>
        </div>
      )}

      {/* ── Crusher Intelligence ── */}
      <div style={{fontSize:10.5,fontWeight:700,color:'var(--txt2)',textTransform:'uppercase',letterSpacing:'0.06em',marginBottom:6}}>Crusher Intelligence</div>
      <div className="g-kpi-row-4" style={{gap:8,marginBottom:10}}>
        <GKpi label="Active Crushers" value={crusherIntel.uniqueCrushers} sub={`${crusherIntel.rows.reduce((s,r)=>s+r.trips,0)} total trips`} color="#6B7280" onClick={()=>setDrill({type:'crushActive'})}/>
        <GKpi label="Total Source Value" value={C(crusherIntel.totalValue)} sub={crusherIntel.topCrusher?`Top: ${crusherIntel.topCrusher.name}`:'No data'} color="#6B7280" onClick={()=>setDrill({type:'crushTotalValue'})}/>
        <GKpi label="Top Crusher Trips" value={crusherIntel.topCrusher?.trips||0} sub={crusherIntel.topCrusher?.name||'—'} color="#6B7280" onClick={crusherIntel.topCrusher?()=>setDrill({type:'crusherProfile',crusherId:crusherIntel.topCrusher.id,crusherName:crusherIntel.topCrusher.name}):undefined}/>
        <GKpi label="Top Crusher Share" value={crusherIntel.topCrusher&&crusherIntel.totalValue>0?`${(crusherIntel.topCrusher.value/crusherIntel.totalValue*100).toFixed(1)}%`:'—'} sub="Concentration analysis" color="#6B7280" onClick={crusherIntel.rows.length>0?()=>setDrill({type:'crushTopShare'}):undefined}/>
      </div>
      {crusherIntel.rows.length>0&&(
        <div className="card" style={{marginBottom:10,padding:'16px 20px'}}>
          <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:14,flexWrap:'wrap',gap:8}}>
            <div>
              <div style={{fontWeight:700,fontSize:14}}>Crusher Source Distribution</div>
              <div style={{fontSize:11.5,color:'var(--txt2)',marginTop:2}}>{crusherIntel.rows.length} active crusher sites · click any slice or row to drill down</div>
            </div>
            <span style={{fontSize:11,color:'var(--txt2)',background:'#F9FAFB',border:'1px solid var(--bdr)',borderRadius:4,padding:'3px 10px',whiteSpace:'nowrap'}}>{C(crusherIntel.totalValue)} total sourced</span>
          </div>
          <CrusherDonut rows={crusherIntel.rows} total={crusherIntel.totalValue} onSliceClick={r=>setDrill({type:'crusherProfile',crusherId:r.id,crusherName:r.name})}/>
        </div>
      )}

      {/* ── Recent Activity — expandable rows ── */}
      <div className="card">
        <div className="card-hd">
          <h3>Recent Activity</h3>
          <div style={{display:'flex',alignItems:'center',gap:8}}>
            <span style={{fontSize:11.5,color:'var(--txt2)'}}>Click row to drill down</span>
            <window.FiltSelect value={actType} onChange={v=>{ setActType(v); setExpActId(null); }} style={{minWidth:130}} options={[{value:'Purchases',label:'Purchases'},{value:'Sales',label:'Sales'}]}/>
          </div>
        </div>
        <div className="tbl-w">
          {actType==='Purchases'
            ?<table className="tbl">
              <thead><tr>
                <th style={{width:28}}></th>
                <th style={{width:40,textAlign:'center'}}>SR</th><th>CHALLAN NO</th><th>VEHICLE NO</th><th>MATERIAL</th>
                <th>PURCHASED FROM</th><th>DATE</th><th>QTY</th><th>OM GROUP COMPANY</th>
              </tr></thead>
              <tbody>
                {recentPurchases.length===0
                  ?<tr className="empty"><td colSpan="9" style={{textAlign:'center',padding:28,color:'var(--txt2)'}}>No purchase activity.</td></tr>
                  :recentPurchases.map((p,i)=>{
                    const fi=p.items?.[0];
                    const matName=fi?Store.name('materials',fi.materialId):Store.name('materials',p.materialId);
                    const qty=p.items?p.items.reduce((s,it)=>s+(parseFloat(it.quantity)||0),0):parseFloat(p.quantity)||0;
                    const isExp=expActId===p.id;
                    return (
                      <React.Fragment key={p.id}>
                        <tr onClick={()=>setExpActId(id=>id===p.id?null:p.id)} style={{cursor:'pointer',background:isExp?'#FFF7ED':''}}>
                          <td style={{textAlign:'center',padding:'0 8px'}}><window.SYChevron open={isExp}/></td>
                          <td style={{textAlign:'center',color:'var(--txt2)',fontWeight:500}}>{i+1}</td>
                          <td style={{fontFamily:'var(--font)',fontSize:11.5}}>{p.challanNumber||'—'}</td>
                          <td style={{fontFamily:'var(--font)',fontSize:11}}>{p.vehicleFull||'—'}</td>
                          <td>{matName||'—'}</td>
                          <td style={{fontWeight:500}}>{Store.name('vendors',p.vendorId)||'—'}</td>
                          <td style={{whiteSpace:'nowrap'}}>{window.fmtDate(p.date)}</td>
                          <td style={{fontWeight:600}}>{qty.toFixed(3)}</td>
                          <td><span className="bdg bg-or" style={{fontSize:10,padding:'1px 5px'}}>{Store.name('companies',p.companyId)}</span></td>
                        </tr>
                        {isExp&&<tr><td colSpan={9} style={{padding:0,borderBottom:'2px solid var(--or-bdr)'}}><window.DashActRowDrill item={p} type="Purchases"/></td></tr>}
                      </React.Fragment>
                    );
                  })}
              </tbody>
            </table>
            :<table className="tbl">
              <thead><tr>
                <th style={{width:28}}></th>
                <th style={{width:40,textAlign:'center'}}>SR</th><th>CHALLAN NO</th><th>VEHICLE NO</th><th>MATERIAL</th>
                <th>SOLD TO</th><th>DATE</th><th>QTY</th><th>OM GROUP COMPANY</th>
              </tr></thead>
              <tbody>
                {recentSales.length===0
                  ?<tr className="empty"><td colSpan="9" style={{textAlign:'center',padding:28,color:'var(--txt2)'}}>No sales activity.</td></tr>
                  :recentSales.map((s,i)=>{
                    const qty=parseFloat(s.quantity)||0; const isExp=expActId===s.id;
                    return (
                      <React.Fragment key={s.id}>
                        <tr onClick={()=>setExpActId(id=>id===s.id?null:s.id)} style={{cursor:'pointer',background:isExp?'#F0FDF4':''}}>
                          <td style={{textAlign:'center',padding:'0 8px'}}><window.SYChevron open={isExp} color="var(--ok)"/></td>
                          <td style={{textAlign:'center',color:'var(--txt2)',fontWeight:500}}>{i+1}</td>
                          <td style={{fontFamily:'var(--font)',fontSize:11.5}}>{s.challanNumber||'—'}</td>
                          <td style={{fontFamily:'var(--font)',fontSize:11}}>{s.vehicleFull||'—'}</td>
                          <td>{Store.name('materials',s.materialId)||'—'}</td>
                          <td style={{fontWeight:500}}>{Store.name('customers',s.customerId)||'—'}</td>
                          <td style={{whiteSpace:'nowrap'}}>{window.fmtDate(s.date)}</td>
                          <td style={{fontWeight:600}}>{qty.toFixed(3)}</td>
                          <td><span className="bdg bg-or" style={{fontSize:10,padding:'1px 5px'}}>{Store.name('companies',s.companyId)}</span></td>
                        </tr>
                        {isExp&&<tr><td colSpan={9} style={{padding:0,borderBottom:'2px solid #BBF7D0'}}><window.DashActRowDrill item={s} type="Sales"/></td></tr>}
                      </React.Fragment>
                    );
                  })}
              </tbody>
            </table>}
        </div>
      </div>

      {/* ── Drill-down modal ── */}
      {renderDrill()}
    </div>
  );
}
window.GroupDashboardPage = GroupDashboardPage;
