// Job detail, invoice, simple list screens

function JobDetail({ state, setState }) {
  const trade = TRADES[state.tradeId];
  const job = FOCUS_JOB[state.tradeId];
  const allJobs = JOBS_BY_TRADE[state.tradeId];
  const pipelineJob = allJobs.find(j => j.id === job.id) || allJobs[3];

  return (
    <div style={{ display: 'grid', gridTemplateColumns: '1fr 340px', minHeight: 'calc(100vh - 52px)' }}>
      <div style={{ padding: '22px 28px 60px', borderRight: '1px solid var(--border)' }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 8 }}>
          <button onClick={() => setState(s => ({ ...s, screen: 'pipeline' }))} style={{ padding: 4, border: 'none', background: 'transparent', cursor: 'pointer', color: 'var(--ink-60)', borderRadius: 4 }}>
            <Icon name="arrow-left" size={14}/>
          </button>
          <Chip tone="accent">{job.id}</Chip>
          <Chip tone="ghost">{trade.label}</Chip>
          <Chip tone="sage">Approved</Chip>
          <div style={{ flex: 1 }} />
          <Btn variant="ghost" size="sm" icon="more"/>
          <Btn variant="secondary" size="sm" icon="pencil">Edit</Btn>
          <Btn variant="primary" size="sm" icon="receipt" onClick={() => setState(s => ({ ...s, screen: 'invoice' }))}>Generate invoice</Btn>
        </div>
        <h1 style={{ fontSize: 30, fontWeight: 500, letterSpacing: -0.6, margin: '12px 0 6px', fontFamily: 'var(--display)', textWrap: 'balance' }}>{job.title}</h1>
        <div style={{ fontSize: 14, color: 'var(--ink-70)', display: 'flex', gap: 14, alignItems: 'center', flexWrap: 'wrap' }}>
          <span><Icon name="user" size={13} style={{ verticalAlign: -2, marginRight: 4 }}/>{job.customer}</span>
          <span><Icon name="map" size={13} style={{ verticalAlign: -2, marginRight: 4 }}/>{job.address}</span>
          <span><Icon name="phone" size={13} style={{ verticalAlign: -2, marginRight: 4 }}/>{job.customerPhone}</span>
        </div>

        {/* Stage strip */}
        <div style={{ marginTop: 22, display: 'grid', gridTemplateColumns: `repeat(${STAGES.length}, 1fr)`, gap: 4, padding: '12px', background: 'var(--surface-2)', borderRadius: 10, border: '1px solid var(--border)' }}>
          {STAGES.map((s, i) => {
            const idx = STAGES.findIndex(x => x.id === pipelineJob.stage);
            const done = i <= idx;
            const current = i === idx;
            return (
              <div key={s.id} style={{ textAlign: 'center' }}>
                <div style={{
                  height: 4, background: done ? 'var(--accent)' : 'var(--surface-3)',
                  borderRadius: 2, marginBottom: 6,
                }} />
                <div style={{ fontSize: 10, fontFamily: 'var(--mono)', color: current ? 'var(--ink)' : 'var(--ink-50)', textTransform: 'uppercase', letterSpacing: 0.3 }}>{s.label}</div>
              </div>
            );
          })}
        </div>

        {/* Tabs */}
        <div style={{ marginTop: 26, borderBottom: '1px solid var(--border)', display: 'flex', gap: 4 }}>
          {['Overview', 'Photos & notes', 'Quote', 'Invoice', 'Activity', 'Files'].map((t, i) => (
            <button key={t} style={{
              padding: '10px 14px', border: 'none', background: 'transparent',
              fontSize: 13, fontWeight: i === 0 ? 500 : 400, color: i === 0 ? 'var(--ink)' : 'var(--ink-60)',
              borderBottom: i === 0 ? '2px solid var(--ink)' : '2px solid transparent',
              marginBottom: -1, cursor: 'pointer', fontFamily: 'var(--sans)',
            }}>{t}</button>
          ))}
        </div>

        <div style={{ marginTop: 22, display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 18 }}>
          <Card title="Job description">
            <p style={{ fontSize: 13, lineHeight: 1.6, color: 'var(--ink-80)', margin: 0, textWrap: 'pretty' }}>{job.description}</p>
          </Card>
          <Card title="Scheduled" right={<Chip tone="accent">Thu 18 Apr · 9:00am</Chip>}>
            <div style={{ fontSize: 13, color: 'var(--ink-70)', lineHeight: 1.6 }}>
              <div>Dan Hartley - 4h allocated</div>
              <div>Dinesh Nair - 2h electrical (L2)</div>
              <div style={{ marginTop: 8, fontSize: 11, fontFamily: 'var(--mono)', color: 'var(--ink-60)' }}>Next: {allJobs.find(j => j.scheduledFor)?.title || 'Next scheduled job'}</div>
            </div>
          </Card>
          <Card title="Photos · site visit" wide>
            <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 8 }}>
              {job.photos.map((p, i) => <PlaceholderImage key={i} label={p.label} tone={p.tone} height={96} />)}
            </div>
          </Card>
          <Card title="Quote summary" right={<Chip tone="sage">Approved 12:12pm</Chip>} wide>
            <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
              <div>
                <div style={{ fontSize: 22, fontWeight: 500, fontFamily: 'var(--display)' }}>{fmtAUDcents(QUOTE_STREAMS[state.tradeId].summary.total)}</div>
                <div style={{ fontSize: 11, color: 'var(--ink-60)', fontFamily: 'var(--mono)' }}>inc-GST · 14-day terms · 11 line items</div>
              </div>
              <Btn variant="secondary" size="md" icon="external" onClick={() => setState(s => ({ ...s, screen: 'ai-quote' }))}>Open quote</Btn>
            </div>
          </Card>
          <Card title="Activity" wide>
            <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
              {ACTIVITY.map((a, i) => (
                <div key={i} style={{ display: 'flex', gap: 10, alignItems: 'flex-start', fontSize: 12.5 }}>
                  <div style={{ width: 6, height: 6, borderRadius: 3, background: a.who === 'AI' ? 'var(--accent-deep)' : 'var(--ink-40)', marginTop: 6 }} />
                  <div style={{ flex: 1 }}>
                    <div style={{ color: 'var(--ink)' }}>{a.what}</div>
                    <div style={{ fontSize: 11, fontFamily: 'var(--mono)', color: 'var(--ink-50)', marginTop: 1 }}>{a.who} · {a.when}</div>
                  </div>
                </div>
              ))}
            </div>
          </Card>
        </div>
      </div>

      {/* Side panel */}
      <aside style={{ padding: '22px 20px 60px', background: 'var(--surface-2)', display: 'flex', flexDirection: 'column', gap: 18 }}>
        <div>
          <div style={{ fontSize: 10.5, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 8 }}>Customer</div>
          <div style={{ padding: 12, background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 10 }}>
            <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
              <Avatar initials={job.customer.slice(0, 2).toUpperCase()} size={34}/>
              <div>
                <div style={{ fontWeight: 500, fontSize: 14 }}>{job.customer}</div>
                <div style={{ fontSize: 11.5, color: 'var(--ink-60)' }}>{job.customerPhone}</div>
              </div>
            </div>
            <div style={{ marginTop: 10, display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 6 }}>
              <Btn variant="secondary" size="sm" icon="phone">Call</Btn>
              <Btn variant="secondary" size="sm" icon="mail">Email</Btn>
            </div>
          </div>
        </div>

        <div>
          <div style={{ fontSize: 10.5, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 8 }}>Compliance</div>
          <div style={{ padding: 12, background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 10, fontSize: 12, color: 'var(--ink-70)' }}>
            <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 6 }}>
              <Icon name="shield" size={13} style={{ color: 'var(--sage-dark)' }}/>
              <span>{trade.licence}</span>
            </div>
            <div style={{ fontSize: 11, color: 'var(--ink-60)', lineHeight: 1.5 }}>
              {state.tradeId === 'hvac' && 'ARCtick log required on completion. R32 charge recorded.'}
              {state.tradeId === 'plumbing' && 'Council inspection booked after rough-in.'}
              {state.tradeId === 'solar' && 'CEC installer sign-off required. STC application will auto-draft.'}
              {state.tradeId === 'electrical' && 'CoES will generate post-test.'}
              {state.tradeId === 'roofing' && 'Working-at-heights cert valid. Scaffold permit needed.'}
            </div>
          </div>
        </div>

        <div>
          <div style={{ fontSize: 10.5, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 8 }}>Payment</div>
          <div style={{ padding: 12, background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 10, fontSize: 12, color: 'var(--ink-70)' }}>
            <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 4 }}><span>Invoice total</span><span style={{ fontFamily: 'var(--mono)', color: 'var(--ink)' }}>{fmtAUDcents(QUOTE_STREAMS[state.tradeId].summary.total)}</span></div>
            <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 4 }}><span>Paid</span><span style={{ fontFamily: 'var(--mono)', color: 'var(--ink-50)' }}>-</span></div>
            <div style={{ display: 'flex', justifyContent: 'space-between' }}><span>Outstanding</span><span style={{ fontFamily: 'var(--mono)', color: 'var(--accent-deep)', fontWeight: 500 }}>{fmtAUDcents(QUOTE_STREAMS[state.tradeId].summary.total)}</span></div>
          </div>
        </div>
      </aside>
    </div>
  );
}

