// v-orders.jsx — Orders & Sales: live kitchen queue + sales analytics

// ─── Order status config ─────────────────────────────────────────────
const O_STATUS = {
  awaiting_payment:{ tone:'amber', label:'Awaiting payment', flow:null, cta:null },
  new:       { tone:'blue',   label:'New',              flow:'cooking',   cta:'Accept order' },
  cooking:   { tone:'orange', label:'Cooking',          flow:'ready',     cta:'Mark ready' },
  ready:     { tone:'green',  label:'Ready',            flowDelivery:'delivery', flowCollection:'completed', ctaDelivery:'Hand to driver', ctaCollection:'Mark collected' },
  delivery:  { tone:'purple', label:'Out for delivery', flow:'completed', cta:'Mark delivered' },
  completed: { tone:'grey',   label:'Completed',        flow:null,        cta:null },
  cancelled: { tone:'red',    label:'Cancelled',        flow:null,        cta:null },
  refunded:  { tone:'red',    label:'Refunded',         flow:null,        cta:null },
  draft:     { tone:'grey',   label:'Draft',            flow:null,        cta:null },
};

const TERMINAL_ORDER_STATUSES = new Set(['completed', 'cancelled', 'refunded']);

function nextStatus(o) {
  if (o.live) return o.nextApiStatus || null;
  const s = O_STATUS[o.status];
  if (o.status==='ready') return o.type==='delivery' ? s.flowDelivery : s.flowCollection;
  return s.flow;
}
function ctaFor(o) {
  if (o.live) return o.cta || null;
  const s = O_STATUS[o.status];
  if (o.status==='ready') return o.type==='delivery' ? s.ctaDelivery : s.ctaCollection;
  return s.cta;
}