function Card({ title, children, right, wide }) {
  return (
    <div style={{
      padding: 16, border: '1px solid var(--border)', borderRadius: 12, background: 'var(--surface)',
      gridColumn: wide ? 'span 2' : 'auto',
    }}>
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 12 }}>
        <div style={{ fontSize: 11, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6 }}>{title}</div>
        {right}
      </div>
      {children}
    </div>
  );
}

// Invoice + Payment screen
function InvoiceView({ state, setState }) {
  const trade = TRADES[state.tradeId];
  const job = FOCUS_JOB[state.tradeId];
  const summary = QUOTE_STREAMS[state.tradeId].summary;
  const items = QUOTE_STREAMS[state.tradeId].items;
  const [paid, setPaid] = React.useState(false);
  const [paying, setPaying] = React.useState(false);

  const pay = () => { setPaying(true); setTimeout(() => { setPaying(false); setPaid(true); }, 1400); };

  return (
    <div style={{ display: 'grid', gridTemplateColumns: '1fr 360px', minHeight: 'calc(100vh - 52px)' }}>
      <div style={{ padding: '22px 28px 60px', borderRight: '1px solid var(--border)' }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>
          <button onClick={() => setState(s => ({ ...s, screen: 'job-detail' }))} style={{ padding: 4, border: 'none', background: 'transparent', cursor: 'pointer', color: 'var(--ink-60)' }}><Icon name="arrow-left" size={14}/></button>
          <Chip tone="accent">INV-{job.id.replace('J-', '')}</Chip>
          {paid ? <Chip tone="sage" icon="check">Paid · Apr 17</Chip> : <Chip tone="warn">Awaiting payment</Chip>}
          <div style={{ flex: 1 }} />
          <Btn variant="ghost" size="sm" icon="download">PDF</Btn>
          <Btn variant="secondary" size="sm" icon="send">Re-send</Btn>
        </div>

        {/* Invoice doc */}
        <div data-tour="invoice-doc" style={{
          background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 12,
          padding: '32px 36px', maxWidth: 780, margin: '0 auto',
          boxShadow: '0 1px 2px rgba(0,0,0,0.02)', fontFamily: 'var(--sans)',
        }}>
          <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 28 }}>
            <div>
              <div style={{ width: 36, height: 36, background: 'var(--ink)', borderRadius: 8, display: 'grid', placeItems: 'center', marginBottom: 10 }}>
                <div style={{ width: 12, height: 12, border: '2px solid var(--paper)', borderRadius: 2, transform: 'rotate(45deg)' }} />
              </div>
              <div style={{ fontSize: 14, fontWeight: 600 }}>{BUSINESS.name}</div>
              <div style={{ fontSize: 11, color: 'var(--ink-60)', lineHeight: 1.5, marginTop: 3 }}>
                ABN {BUSINESS.abn}<br/>{BUSINESS.city}, {BUSINESS.suburb}<br/>{BUSINESS.phone}
              </div>
            </div>
            <div style={{ textAlign: 'right' }}>
              <div style={{ fontSize: 26, fontWeight: 500, letterSpacing: -0.4, fontFamily: 'var(--display)' }}>Tax Invoice</div>
              <div style={{ fontFamily: 'var(--mono)', fontSize: 12, color: 'var(--ink-60)', marginTop: 4 }}>
                INV-{job.id.replace('J-', '')}<br/>Issued 17 Apr 2026<br/>Due 1 May 2026
              </div>
            </div>
          </div>

          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 20, padding: '14px 0', borderTop: '1px solid var(--border)', borderBottom: '1px solid var(--border)' }}>
            <div>
              <div style={{ fontSize: 10, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 4 }}>Bill to</div>
              <div style={{ fontSize: 13, fontWeight: 500 }}>{job.customer}</div>
              <div style={{ fontSize: 12, color: 'var(--ink-70)', marginTop: 2 }}>{job.address}</div>
            </div>
            <div>
              <div style={{ fontSize: 10, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 4 }}>Job reference</div>
              <div style={{ fontSize: 13, fontWeight: 500 }}>{job.id} · {job.title}</div>
              <div style={{ fontSize: 12, color: 'var(--ink-70)', marginTop: 2 }}>Completed Thu 18 Apr</div>
            </div>
          </div>

          <div style={{ marginTop: 20 }}>
            <div style={{
              display: 'grid', gridTemplateColumns: '1fr 60px 90px 110px',
              padding: '8px 0', borderBottom: '1px solid var(--border)',
              fontSize: 10, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6, gap: 10,
            }}>
              <div>Description</div><div style={{ textAlign: 'right' }}>Qty</div><div style={{ textAlign: 'right' }}>Rate</div><div style={{ textAlign: 'right' }}>Amount</div>
            </div>
            {items.slice(0, 9).map((item, i) => (
              <div key={i} style={{
                display: 'grid', gridTemplateColumns: '1fr 60px 90px 110px',
                padding: '9px 0', borderBottom: '1px solid var(--border)',
                fontSize: 12.5, gap: 10, alignItems: 'center',
              }}>
                <div style={{ color: 'var(--ink-80)', textWrap: 'pretty' }}>{item.text}</div>
                <div style={{ fontFamily: 'var(--mono)', textAlign: 'right', color: 'var(--ink-70)', fontSize: 11 }}>{item.qty}{item.unit ? ` ${item.unit}` : ''}</div>
                <div style={{ fontFamily: 'var(--mono)', textAlign: 'right', color: 'var(--ink-70)', fontSize: 11 }}>{item.rate ? fmtAUDcents(item.rate) : '-'}</div>
                <div style={{ fontFamily: 'var(--mono)', textAlign: 'right', color: 'var(--ink)', fontSize: 12 }}>{fmtAUDcents(item.total)}</div>
              </div>
            ))}
            <div style={{ display: 'flex', flexDirection: 'column', gap: 4, alignItems: 'flex-end', marginTop: 16, fontFamily: 'var(--mono)', fontSize: 13 }}>
              <Row label="Subtotal (ex-GST)" value={fmtAUDcents(summary.subtotal)} />
              <Row label="GST 10%" value={fmtAUDcents(summary.gst)} />
              <div style={{ height: 1, width: 260, background: 'var(--border)', margin: '6px 0' }} />
              <Row label="Total AUD inc-GST" value={fmtAUDcents(summary.total)} big />
            </div>
          </div>

          <div data-tour="payment-options" style={{ marginTop: 28, padding: 14, background: 'var(--surface-2)', borderRadius: 10, border: '1px solid var(--border)' }}>
            <div style={{ fontSize: 10, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 8 }}>Payment options</div>
            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: 10, fontSize: 12 }}>
              <div>
                <div style={{ fontWeight: 500, marginBottom: 2 }}>PayID</div>
                <div style={{ fontFamily: 'var(--mono)', color: 'var(--ink-70)' }}>{BUSINESS.email}</div>
              </div>
              <div>
                <div style={{ fontWeight: 500, marginBottom: 2 }}>BPAY</div>
                <div style={{ fontFamily: 'var(--mono)', color: 'var(--ink-70)' }}>Biller 118204<br/>Ref INV{job.id.replace('J-', '')}</div>
              </div>
              <div>
                <div style={{ fontWeight: 500, marginBottom: 2 }}>Card</div>
                <div style={{ color: 'var(--ink-70)' }}>Stripe link in email<br/>(surcharge 1.4%)</div>
              </div>
            </div>
          </div>
        </div>
      </div>

      {/* Payment side panel */}
      <aside style={{ padding: '22px 20px 60px', background: 'var(--surface-2)', display: 'flex', flexDirection: 'column', gap: 18 }}>
        <div>
          <div style={{ fontSize: 10.5, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 8 }}>Balance</div>
          <div style={{ padding: 18, background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 12 }}>
            <div style={{ fontSize: 32, fontWeight: 500, letterSpacing: -0.6, fontFamily: 'var(--display)' }}>{fmtAUDcents(paid ? 0 : summary.total)}</div>
            <div style={{ fontSize: 11.5, color: 'var(--ink-60)', fontFamily: 'var(--mono)', marginTop: 2 }}>
              {paid ? `Received ${fmtAUDcents(summary.total)} via PayID` : 'Due 1 May 2026 · 14 days'}
            </div>
            {!paid && (
              <button data-tour="pay-btn" onClick={pay} disabled={paying} style={{
                marginTop: 12, width: '100%', padding: '10px 14px', borderRadius: 9,
                background: paying ? 'var(--ink-70)' : 'var(--ink)', color: 'var(--paper)', border: 'none',
                fontSize: 13, fontWeight: 500, cursor: paying ? 'wait' : 'pointer',
                display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,
              }}>
                {paying ? <><span style={{ width: 12, height: 12, border: '2px solid var(--paper)', borderRightColor: 'transparent', borderRadius: 6, animation: 'spin 0.8s linear infinite' }}/> Receiving PayID…</> : <>Mark as paid · record PayID</>}
              </button>
            )}
          </div>
        </div>

        <div>
          <div style={{ fontSize: 10.5, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 8 }}>Reminders</div>
          <div style={{ padding: 12, background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 10, fontSize: 12, color: 'var(--ink-70)', lineHeight: 1.6 }}>
            <div>Auto-send on day 7</div>
            <div>Final notice on day 14</div>
            <div style={{ fontSize: 11, color: 'var(--ink-60)', fontFamily: 'var(--mono)', marginTop: 6 }}>Custom templates in Settings →</div>
          </div>
        </div>

        <div>
          <div style={{ fontSize: 10.5, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 8 }}>Xero sync</div>
          <div style={{ padding: 12, background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 10, fontSize: 12, color: 'var(--ink-70)' }}>
            <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 4 }}>
              <span style={{ width: 6, height: 6, borderRadius: 3, background: 'var(--sage-dark)' }}/>
              <span>Pushed to Xero · 12:14pm</span>
            </div>
            <div style={{ fontSize: 11, fontFamily: 'var(--mono)', color: 'var(--ink-60)' }}>BAS will include this quarter.</div>
          </div>
        </div>
      </aside>
    </div>
  );
}

// Simple list screens reused: quotes, invoices, customers, schedule, reports
function QuotesList({ state, onOpen }) {
  const trade = TRADES[state.tradeId];
  const jobs = JOBS_BY_TRADE[state.tradeId].filter(j => ['quoting', 'approved', 'scheduled'].includes(j.stage));
  return <SimpleList title="Quotes" jobs={jobs} trade={trade} onOpen={onOpen} valueLabel="Quote" />;
}
function InvoicesList({ state, onOpen }) {
  const trade = TRADES[state.tradeId];
  const jobs = JOBS_BY_TRADE[state.tradeId].filter(j => ['invoiced', 'paid'].includes(j.stage));
  return <SimpleList title="Invoices" jobs={jobs} trade={trade} onOpen={onOpen} valueLabel="Invoice" />;
}
function CustomersList({ state }) {
  const trade = TRADES[state.tradeId];
  const jobs = JOBS_BY_TRADE[state.tradeId];
  const customers = {};
  jobs.forEach(j => { customers[j.customer] = customers[j.customer] || { name: j.customer, address: j.address, count: 0, value: 0 }; customers[j.customer].count++; customers[j.customer].value += j.value || 0; });
  return (
    <div style={{ padding: 22 }}>
      <div style={{ border: '1px solid var(--border)', borderRadius: 10, background: 'var(--surface)', overflow: 'hidden' }}>
        {Object.values(customers).map((c, i) => (
          <div key={c.name} style={{ padding: '14px 16px', borderBottom: i < Object.keys(customers).length - 1 ? '1px solid var(--border)' : 'none', display: 'flex', alignItems: 'center', gap: 14 }}>
            <Avatar initials={c.name.slice(0, 2).toUpperCase()} size={34}/>
            <div style={{ flex: 1 }}>
              <div style={{ fontWeight: 500, fontSize: 14 }}>{c.name}</div>
              <div style={{ fontSize: 12, color: 'var(--ink-60)' }}>{c.address} · {c.count} jobs · {fmtAUD(c.value)} lifetime</div>
            </div>
            <Btn variant="secondary" size="sm" icon="external">Open</Btn>
          </div>
        ))}
      </div>
    </div>
  );
}