// ─── Live order row ──────────────────────────────────────────────────
function OrderRow({ o, onAdvance, last, advancing=false }) {
  const st = O_STATUS[o.status];
  const done = TERMINAL_ORDER_STATUSES.has(o.status);
  const cta = ctaFor(o);
  return (
    <div style={{ display:'grid', gridTemplateColumns:'1.5fr 1.4fr 2.6fr 0.8fr 1fr 1.5fr', gap:12, alignItems:'center',
      padding:'13px 20px', borderBottom: last?'none':'1px solid var(--soft-line)', opacity: done?0.6:1, transition:'background 150ms' }}
      onMouseEnter={(e)=>e.currentTarget.style.background='var(--bg-elevated)'} onMouseLeave={(e)=>e.currentTarget.style.background='transparent'}>
      {/* order id + customer */}
      <div style={{ display:'flex', alignItems:'center', gap:11, minWidth:0 }}>
          <div style={{ width:38, height:38, borderRadius:10, flexShrink:0, background:'var(--dark-chocolate)', color:'var(--dust-cream)', display:'flex', alignItems:'center', justifyContent:'center', fontFamily:'var(--font-mono)', fontSize:11, fontWeight:500 }}>{String(o.name || 'Customer').split(' ').map(part=>part[0]).join('').slice(0,2)}</div>
        <div style={{ minWidth:0 }}>
          <div style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:13.5, color:'var(--fg-primary)', whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>
            {o.name}
            {o.bridge && <span style={{ marginLeft:7, verticalAlign:'1px', display:'inline-flex', alignItems:'center', gap:4, padding:'1px 7px', borderRadius:999, background:'rgba(46,139,78,0.12)', fontFamily:'var(--font-display)', fontWeight:800, fontSize:9.5, letterSpacing:'0.05em', textTransform:'uppercase', color:'#247a41' }}>Live · app</span>}
          </div>
          <div style={{ fontFamily:'var(--font-mono)', fontSize:10.5, color:'var(--warm-stone)' }}>#{o.id}</div>
        </div>
      </div>
      {/* type + estate */}
      <div style={{ minWidth:0 }}>
        <Pill tone={o.type==='delivery'?'orange':'blue'} icon={o.type==='delivery'?<I.truck c={o.type==='delivery'?'#c0500f':'#2f6694'} s={12}/>:<I.pin c="#2f6694" s={11}/>} style={{ fontSize:10, padding:'2px 7px' }}>{o.type==='delivery'?'Delivery':'Collection'}</Pill>
        <div style={{ fontFamily:'var(--font-body)', fontSize:11, color:'var(--warm-stone)', marginTop:4, whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{o.estate}</div>
      </div>
      {/* items */}
      <div style={{ minWidth:0 }}>
        <div style={{ fontFamily:'var(--font-body)', fontSize:12.5, color:'var(--fg-primary)', lineHeight:1.4, overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>{o.items}</div>
        <div style={{ fontFamily:'var(--font-body)', fontSize:10.5, color:'var(--warm-stone)', marginTop:2 }}>{o.qty} {o.qty===1?'item':'items'}</div>
      </div>
      {/* total */}
      <div style={{ fontFamily:'var(--font-display)', fontWeight:900, fontSize:14.5, color:'var(--fg-primary)' }}>£{o.total.toFixed(2)}</div>
      {/* status + timer */}
      <div>
        <Pill tone={st.tone} dot>{st.label}</Pill>
        <div style={{ display:'flex', alignItems:'center', gap:4, marginTop:5, fontFamily:'var(--font-mono)', fontSize:10.5, color: o.mins>=15&&!done?'#b0341a':'var(--warm-stone)' }}>
          <I.clock c={o.mins>=15&&!done?'#b0341a':'var(--warm-stone)'} s={12}/>{o.mins} min
        </div>
      </div>
      {/* action */}
      <div style={{ display:'flex', justifyContent:'flex-end' }}>
        {cta ? (
          <Btn kind={o.status==='new'?'accent':'primary'} size="sm" disabled={advancing} onClick={()=>onAdvance(o.id)}
            icon={o.status==='new'?<I.check c="#fff" s={15}/>:<I.arrow c="var(--dust-cream)" s={15}/>}>{advancing?'Updating…':cta}</Btn>
        ) : o.live && o.rawStatus==='ready_for_collection' ? (
          <span title="TheZoo rider assignment is waiting for the dispatch contract." style={{ display:'inline-flex', alignItems:'center', gap:6, fontFamily:'var(--font-display)', fontWeight:700, fontSize:12, color:'var(--warm-stone)' }}>
            Awaiting TheZoo assignment <Wire kind="pending" style={{ marginLeft:1 }}/>
          </span>
        ) : o.live && o.rawStatus==='agent_assigned' ? (
          <span style={{ display:'inline-flex', alignItems:'center', gap:6, fontFamily:'var(--font-display)', fontWeight:700, fontSize:12, color:'#247a41' }}>
            <I.truck c="#247a41" s={15}/>TheZoo rider assigned
          </span>
        ) : o.live && o.rawStatus==='picked_up' ? (
          <span style={{ display:'inline-flex', alignItems:'center', gap:6, fontFamily:'var(--font-display)', fontWeight:700, fontSize:12, color:'#5B4B9A' }}>
            <I.truck c="#5B4B9A" s={15}/>With TheZoo rider
          </span>
        ) : (
          <span style={{ display:'inline-flex', alignItems:'center', gap:6, fontFamily:'var(--font-display)', fontWeight:700, fontSize:12, color:done?'#247a41':'var(--warm-stone)' }}>
            {done?<><I.check c="#247a41" s={15}/>Final</>:<>Awaiting dispatch</>}
          </span>
        )}
      </div>
    </div>
  );
}

// ─── Sales bar chart ─────────────────────────────────────────────────
function SalesChart({ data, metric, peakColor='var(--brand-orange)' }) {
  const [hover, setHover] = React.useState(null);
  const vals = data.map(d=>d[metric]);
  const max = Math.max(...vals, 1);
  const peakIdx = vals.indexOf(max);
  const fmt = (v)=> metric==='rev' ? '£'+v.toLocaleString() : v+' orders';
  // gridlines at 0/25/50/75/100%
  return (
    <div style={{ position:'relative', height:240, paddingLeft:46 }}>
      {/* y axis gridlines */}
      {[1,0.75,0.5,0.25,0].map((f,i)=>(
        <div key={i} style={{ position:'absolute', left:46, right:0, top:`${(1-f)*200}px`, height:1, background:'var(--soft-line)', opacity: f===0?1:0.6 }}>
          <span style={{ position:'absolute', left:-44, top:-7, width:38, textAlign:'right', fontFamily:'var(--font-mono)', fontSize:9.5, color:'var(--warm-stone)' }}>
            {metric==='rev' ? '£'+Math.round(max*f).toLocaleString() : Math.round(max*f)}
          </span>
        </div>
      ))}
      {/* bars */}
      <div style={{ position:'absolute', left:46, right:0, top:0, height:200, display:'flex', alignItems:'flex-end', gap: data.length>14?3:6 }}>
        {data.map((d,i)=>{
          const h = Math.max(3, d[metric]/max*100);
          const isPeak = i===peakIdx;
          const on = hover===i;
          return (
            <div key={i} onMouseEnter={()=>setHover(i)} onMouseLeave={()=>setHover(null)}
              style={{ flex:1, height:'100%', display:'flex', flexDirection:'column', justifyContent:'flex-end', alignItems:'center', position:'relative', cursor:'default' }}>
              {on && (
                <div style={{ position:'absolute', bottom:`calc(${h}% + 8px)`, zIndex:5, background:'var(--dark-chocolate)', color:'var(--dust-cream)', borderRadius:8, padding:'6px 9px', whiteSpace:'nowrap', boxShadow:'var(--shadow-md)', pointerEvents:'none' }}>
                  <div style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:12 }}>{fmt(d[metric])}</div>
                  <div style={{ fontFamily:'var(--font-body)', fontSize:10, color:'#B6A595' }}>{metric==='rev'?d.ord+' orders':'£'+d.rev.toLocaleString()}</div>
                </div>
              )}
              <div style={{ width:'100%', maxWidth:46, height:`${h}%`, borderRadius:'5px 5px 0 0',
                background: isPeak||on ? peakColor : 'rgba(216,90,20,0.24)', transition:'height 500ms var(--ease-out), background 150ms' }}/>
            </div>
          );
        })}
      </div>
      {/* x labels */}
      <div style={{ position:'absolute', left:46, right:0, top:208, display:'flex', gap: data.length>14?3:6 }}>
        {data.map((d,i)=>(
          <div key={i} style={{ flex:1, textAlign:'center', fontFamily:'var(--font-mono)', fontSize:9.5, color:'var(--warm-stone)',
            visibility: data.length>14 && i%5!==0 && i!==data.length-1 ? 'hidden':'visible' }}>{d.label}</div>
        ))}
      </div>
    </div>
  );
}

// ─── KPI tile (local) ────────────────────────────────────────────────
function OTile({ icon, value, label, sub, delta, dir }) {
  const Icon = I[icon] || I.grid;
  const c = dir==='up' ? '#247a41' : dir==='down' ? '#b0341a' : '#7C675B';
  return (
    <Card pad={16} hover>
      <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between' }}>
        <div style={{ width:34, height:34, borderRadius:10, background:'var(--bg-warm)', display:'flex', alignItems:'center', justifyContent:'center' }}><Icon c="var(--brand-orange)" s={18}/></div>
        <span style={{ display:'inline-flex', alignItems:'center', gap:3, fontFamily:'var(--font-display)', fontWeight:800, fontSize:11.5, color:c }}>
          {dir==='up'&&<I.trendUp c={c} s={14}/>}{dir==='down'&&<I.trendDown c={c} s={14}/>}{delta}
        </span>
      </div>
      <div style={{ marginTop:13, fontFamily:'var(--font-display)', fontWeight:900, fontSize:26, letterSpacing:'-0.02em', color:'var(--fg-primary)', lineHeight:1 }}>{value}</div>
      <div style={{ marginTop:6, fontFamily:'var(--font-display)', fontWeight:700, fontSize:12.5, color:'var(--fg-primary)' }}>{label}</div>
      <div style={{ marginTop:2, fontFamily:'var(--font-body)', fontSize:11.5, color:'var(--warm-stone)' }}>{sub}</div>
    </Card>
  );
}

// ─── Payout statements modal ─────────────────────────────────────────
function StatementsModal({ app, onClose }) {
  return (
    <div onClick={onClose} style={{ position:'fixed', inset:0, zIndex:340, background:'rgba(27,18,13,0.5)', backdropFilter:'blur(3px)', display:'flex', justifyContent:'center', alignItems:'flex-start', padding:'70px 24px', animation:'v-fade 200ms var(--ease-out)' }}>
      <div onClick={(e)=>e.stopPropagation()} style={{ width:'100%', maxWidth:540, background:'var(--bg-surface)', borderRadius:20, boxShadow:'var(--shadow-lg)', overflow:'hidden', animation:'v-pop 240ms var(--ease-out)' }}>
        <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', padding:'16px 22px', borderBottom:'1px solid var(--soft-line)' }}>
          <Eyebrow><I.receipt c="var(--brand-orange)" s={13}/> &nbsp;Payout statements</Eyebrow>
          <span onClick={onClose} style={{ cursor:'pointer', display:'flex', padding:4 }}><I.x c="var(--warm-stone)" s={16}/></span>
        </div>
        <div style={{ padding:'6px 10px 10px' }}>
          {PAYOUTS.map((p,i)=>(
            <div key={p.id} style={{ display:'flex', alignItems:'center', gap:13, padding:'13px 12px', borderBottom: i<PAYOUTS.length-1?'1px solid var(--soft-line)':'none' }}>
              <span style={{ width:36, height:36, borderRadius:10, background:'var(--bg-warm)', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}><I.receipt c="var(--horse-brown)" s={16}/></span>
              <div style={{ flex:1, minWidth:0 }}>
                <div style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:13, color:'var(--fg-primary)' }}>{p.period}</div>
                <div style={{ fontFamily:'var(--font-mono)', fontSize:10, color:'var(--warm-stone)', marginTop:2 }}>{p.id} · gross £{p.gross.toLocaleString()} · fee £{p.fees.toLocaleString()}</div>
              </div>
              <div style={{ textAlign:'right', flexShrink:0 }}>
                <div style={{ fontFamily:'var(--font-display)', fontWeight:900, fontSize:14, color:'var(--fg-primary)' }}>£{p.net.toLocaleString()}</div>
                <Pill tone={p.status==='paid'?'green':'amber'} dot>{p.status==='paid'?'Paid':'Pending'}</Pill>
              </div>
              <Btn size="sm" onClick={()=>app.toast(`Statement ${p.id} downloaded (PDF)`)} disabled={p.status!=='paid'}>PDF</Btn>
            </div>
          ))}
          <div style={{ padding:'10px 12px 4px', fontFamily:'var(--font-body)', fontSize:10, color:'var(--warm-stone)' }}>Statements are generated when a payout settles. Pending periods appear once paid.</div>
        </div>
      </div>
    </div>
  );
}

// ─── Screen ──────────────────────────────────────────────────────────
function OrdersScreen({ app }) {
  const [stmtsOpen, setStmtsOpen] = React.useState(false);
  const [orders, setOrders] = React.useState([]);
  const [liveError, setLiveError] = React.useState(null);
  const [liveLoading, setLiveLoading] = React.useState(true);
  const [advancingId, setAdvancingId] = React.useState(null);
  const normalizeLiveOrder = (order) => {
    const state = {
      payment_pending:{ status:'awaiting_payment', cta:null, next:null },
      payment_confirmed:{ status:'new', cta:'Accept order', next:'sent_to_kitchen' },
      sent_to_kitchen:{ status:'cooking', cta:'Start preparing', next:'preparing' },
      preparing:{ status:'cooking', cta:'Mark ready', next:'ready_for_collection' },
      ready_for_collection:{ status:'ready', cta:null, next:null },
      agent_assigned:{ status:'delivery', cta:null, next:null },
      picked_up:{ status:'delivery', cta:null, next:null },
      on_the_way:{ status:'delivery', cta:null, next:null },
      delivered:{ status:'completed', cta:null, next:null },
      cancelled:{ status:'cancelled', cta:null, next:null },
      refunded:{ status:'refunded', cta:null, next:null },
      draft:{ status:'draft', cta:null, next:null },
    }[order.status] || { status:'draft', cta:null, next:null };
    const orderItems = order.items || [];
    return {
      id:order.id, name:'Customer', type:order.fulfillment_type === 'collection' ? 'collection' : 'delivery', estate:'Address protected',
      items:orderItems.map(item=>`${item.quantity}× ${item.name}`).join(', ') || 'Order items', qty:orderItems.reduce((sum,item)=>sum + Number(item.quantity || 0),0),
      total:Number(order.total || 0), mins:Math.max(0, Math.floor((Date.now()-new Date(order.created_at).getTime())/60000)),
      status:state.status, live:true, rawStatus:order.status, nextApiStatus:state.next, cta:state.cta, bridge:true,
    };
  };
  const refreshLiveOrders = React.useCallback(async () => {
    setLiveLoading(true); setLiveError(null);
    try { setOrders((await loadVendorLiveOrders()).map(normalizeLiveOrder)); }
    catch (error) { setLiveError(error instanceof Error ? error.message : 'Live orders could not be loaded.'); }
    finally { setLiveLoading(false); }
  }, []);
  React.useEffect(()=>{ refreshLiveOrders(); }, [refreshLiveOrders]);
  const [filter, setFilter] = React.useState('active');
  const [metric, setMetric] = React.useState('rev');

  const advance = async (id) => {
    const order = orders.find(item=>item.id===id);
    if (!order || advancingId || !order.nextApiStatus) return;
    if (!order.live) { setOrders(os => os.map(o => o.id===id ? { ...o, status: nextStatus(o), mins: 0 } : o)); return; }
    setAdvancingId(id);
    try { await transitionVendorOrder(id, order.nextApiStatus); app.toast(`Order moved to ${order.nextApiStatus.replaceAll('_',' ')}`); await refreshLiveOrders(); }
    catch (error) { app.toast(error instanceof Error ? error.message : 'Order transition failed.'); }
    finally { setAdvancingId(null); }
  };

  const counts = {
    active: orders.filter(o=>!TERMINAL_ORDER_STATUSES.has(o.status)).length,
    new: orders.filter(o=>o.status==='new').length,
    cooking: orders.filter(o=>o.status==='cooking').length,
    ready: orders.filter(o=>o.status==='ready').length,
    completed: orders.filter(o=>o.status==='completed').length,
  };
  const shown = orders.filter(o => filter==='active' ? !TERMINAL_ORDER_STATUSES.has(o.status) : filter==='completed' ? TERMINAL_ORDER_STATUSES.has(o.status) : o.status===filter);

  const range = app.range;
  const sum = SALES_SUMMARY[range] || SALES_SUMMARY.today;
  const chartData = range==='today' ? SALES_HOURLY : range==='week' ? SALES_DAILY : SALES_MONTHLY;
  const rangeWord = range==='today' ? 'today' : range==='week' ? 'this week' : 'this month';

  const mixTotal = ORDER_MIX.reduce((s,m)=>s+m.count,0);
  const deliveryPct = Math.round(ORDER_MIX[0].count/mixTotal*100);
  const topMaxRev = Math.max(...TOP_SELLERS.map(t=>t.rev));

  const tabs = [
    { id:'active', label:'Active', n:counts.active },
    { id:'new', label:'New', n:counts.new },
    { id:'cooking', label:'Cooking', n:counts.cooking },
    { id:'ready', label:'Ready', n:counts.ready },
    { id:'completed', label:'Completed', n:counts.completed },
  ];

  return (
    <div>
      <PageHead eyebrow="Orders & Sales" title="Orders &amp; sales"
        sub={`Live kitchen queue and takings for ${app.session.sess?.vendorName || 'your vendor'}`}
        right={
          <div style={{ display:'flex', alignItems:'center', gap:10 }}>
            <Segmented options={[{value:'today',label:'Today'},{value:'week',label:'7 days'},{value:'month',label:'30 days'}]} value={app.range} onChange={app.setRange}/>
            <Btn kind="white" icon={<I.arrow c="var(--fg-primary)" s={15}/>} onClick={()=>app.toast('Exporting sales report to CSV…')}>Export</Btn>
          </div>
        }/>

      {/* KPI row */}
      <div style={{ display:'grid', gridTemplateColumns:'repeat(4,1fr)', gap:14, marginBottom:18 }}>
        <OTile icon="receipt" value={sum.orders.toLocaleString()} label={range==='today'?"Orders today":"Orders"} sub={sum.sub} delta={sum.ordDelta} dir="up"/>
        <OTile icon="pound" value={'£'+sum.revenue.toLocaleString()} label={range==='today'?"Revenue today":"Revenue"} sub={sum.sub} delta={sum.revDelta} dir="up"/>
        <OTile icon="tag" value={'£'+sum.aov.toFixed(2)} label="Avg order value" sub={rangeWord} delta={sum.aovDelta} dir="up"/>
        <OTile icon="clock" value={sum.prep+' min'} label="Avg prep time" sub={`${sum.accept}% acceptance`} delta={sum.acceptDelta} dir={sum.acceptDelta==='flat'?'flat':'up'}/>
      </div>

      {/* Live order queue */}
      <Card pad={0} style={{ overflow:'hidden', marginBottom:18 }}>
        <div style={{ display:'flex', alignItems:'center', gap:14, padding:'15px 20px', borderBottom:'1px solid var(--soft-line)', flexWrap:'wrap' }}>
          <div style={{ display:'flex', alignItems:'center', gap:9 }}>
            <span style={{ position:'relative', width:9, height:9, flexShrink:0 }}>
              <span style={{ position:'absolute', inset:0, borderRadius:'50%', background:'var(--live-green)' }}/>
              <span style={{ position:'absolute', inset:0, borderRadius:'50%', background:'var(--live-green)', animation:'v-pulse 2s var(--ease-out) infinite' }}/>
            </span>
            <Eyebrow><I.receipt c="var(--brand-orange)" s={13}/> &nbsp;Live order queue</Eyebrow>
            <Wire kind="live"/>
          </div>
          <div style={{ display:'flex', gap:6, marginLeft:4, flexWrap:'wrap' }}>
            {tabs.map(t=>{
              const on = filter===t.id;
              return (
                <button key={t.id} onClick={()=>setFilter(t.id)} style={{ display:'inline-flex', alignItems:'center', gap:6, padding:'6px 12px', borderRadius:10, cursor:'pointer',
                  background: on?'var(--dark-chocolate)':'var(--bg-app)', color: on?'var(--dust-cream)':'var(--fg-primary)',
                  border:'1px solid', borderColor: on?'var(--dark-chocolate)':'var(--soft-line)',
                  fontFamily:'var(--font-display)', fontWeight:700, fontSize:12.5 }}>
                  {t.label}
                  <span style={{ fontFamily:'var(--font-mono)', fontSize:10.5, minWidth:16, textAlign:'center', padding:'1px 5px', borderRadius:6,
                    background: on?'rgba(245,239,231,0.16)':'var(--bg-warm)', color: on?'var(--dust-cream)':'var(--horse-brown)' }}>{t.n}</span>
                </button>
              );
            })}
          </div>
          <span style={{ marginLeft:'auto' }}><LastSync onRefresh={refreshLiveOrders} label="Queue updated"/></span>
        </div>

        {/* column header */}
        <div style={{ display:'grid', gridTemplateColumns:'1.5fr 1.4fr 2.6fr 0.8fr 1fr 1.5fr', gap:12, padding:'10px 20px', borderBottom:'1px solid var(--soft-line)', background:'var(--bg-app)' }}>
          {['Customer','Fulfilment','Items','Total','Status','Action'].map((h,i)=>(
            <span key={h} style={{ fontFamily:'var(--font-display)', fontWeight:700, fontSize:10.5, letterSpacing:'0.08em', textTransform:'uppercase', color:'var(--warm-stone)', textAlign: i===5?'right':'left' }}>{h}</span>
          ))}
        </div>

        {liveLoading ? <div style={{ padding:'40px 20px', textAlign:'center', fontFamily:'var(--font-body)', fontSize:13, color:'var(--warm-stone)' }}>Loading live kitchen queue…</div> : liveError ? <div style={{ padding:'40px 20px', textAlign:'center', fontFamily:'var(--font-body)', fontSize:13, color:'#b0341a' }}>
          <div>{liveError}</div>
          <Btn kind="white" size="sm" onClick={refreshLiveOrders} style={{ marginTop:12 }}>Try again</Btn>
        </div> : shown.length===0 ? (
          <div style={{ padding:'40px 20px', textAlign:'center', fontFamily:'var(--font-body)', fontSize:13, color:'var(--warm-stone)' }}>
            <I.check c="var(--live-green)" s={26}/>
            <div style={{ marginTop:8 }}>No {filter==='active'?'open':filter} orders right now.</div>
          </div>
        ) : shown.map((o,i)=> <OrderRow key={o.id} o={o} onAdvance={advance} advancing={advancingId===o.id} last={i===shown.length-1}/>)}
      </Card>

      {/* Sales chart + fulfilment */}
      <div style={{ display:'grid', gridTemplateColumns:'1.7fr 1fr', gap:16, marginBottom:18 }}>
        <Card pad={0} style={{ overflow:'hidden' }}>
          <div style={{ padding:'16px 22px 12px', display:'flex', alignItems:'center', justifyContent:'space-between', gap:14, flexWrap:'wrap', borderBottom:'1px solid var(--soft-line)' }}>
            <div>
              <Eyebrow style={{ marginBottom:6 }}>Sales {rangeWord}</Eyebrow>
              <div style={{ display:'flex', alignItems:'baseline', gap:10 }}>
                <span style={{ fontFamily:'var(--font-display)', fontWeight:900, fontSize:24, color:'var(--fg-primary)', lineHeight:1 }}>£{sum.revenue.toLocaleString()}</span>
                <span style={{ display:'inline-flex', alignItems:'center', gap:3, fontFamily:'var(--font-display)', fontWeight:800, fontSize:12.5, color:'#247a41' }}><I.trendUp c="#247a41" s={14}/>{sum.revDelta}</span>
                <span style={{ fontFamily:'var(--font-body)', fontSize:12, color:'var(--warm-stone)' }}>{sum.orders.toLocaleString()} orders</span>
              </div>
            </div>
            <Segmented size="sm" options={[{value:'rev',label:'Revenue'},{value:'ord',label:'Orders'}]} value={metric} onChange={setMetric}/>
          </div>
          <div style={{ padding:'22px 22px 16px' }}>
            <SalesChart data={chartData} metric={metric}/>
            <div style={{ marginTop:14, paddingTop:13, borderTop:'1px solid var(--soft-line)', display:'flex', alignItems:'center', gap:8 }}>
              <I.flame c="var(--brand-orange)" s={14} f/>
              <span style={{ fontFamily:'var(--font-body)', fontSize:12, color:'var(--warm-stone)' }}>
                {range==='today' ? <>Peak trading <strong style={{ color:'var(--fg-primary)', fontFamily:'var(--font-display)' }}>20:00–21:00</strong> — staff the kitchen for the evening rush.</>
                : <>Weekends drive <strong style={{ color:'var(--fg-primary)', fontFamily:'var(--font-display)' }}>38%</strong> of takings. Fri–Sun is your window.</>}
              </span>
            </div>
          </div>
        </Card>

        {/* Fulfilment mix */}
        <Card>
          <Eyebrow style={{ marginBottom:16 }}><I.truck c="var(--brand-orange)" s={13}/> &nbsp;Fulfilment {rangeWord}</Eyebrow>
          <div style={{ display:'flex', alignItems:'center', gap:18 }}>
            <Ring pct={deliveryPct} size={94} stroke={11} color="#D85A14" track="rgba(62,124,176,0.25)">
              <div style={{ textAlign:'center' }}>
                <div style={{ fontFamily:'var(--font-display)', fontWeight:900, fontSize:23, color:'var(--fg-primary)', lineHeight:1 }}>{deliveryPct}%</div>
                <div style={{ fontFamily:'var(--font-body)', fontSize:9, color:'var(--warm-stone)' }}>delivery</div>
              </div>
            </Ring>
            <div style={{ flex:1 }}>
              {ORDER_MIX.map(m=>(
                <div key={m.label} style={{ display:'flex', alignItems:'center', gap:9, marginBottom:9 }}>
                  <span style={{ width:10, height:10, borderRadius:3, background:m.color, flexShrink:0 }}/>
                  <span style={{ fontFamily:'var(--font-body)', fontSize:12.5, color:'var(--fg-primary)', flex:1 }}>{m.label}</span>
                  <span style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:13, color:'var(--fg-primary)' }}>{m.count}</span>
                </div>
              ))}
            </div>
          </div>
          <div style={{ marginTop:16, paddingTop:15, borderTop:'1px solid var(--soft-line)', display:'grid', gridTemplateColumns:'1fr 1fr', gap:14 }}>
            {[['Avg delivery','27 min'],['Avg prep',sum.prep+' min'],['On-time','94%'],['Acceptance',sum.accept+'%']].map(([l,v])=>(
              <div key={l}>
                <div style={{ fontFamily:'var(--font-display)', fontWeight:900, fontSize:18, color:'var(--fg-primary)' }}>{v}</div>
                <div style={{ fontFamily:'var(--font-body)', fontSize:11, color:'var(--warm-stone)', marginTop:2 }}>{l}</div>
              </div>
            ))}
          </div>
        </Card>
      </div>

      {/* Top sellers + payouts */}
      <div style={{ display:'grid', gridTemplateColumns:'1fr 1.25fr', gap:16 }}>
        {/* Top sellers */}
        <Card pad={0} style={{ overflow:'hidden' }}>
          <div style={{ padding:'16px 20px 12px', display:'flex', alignItems:'center', justifyContent:'space-between', borderBottom:'1px solid var(--soft-line)' }}>
            <Eyebrow><I.flame c="var(--brand-orange)" s={13} f/> &nbsp;Top sellers {rangeWord}</Eyebrow>
            <span onClick={()=>app.nav('menu')} style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:12, color:'var(--brand-orange)', cursor:'pointer' }}>Menu →</span>
          </div>
          <div style={{ padding:'4px 20px 8px' }}>
            {TOP_SELLERS.map((t,i)=>(
              <div key={t.name} style={{ display:'flex', alignItems:'center', gap:12, padding:'11px 0', borderBottom: i<TOP_SELLERS.length-1?'1px solid var(--soft-line)':'none' }}>
                <span style={{ fontFamily:'var(--font-display)', fontWeight:900, fontSize:13, color:'var(--warm-stone)', width:16, textAlign:'center', flexShrink:0 }}>{i+1}</span>
                <div style={{ flex:1, minWidth:0 }}>
                  <div style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:13, color:'var(--fg-primary)', whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{t.name}</div>
                  <div style={{ marginTop:5, display:'flex', alignItems:'center', gap:8 }}>
                    <div style={{ flex:1, maxWidth:120 }}><Bar pct={t.rev/topMaxRev*100} color="var(--brand-orange)" h={5}/></div>
                    <span style={{ fontFamily:'var(--font-body)', fontSize:10.5, color:'var(--warm-stone)' }}>{t.qty} sold</span>
                  </div>
                </div>
                <div style={{ textAlign:'right', flexShrink:0 }}>
                  <div style={{ fontFamily:'var(--font-display)', fontWeight:900, fontSize:14, color:'var(--fg-primary)' }}>£{t.rev}</div>
                  <Trend dir={t.trendDir} pct={t.trendPct} size={11}/>
                </div>
              </div>
            ))}
          </div>
        </Card>

        {/* Payouts */}
        <Card pad={0} style={{ overflow:'hidden' }}>
          <div style={{ padding:'16px 20px 12px', display:'flex', alignItems:'center', justifyContent:'space-between', borderBottom:'1px solid var(--soft-line)' }}>
            <Eyebrow><I.pound c="var(--brand-orange)" s={13}/> &nbsp;Payouts &amp; reconciliation</Eyebrow>
            <span onClick={()=>setStmtsOpen(true)} style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:12, color:'var(--brand-orange)', cursor:'pointer' }}>Statements →</span>
          </div>
          <div style={{ display:'grid', gridTemplateColumns:'1.4fr 1fr 1fr 1fr 1fr', gap:10, padding:'10px 20px', borderBottom:'1px solid var(--soft-line)', background:'var(--bg-app)' }}>
            {['Period','Gross','Lasso fee','Net','Status'].map((h,i)=>(
              <span key={h} style={{ fontFamily:'var(--font-display)', fontWeight:700, fontSize:10.5, letterSpacing:'0.06em', textTransform:'uppercase', color:'var(--warm-stone)', textAlign: i>=1&&i<=3?'right':'left' }}>{h}</span>
            ))}
          </div>
          {PAYOUTS.map((p,i)=>(
            <div key={p.id} style={{ display:'grid', gridTemplateColumns:'1.4fr 1fr 1fr 1fr 1fr', gap:10, alignItems:'center', padding:'13px 20px', borderBottom: i<PAYOUTS.length-1?'1px solid var(--soft-line)':'none' }}>
              <div style={{ minWidth:0 }}>
                <div style={{ fontFamily:'var(--font-display)', fontWeight:800, fontSize:13, color:'var(--fg-primary)' }}>{p.period}</div>
                <div style={{ fontFamily:'var(--font-mono)', fontSize:10, color:'var(--warm-stone)' }}>{p.id}</div>
              </div>
              <span style={{ fontFamily:'var(--font-display)', fontWeight:700, fontSize:12.5, color:'var(--fg-primary)', textAlign:'right' }}>£{p.gross.toLocaleString()}</span>
              <span style={{ fontFamily:'var(--font-body)', fontSize:12.5, color:'#b0341a', textAlign:'right' }}>−£{p.fees.toLocaleString()}</span>
              <span style={{ fontFamily:'var(--font-display)', fontWeight:900, fontSize:13.5, color:'var(--fg-primary)', textAlign:'right' }}>£{p.net.toLocaleString()}</span>
              <div>
                <Pill tone={p.status==='paid'?'green':'amber'} dot>{p.status==='paid'?'Paid':'Pending'}</Pill>
                <div style={{ fontFamily:'var(--font-body)', fontSize:10, color:'var(--warm-stone)', marginTop:3 }}>{p.date}</div>
              </div>
            </div>
          ))}
        </Card>
      </div>

      {stmtsOpen && <StatementsModal app={app} onClose={()=>setStmtsOpen(false)}/>}
    </div>
  );
}

Object.assign(window, { OrdersScreen, StatementsModal });