function Schedule({ state }) {
  const jobs = JOBS_BY_TRADE[state.tradeId].filter(j => j.scheduledFor || j.stage === 'scheduled' || j.stage === 'in-progress');
  const days = ['Mon 15', 'Tue 16', 'Wed 17', 'Thu 18', 'Fri 19'];
  return (
    <div style={{ padding: 22 }}>
      <div style={{ border: '1px solid var(--border)', borderRadius: 12, overflow: 'hidden', background: 'var(--surface)' }}>
        <div style={{ display: 'grid', gridTemplateColumns: `80px repeat(${days.length}, 1fr)`, borderBottom: '1px solid var(--border)', background: 'var(--surface-2)' }}>
          <div></div>
          {days.map(d => <div key={d} style={{ padding: '10px 12px', fontSize: 11, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.5 }}>{d}</div>)}
        </div>
        {['Dan H', 'Dinesh N', 'Kyle L'].map((tech, ti) => (
          <div key={tech} style={{ display: 'grid', gridTemplateColumns: `80px repeat(${days.length}, 1fr)`, borderBottom: '1px solid var(--border)', minHeight: 70 }}>
            <div style={{ padding: '14px 12px', fontSize: 12, fontWeight: 500, background: 'var(--surface-2)', display: 'flex', alignItems: 'center', gap: 6 }}><Avatar initials={tech.split(' ').map(x => x[0]).join('')} size={22}/>{tech}</div>
            {days.map((d, di) => (
              <div key={d} style={{ padding: 8, borderLeft: '1px solid var(--border)' }}>
                {ti === 0 && di === 3 && <MiniScheduleBlock job={jobs[0]} />}
                {ti === 1 && di === 3 && <MiniScheduleBlock job={jobs[1]} />}
                {ti === 0 && di === 4 && <MiniScheduleBlock job={jobs[2]} half />}
                {ti === 2 && di === 2 && <MiniScheduleBlock job={jobs[3]} />}
              </div>
            ))}
          </div>
        ))}
      </div>
    </div>
  );
}
function MiniScheduleBlock({ job, half }) {
  if (!job) return null;
  return <div style={{ padding: 8, borderRadius: 6, background: 'var(--accent-tint)', border: '1px solid var(--accent-border)', fontSize: 11, opacity: half ? 0.7 : 1 }}>
    <div style={{ fontFamily: 'var(--mono)', fontSize: 10, color: 'var(--accent-ink)' }}>{job.id}</div>
    <div style={{ fontWeight: 500, color: 'var(--ink)', marginTop: 2 }}>{job.title}</div>
    <div style={{ fontSize: 10, color: 'var(--ink-60)', marginTop: 2 }}>{job.address}</div>
  </div>;
}

function Reports({ state }) {
  return (
    <div style={{ padding: 22 }}>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: 14 }}>
        {[
          { t: 'Revenue this month', v: '$42,680', d: '+12% vs last month' },
          { t: 'Quotes sent · win rate', v: '61%', d: '17 of 28 approved' },
          { t: 'Avg quote response time', v: '1.4 hr', d: 'target: <2 hr' },
          { t: 'BAS quarter - GST collected', v: '$8,420', d: 'export ready Q3' },
        ].map(c => (
          <div key={c.t} style={{ padding: 20, border: '1px solid var(--border)', borderRadius: 12, background: 'var(--surface)' }}>
            <div style={{ fontSize: 11, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.5, marginBottom: 8 }}>{c.t}</div>
            <div style={{ fontSize: 30, fontWeight: 500, letterSpacing: -0.6, fontFamily: 'var(--display)' }}>{c.v}</div>
            <div style={{ fontSize: 12, color: 'var(--ink-60)', marginTop: 4 }}>{c.d}</div>
            <div style={{ marginTop: 14, height: 40, display: 'flex', alignItems: 'flex-end', gap: 3 }}>
              {Array.from({ length: 20 }).map((_, i) => <div key={i} style={{ flex: 1, height: 8 + Math.abs(Math.sin(i * 0.7) + Math.cos(i)) * 30, background: i > 15 ? 'var(--accent)' : 'var(--surface-3)', borderRadius: 2 }}/>)}
            </div>
          </div>
        ))}
      </div>
    </div>
  );
}

function SimpleList({ title, jobs, trade, onOpen, valueLabel }) {
  return (
    <div style={{ padding: 22 }}>
      <div style={{ border: '1px solid var(--border)', borderRadius: 10, background: 'var(--surface)', overflow: 'hidden' }}>
        <div style={{ display: 'grid', gridTemplateColumns: '100px 1fr 200px 120px 100px 120px', padding: '10px 16px', background: 'var(--surface-2)', borderBottom: '1px solid var(--border)', fontSize: 10, fontFamily: 'var(--mono)', color: 'var(--ink-60)', textTransform: 'uppercase', letterSpacing: 0.6 }}>
          <div>Ref</div><div>{valueLabel}</div><div>Customer</div><div>Status</div><div>Total</div><div>Action</div>
        </div>
        {jobs.map((j, i) => (
          <div key={j.id} style={{ display: 'grid', gridTemplateColumns: '100px 1fr 200px 120px 100px 120px', padding: '12px 16px', borderBottom: i < jobs.length - 1 ? '1px solid var(--border)' : 'none', alignItems: 'center', fontSize: 13 }}>
            <span style={{ fontFamily: 'var(--mono)', fontSize: 11, color: 'var(--ink-60)' }}>{valueLabel === 'Invoice' ? 'INV-' : 'Q-'}{j.id.replace('J-', '')}</span>
            <span style={{ fontWeight: 500 }}>{j.title}</span>
            <span style={{ color: 'var(--ink-70)' }}>{j.customer}</span>
            <Chip tone={j.stage === 'paid' ? 'sage' : (j.stage === 'scheduled' ? 'accent' : 'neutral')}>{STAGES.find(s => s.id === j.stage).label}</Chip>
            <span style={{ fontFamily: 'var(--mono)' }}>{fmtAUD(j.value)}</span>
            <Btn variant="secondary" size="sm" onClick={onOpen}>Open</Btn>
          </div>
        ))}
      </div>
    </div>
  );
}

Object.assign(window, { JobDetail, InvoiceView, QuotesList, InvoicesList, CustomersList, Schedule, Reports });
