// app.jsx — 樂睦公司端：殼層 + 四個視圖
const { useState: useA } = React;
const C = window;

function Table({ cols, children }) {
  return (
    <div className="tbl-wrap" style={{ overflowX: 'auto' }}>
      <table style={{ width: '100%', borderCollapse: 'collapse', minWidth: 720 }}>
        <thead><tr>
          {cols.map((c, i) => <th key={i} style={{ textAlign: c.r ? 'right' : 'left', fontSize: 11.5, color: 'var(--ink-3)', fontWeight: 600, letterSpacing: '.04em', padding: '0 14px 11px', whiteSpace: 'nowrap' }}>{c.t}</th>)}
        </tr></thead>
        <tbody>{children}</tbody>
      </table>
    </div>
  );
}
const td = { padding: '13px 14px', borderTop: '1px solid var(--line)', fontSize: 13.5, verticalAlign: 'middle' };

// ---------- OVERVIEW ----------
function Overview() {
  return (
    <div className="view" style={{ padding: 26, maxWidth: 1180, margin: '0 auto' }}>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(186px,1fr))', gap: 14 }}>
        {C.KPIS.map((k) => <C.Kpi key={k.key} k={k} onClick={() => window.__go({ inst: 'institutions', members: 'institutions', tools: 'integrations', data: 'analytics' }[k.key] || 'analytics')} />)}
      </div>

      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(320px,1fr))', gap: 16, marginTop: 16 }}>
        <C.Card title="平台活動趨勢" action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>2026 年迄今 · 活動次數</span>} style={{ gridColumn: 'span 2', minWidth: 0 }}>
          <C.AreaLine data={C.ACTIVITY_SERIES} labels={C.MONTHS} color="var(--accent)" />
        </C.Card>
        <C.Card title="長者照護級別分布">
          <C.Donut data={C.CARE_LEVELS} />
        </C.Card>
      </div>

      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(320px,1fr))', gap: 16, marginTop: 16 }}>
        <C.Card title="合作機構" action={<a style={{ fontSize: 12.5, color: 'var(--accent)', fontWeight: 600, cursor: 'pointer' }} onClick={() => window.__go('institutions')}>查看全部 ›</a>} pad={0} style={{ gridColumn: 'span 2', minWidth: 0 }}>
          <div style={{ padding: '14px 6px 6px' }}>
            <Table cols={[{ t: '機構' }, { t: '地區' }, { t: '長者', r: 1 }, { t: '裝置', r: 1 }, { t: '在線率', r: 1 }, { t: '狀態' }]}>
              {C.INSTITUTIONS.slice(0, 6).map((m) => (
                <tr key={m.id} className="hoverrow clickable" onClick={() => window.__drawer('inst', m)}>
                  <td style={td}><div style={{ fontWeight: 600 }}>{m.name}</div><div style={{ fontSize: 11.5, color: 'var(--ink-3)' }}>{m.type}</div></td>
                  <td style={{ ...td, color: 'var(--ink-2)' }}>{m.region}</td>
                  <td style={{ ...td, textAlign: 'right' }} className="num">{m.members}</td>
                  <td style={{ ...td, textAlign: 'right' }} className="num">{m.devices}</td>
                  <td style={{ ...td, textAlign: 'right' }} className="num">{m.online}%</td>
                  <td style={td}><C.Badge label={m.status} kind={m.statusKind} /></td>
                </tr>
              ))}
            </Table>
          </div>
        </C.Card>
        <C.Card title="即時動態" pad={6}>
          <div>
            {C.FEED.map((f, i) => {
              const ic = { data: 'database', inst: 'buildings', tool: 'plugs-connected', report: 'file-text' }[f.kind] || 'circle';
              const col = { data: 'var(--c-green)', inst: 'var(--c-blue)', tool: 'var(--c-teal)', report: 'var(--accent)' }[f.kind];
              const dest = { data: 'analytics', inst: 'institutions', tool: 'integrations', report: 'reports', llm: 'llm' }[f.kind] || 'overview';
              return (
                <div key={i} style={{ display: 'flex', gap: 11, padding: '10px 12px', borderRadius: 9 }} className="hoverrow clickable" onClick={() => window.__go(dest)}>
                  <span style={{ width: 30, height: 30, borderRadius: 8, background: 'var(--panel)', color: col, display: 'flex', alignItems: 'center', justifyContent: 'center', flex: '0 0 auto' }}><C.Icon n={ic} s={16} /></span>
                  <div style={{ minWidth: 0 }}>
                    <div style={{ fontSize: 13, lineHeight: 1.45 }}>{f.text}</div>
                    <div style={{ fontSize: 11.5, color: 'var(--ink-3)', marginTop: 1 }}>{f.t}</div>
                  </div>
                </div>
              );
            })}
          </div>
        </C.Card>
      </div>
    </div>
  );
}

// ---------- INSTITUTIONS ----------
function Institutions() {
  const [q, setQ] = useA('');
  const [f, setF] = useA('全部');
  const filters = ['全部', '試辦中', '導入中'];
  const list = C.INSTITUTIONS.filter((m) => (f === '全部' || m.status === f) && (!q || m.name.includes(q) || m.region.includes(q)));
  return (
    <div className="view" style={{ padding: 26, maxWidth: 1180, margin: '0 auto' }}>
      <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center', marginBottom: 16 }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 8, background: 'var(--surface)', border: '1px solid var(--line)', borderRadius: 9, padding: '8px 12px', flex: '1 1 240px', maxWidth: 320 }}>
          <C.Icon n="magnifying-glass" s={16} style={{ color: 'var(--ink-3)' }} />
          <input value={q} onChange={(e) => setQ(e.target.value)} placeholder="搜尋機構名稱或地區" style={{ border: 'none', outline: 'none', background: 'transparent', fontFamily: 'inherit', fontSize: 13.5, width: '100%' }} />
        </div>
        <div style={{ display: 'flex', gap: 7 }}>
          {filters.map((x) => <button key={x} onClick={() => setF(x)} style={{ border: '1px solid ' + (f === x ? 'var(--accent)' : 'var(--line)'), background: f === x ? 'var(--accent-soft)' : 'var(--surface)', color: f === x ? 'var(--accent-deep)' : 'var(--ink-2)', borderRadius: 999, padding: '7px 14px', fontSize: 12.5, fontWeight: 600, cursor: 'pointer' }}>{x}</button>)}
        </div>
        <div style={{ flex: 1 }} />
        <span style={{ fontSize: 12.5, color: 'var(--ink-3)' }} className="num">共 {list.length} 家</span>
      </div>
      <C.Card pad={0}>
        <div style={{ padding: '14px 6px 6px' }}>
          <Table cols={[{ t: '機構名稱' }, { t: '類型' }, { t: '地區' }, { t: '長者數', r: 1 }, { t: '整合裝置', r: 1 }, { t: '本月活動', r: 1 }, { t: '在線率', r: 1 }, { t: '趨勢', r: 1 }, { t: '狀態' }]}>
            {list.map((m) => (
              <tr key={m.id} className="hoverrow clickable" onClick={() => window.__drawer('inst', m)}>
                <td style={td}><div style={{ display: 'flex', alignItems: 'center', gap: 10 }}><span style={{ width: 30, height: 30, borderRadius: 8, background: 'var(--accent-soft)', color: 'var(--accent-deep)', display: 'flex', alignItems: 'center', justifyContent: 'center', flex: '0 0 auto', fontWeight: 700, fontSize: 13 }}>{m.name[0]}</span><span style={{ fontWeight: 600 }}>{m.name}</span></div></td>
                <td style={{ ...td, color: 'var(--ink-2)' }}>{m.type}</td>
                <td style={{ ...td, color: 'var(--ink-2)' }}>{m.region}</td>
                <td style={{ ...td, textAlign: 'right' }} className="num">{m.members}</td>
                <td style={{ ...td, textAlign: 'right' }} className="num">{m.devices}</td>
                <td style={{ ...td, textAlign: 'right' }} className="num">{C.fmt(m.monthly)}</td>
                <td style={{ ...td, textAlign: 'right' }} className="num">{m.online}%</td>
                <td style={{ ...td, textAlign: 'right' }}><C.Trend t={m.trend} /></td>
                <td style={td}><C.Badge label={m.status} kind={m.statusKind} /></td>
              </tr>
            ))}
          </Table>
        </div>
      </C.Card>
    </div>
  );
}

// ---------- ANALYTICS ----------
function Analytics() {
  return (
    <div className="view" style={{ padding: 26, maxWidth: 1180, margin: '0 auto' }}>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(210px,1fr))', gap: 14, marginBottom: 16 }}>
        <C.MiniStat icon="trend-up" value="+6.4" sub="分" label="平均六力提升（初評→近期）" />
        <C.MiniStat icon="seal-check" value="74%" label="前後測改善比例" />
        <C.MiniStat icon="broadcast" value={C.AVG_ONLINE + '%'} label="平均裝置在線率" />
        <C.MiniStat icon="users-three" value={C.fmt(C.TOTAL_MEMBERS)} sub="位" label="納入分析長者" />
      </div>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(320px,1fr))', gap: 16 }}>
        <C.Card title="跨機構樂齡六力改善" action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>初評 → 近期 · 全平台平均</span>}>
          <C.ImproveBars rows={C.SIX} />
        </C.Card>
        <C.Card title="長者照護級別分布"><C.Donut data={C.CARE_LEVELS} /></C.Card>
      </div>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(320px,1fr))', gap: 16, marginTop: 16 }}>
        <C.Card title="平台活動趨勢" style={{ gridColumn: 'span 2', minWidth: 0 }} action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>2026 年迄今</span>}>
          <C.AreaLine data={C.ACTIVITY_SERIES} labels={C.MONTHS} color="var(--c-blue)" />
        </C.Card>
        <C.Card title="各縣市服務人數" action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>花蓮 · 嘉義</span>}>
          <C.BarRows data={C.REGION_DIST} color="var(--c-teal)" />
        </C.Card>
      </div>
      <p style={{ fontSize: 12, color: 'var(--ink-3)', marginTop: 18 }}>※ 功能三力為感測器硬數據，心理社會三力為參與行為推估值；所有數據用於服務優化與成效溝通，非醫療診斷。</p>
    </div>
  );
}

// ---------- INTEGRATIONS ----------
function Integrations() {
  const online = C.ONLINE_DEVICES;
  const live = C.VENDORS_INT.filter((v) => v.api === '已介接').length;
  const stat = [
    { n: C.VENDORS_INT.length, l: '整合教具型號', icon: 'cube' },
    { n: C.VENDOR_COUNT, l: '合作廠商', icon: 'handshake' },
    { n: C.fmt(online), l: '在線裝置', icon: 'broadcast' },
    { n: live + ' / ' + C.VENDORS_INT.length, l: '完成介接', icon: 'plugs-connected' },
  ];
  return (
    <div className="view" style={{ padding: 26, maxWidth: 1180, margin: '0 auto' }}>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(200px,1fr))', gap: 14, marginBottom: 16 }}>
        {stat.map((s, i) => (
          <div key={i} className="cardh" style={{ background: 'var(--surface)', border: '1px solid var(--line)', borderRadius: 'var(--radius)', boxShadow: 'var(--shadow)', padding: 16, display: 'flex', alignItems: 'center', gap: 13 }}>
            <span style={{ width: 42, height: 42, borderRadius: 11, background: 'var(--accent-soft)', color: 'var(--accent-deep)', display: 'flex', alignItems: 'center', justifyContent: 'center', flex: '0 0 auto' }}><C.Icon n={s.icon} s={21} /></span>
            <div><div className="num" style={{ fontSize: 23, fontWeight: 700, lineHeight: 1 }}>{s.n}</div><div style={{ fontSize: 12.5, color: 'var(--ink-3)', marginTop: 3 }}>{s.l}</div></div>
          </div>
        ))}
      </div>
      <C.Card title="教具整合清單" action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>統一數據規格 · 跨廠商接入</span>} pad={0}>
        <div style={{ padding: '14px 6px 6px' }}>
          <Table cols={[{ t: '教具型號' }, { t: '廠商' }, { t: '類型' }, { t: '資料格式' }, { t: '在線裝置', r: 1 }, { t: '本月用量', r: 1 }, { t: '趨勢', r: 1 }, { t: '介接狀態' }]}>
            {C.VENDORS_INT.map((v, i) => (
              <tr key={i} className="hoverrow clickable" onClick={() => window.__drawer('tool', v)}>
                <td style={td}><div style={{ display: 'flex', alignItems: 'center', gap: 10 }}><span style={{ width: 30, height: 30, borderRadius: 8, background: 'var(--panel)', color: 'var(--c-teal)', display: 'flex', alignItems: 'center', justifyContent: 'center', flex: '0 0 auto' }}><C.Icon n="cube" s={16} /></span><span style={{ fontWeight: 600 }}>{v.model}</span></div></td>
                <td style={{ ...td, color: 'var(--ink-2)' }}>{v.vendor}</td>
                <td style={td}><span style={{ fontSize: 12, color: 'var(--ink-2)', background: 'var(--panel)', border: '1px solid var(--line)', borderRadius: 6, padding: '2px 9px' }}>{v.cat}</span></td>
                <td style={{ ...td, color: 'var(--ink-2)' }} className="num">{v.fmt}</td>
                <td style={{ ...td, textAlign: 'right' }} className="num">{v.units || '—'}</td>
                <td style={{ ...td, textAlign: 'right' }} className="num">{v.uses ? C.fmt(v.uses) : '—'}</td>
                <td style={{ ...td, textAlign: 'right' }}><C.Trend t={v.trend} /></td>
                <td style={td}><C.Badge label={v.api} kind={v.apiKind} /></td>
              </tr>
            ))}
          </Table>
        </div>
      </C.Card>
    </div>
  );
}

// ---------- LLM 報告品質 / 反饋 ----------
function Llm() {
  const rIcon = { up: ['thumbs-up', 'var(--good)'], edit: ['pencil-simple', 'var(--warn)'], down: ['thumbs-down', 'var(--bad)'] };
  return (
    <div className="view" style={{ padding: 26, maxWidth: 1180, margin: '0 auto' }}>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(210px,1fr))', gap: 14 }}>
        {C.LLM_KPIS.map((s, i) => <C.MiniStat key={i} icon={s.icon} value={s.value} sub={s.sub} label={s.label} />)}
      </div>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(320px,1fr))', gap: 16, marginTop: 16 }}>
        <C.Card title="每週採納率" action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>機構老師採納 AI 建議比例</span>} style={{ gridColumn: 'span 2', minWidth: 0 }}>
          <C.AreaLine data={C.LLM_TREND} labels={C.LLM_TREND_LABELS} color="var(--accent)" />
        </C.Card>
        <C.Card title="報告反饋分布"><C.Donut data={C.LLM_FEEDBACK} centerLabel="份報告" /></C.Card>
      </div>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(320px,1fr))', gap: 16, marginTop: 16 }}>
        <C.Card title="常見人工修改原因" action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>老師最常修改 / 重寫之處</span>}>
          <C.BarRows data={C.FEEDBACK_REASONS} color="var(--accent)" />
        </C.Card>
        <C.Card title="AI 審核學習迴圈">
          <div style={{ fontSize: 13, color: 'var(--ink-2)', lineHeight: 1.7, marginBottom: 12 }}>老師的覆核不只把關品質，更是模型的學習樣本：每一次採用、微調、重寫都會回饋，讓下一份報告更準確。</div>
          {[
            { ic: 'thumbs-up', c: 'var(--good)', t: '直接採用', d: '視為正樣本，強化既有生成方向' },
            { ic: 'pencil-simple', c: 'var(--warn)', t: '微調後採納', d: '記錄修改重點，做局部校正' },
            { ic: 'thumbs-down', c: 'var(--bad)', t: '需重寫', d: '標記為負樣本，重點重訓判讀邏輯' },
          ].map((s, i) => (
            <div key={i} style={{ display: 'flex', gap: 11, alignItems: 'flex-start', padding: '8px 0', borderTop: '1px solid var(--line)' }}>
              <span style={{ width: 28, height: 28, borderRadius: 8, background: 'var(--panel)', color: s.c, display: 'flex', alignItems: 'center', justifyContent: 'center', flex: '0 0 auto' }}><C.Icon n={s.ic} s={15} /></span>
              <div><div style={{ fontSize: 13, fontWeight: 600 }}>{s.t}</div><div style={{ fontSize: 12, color: 'var(--ink-3)' }}>{s.d}</div></div>
            </div>
          ))}
        </C.Card>
      </div>
      <C.Card title="機構老師覆核佇列" action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>由機構老師覆核 · 低信心度自動標記</span>} pad={0} style={{ marginTop: 16 }}>
        <div style={{ padding: '14px 6px 6px' }}>
          <Table cols={[{ t: '長者' }, { t: '機構' }, { t: '報告類型' }, { t: '信心度' }, { t: '覆核老師' }, { t: '老師評分' }, { t: '狀態' }]}>
            {C.LLM_QUEUE.map((q, i) => {
              const ri = rIcon[q.rating];
              return (
                <tr key={i} className="hoverrow clickable" onClick={() => window.__drawer('report', q)}>
                  <td style={td}><span style={{ fontWeight: 600 }}>{q.who}</span></td>
                  <td style={{ ...td, color: 'var(--ink-2)' }}>{q.inst}</td>
                  <td style={td}><span style={{ fontSize: 12, color: 'var(--ink-2)', background: 'var(--panel)', border: '1px solid var(--line)', borderRadius: 6, padding: '2px 9px' }}>{q.type}</span></td>
                  <td style={td}><div style={{ display: 'flex', alignItems: 'center', gap: 8 }}><div style={{ width: 56, height: 6, background: 'var(--panel)', borderRadius: 999, overflow: 'hidden' }}><div style={{ width: q.conf + '%', height: '100%', background: q.conf >= 75 ? 'var(--good)' : q.conf >= 65 ? 'var(--warn)' : 'var(--bad)' }} /></div><span className="num" style={{ fontSize: 12.5 }}>{q.conf}%</span></div></td>
                  <td style={{ ...td, color: 'var(--ink-2)' }}>{q.by ? q.by + ' 老師' : <span style={{ color: 'var(--ink-3)' }}>—</span>}</td>
                  <td style={td}><C.Icon n={ri[0]} s={18} style={{ color: ri[1] }} /></td>
                  <td style={td}><C.Badge label={q.status} kind={q.kind} /></td>
                </tr>
              );
            })}
          </Table>
        </div>
      </C.Card>
      <p style={{ fontSize: 12, color: 'var(--ink-3)', marginTop: 18 }}>※ 每份 AI 報告皆保留資料查詢日誌與推理軌跡；信心度低於門檻者自動標記，由機構老師覆核後才採納。平台僅彙整覆核狀態，不代替老師覆核。</p>
    </div>
  );
}

// ---------- 報告中心 ----------
function Reports() {
  return (
    <div className="view" style={{ padding: 26, maxWidth: 1180, margin: '0 auto' }}>
      <C.Card title="評鑑與成效報告" action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>依各縣市轄區格式 · AI 協助彙整</span>} pad={0}>
        <div style={{ padding: '14px 6px 6px' }}>
          <Table cols={[{ t: '報告' }, { t: '機構' }, { t: '期間' }, { t: '轄區格式' }, { t: '產出者' }, { t: '日期' }, { t: '狀態' }]}>
            {C.REPORTS.map((r, i) => (
              <tr key={i} className="hoverrow clickable" onClick={() => window.__drawer('doc', r)}>
                <td style={td}><div style={{ display: 'flex', alignItems: 'center', gap: 10 }}><span style={{ width: 30, height: 30, borderRadius: 8, background: 'var(--panel)', color: 'var(--accent)', display: 'flex', alignItems: 'center', justifyContent: 'center', flex: '0 0 auto' }}><C.Icon n="file-text" s={16} /></span><span style={{ fontWeight: 600 }}>{r.title}</span></div></td>
                <td style={{ ...td, color: 'var(--ink-2)' }}>{r.inst}</td>
                <td style={{ ...td, color: 'var(--ink-2)' }} className="num">{r.period}</td>
                <td style={{ ...td, color: 'var(--ink-2)' }}>{r.juri}</td>
                <td style={{ ...td, color: 'var(--ink-2)' }}>{r.by}</td>
                <td style={{ ...td, color: 'var(--ink-2)' }} className="num">{r.date}</td>
                <td style={td}><C.Badge label={r.status} kind={r.kind} /></td>
              </tr>
            ))}
          </Table>
        </div>
      </C.Card>
    </div>
  );
}

// ---------- AI / 模型成本 ----------
function Cost() {
  const models = C.MODEL_COSTS;
  const total = models.reduce((a, m) => a + m.cost, 0);
  const donut = models.map((m) => ({ label: m.model.replace('Claude ', ''), value: m.cost, color: m.color }));
  return (
    <div className="view" style={{ padding: 26, maxWidth: 1180, margin: '0 auto' }}>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(210px,1fr))', gap: 14 }}>
        {C.AI_COST_KPIS.map((s, i) => <C.MiniStat key={i} icon={s.icon} value={s.value} sub={s.sub} label={s.label} />)}
      </div>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(320px,1fr))', gap: 16, marginTop: 16 }}>
        <C.Card title="AI 成本趨勢" action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>2026 年迄今 · 每月 NT$</span>} style={{ gridColumn: 'span 2', minWidth: 0 }}>
          <C.AreaLine data={C.COST_TREND} labels={C.MONTHS} color="var(--accent)" />
        </C.Card>
        <C.Card title="模型成本占比"><C.Donut data={donut} total={total} centerLabel="本月 NT$" /></C.Card>
      </div>
      <C.Card title="模型成本細項" action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>本月 · 依用途</span>} pad={0} style={{ marginTop: 16 }}>
        <div style={{ padding: '14px 6px 6px' }}>
          <Table cols={[{ t: '模型 / 型號' }, { t: '用途' }, { t: '呼叫次數', r: 1 }, { t: '輸入 Tok', r: 1 }, { t: '輸出 Tok', r: 1 }, { t: '本月成本', r: 1 }, { t: '占比', r: 1 }]}>
            {models.map((m, i) => {
              const share = Math.round(m.cost / total * 100);
              return (
                <tr key={i} className="hoverrow clickable" onClick={() => window.__drawer('model', { ...m, share, total })}>
                  <td style={td}><div style={{ display: 'flex', alignItems: 'center', gap: 10 }}><span style={{ width: 9, height: 9, borderRadius: 3, background: m.color, flex: '0 0 auto' }} /><span style={{ fontWeight: 600 }}>{m.model}</span></div></td>
                  <td style={{ ...td, color: 'var(--ink-2)' }}>{m.use}</td>
                  <td style={{ ...td, textAlign: 'right' }} className="num">{C.fmt(m.calls)}</td>
                  <td style={{ ...td, textAlign: 'right', color: 'var(--ink-2)' }} className="num">{m.tokIn}</td>
                  <td style={{ ...td, textAlign: 'right', color: 'var(--ink-2)' }} className="num">{m.tokOut}</td>
                  <td style={{ ...td, textAlign: 'right' }} className="num">NT${C.fmt(m.cost)}</td>
                  <td style={{ ...td, textAlign: 'right' }} className="num">{share}%</td>
                </tr>
              );
            })}
            <tr>
              <td style={{ ...td, fontWeight: 700 }}>合計</td><td style={td}></td><td style={td}></td><td style={td}></td><td style={td}></td>
              <td style={{ ...td, textAlign: 'right', fontWeight: 700 }} className="num">NT${C.fmt(total)}</td>
              <td style={{ ...td, textAlign: 'right', fontWeight: 700 }} className="num">100%</td>
            </tr>
          </Table>
        </div>
      </C.Card>
      <C.Card title="成本與模型導入時間軸" action={<span style={{ fontSize: 12, color: 'var(--ink-3)' }}>2026 迄今</span>} style={{ marginTop: 16 }}>
        <C.Timeline items={C.COST_TIMELINE} />
      </C.Card>
      <p style={{ fontSize: 12, color: 'var(--ink-3)', marginTop: 18 }}>※ 成本為平台 LLM / AI 服務用量估算，涵蓋模型推論、語意檢索與語音轉文字；隨機構與報告量成長，並透過模型分工（複雜用 Opus、量大用 Sonnet、分類用 Haiku）控管單位成本。</p>
    </div>
  );
}

const TITLES = {
  overview: ['營運總覽', '跨機構即時營運概況'],
  institutions: ['合作機構', '全平台合作之照護 / 日照機構'],
  analytics: ['數據分析', '跨機構成效與使用數據'],
  integrations: ['整合工具', '已接入平台的教具與廠商'],
  llm: ['AI 報告品質', 'LLM 報告產出、機構老師覆核與採納'],
  reports: ['報告中心', '評鑑與成效報告產出狀態'],
  cost: ['AI 成本', '模型用量、成本明細與導入時間軸'],
};
const VIEWS = { overview: Overview, institutions: Institutions, analytics: Analytics, integrations: Integrations, llm: Llm, reports: Reports, cost: Cost };

// ---------- 抽屜（點擊詳情）共用小元件 ----------
function DStat({ label, value, sub }) {
  return (
    <div style={{ background: 'var(--panel)', border: '1px solid var(--line)', borderRadius: 10, padding: '12px 13px' }}>
      <div className="num" style={{ fontSize: 20, fontWeight: 700, lineHeight: 1.1 }}>{value}{sub && <span style={{ fontSize: 12, fontWeight: 500, color: 'var(--ink-3)', marginLeft: 3 }}>{sub}</span>}</div>
      <div style={{ fontSize: 12, color: 'var(--ink-3)', marginTop: 4 }}>{label}</div>
    </div>
  );
}
function DBtn({ children, onClick, primary }) {
  return <button onClick={onClick} style={{ flex: 1, border: primary ? 'none' : '1px solid var(--line)', background: primary ? 'var(--accent)' : 'var(--surface)', color: primary ? '#fff' : 'var(--ink-2)', borderRadius: 9, padding: '10px 12px', fontSize: 13, fontWeight: 600, cursor: 'pointer' }}>{children}</button>;
}
function DCode({ children }) {
  return <pre style={{ background: '#0F1623', color: '#C7D2E0', borderRadius: 9, padding: '12px 14px', fontSize: 12, lineHeight: 1.6, overflowX: 'auto', margin: 0, fontFamily: 'ui-monospace,SFMono-Regular,Menlo,monospace' }}>{children}</pre>;
}
function DNote({ children }) {
  return <div style={{ marginTop: 14, background: 'var(--accent-soft)', border: '1px solid #F0D9C6', color: 'var(--accent-deep)', borderRadius: 9, padding: '10px 12px', fontSize: 12.5, lineHeight: 1.6 }}>{children}</div>;
}
const confColor = (c) => c >= 75 ? 'var(--good)' : c >= 65 ? 'var(--warn)' : 'var(--bad)';

function buildDrawer(d) {
  if (!d) return {};
  const close = () => window.__drawer(null);

  if (d.type === 'inst') {
    const m = d.data;
    return {
      title: m.name, sub: m.type + ' · ' + m.region,
      body: (
        <div>
          <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
            <C.Badge label={m.status} kind={m.statusKind} />
            <span style={{ fontSize: 12.5, color: 'var(--ink-3)' }}>導入起 {m.since}</span>
            <span style={{ flex: 1 }} /><C.Trend t={m.trend} />
          </div>
          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 10, marginTop: 14 }}>
            <DStat label="服務長者" value={m.members} sub="位" />
            <DStat label="整合裝置" value={m.devices} sub="台" />
            <DStat label="本月活動" value={C.fmt(m.monthly)} sub="次" />
            <DStat label="裝置在線率" value={m.online + '%'} />
          </div>
          <C.DHead>樂齡六力改善（初評 → 近期）</C.DHead>
          <C.ImproveBars rows={C.SIX} />
          <C.DHead>整合裝置</C.DHead>
          {C.VENDORS_INT.slice(0, 4).map((v, i) => <C.DRow key={i} k={v.model} v={(v.units || 0) + ' 台'} />)}
          <C.DHead>近期動態</C.DHead>
          <C.DRow k="教具數據同步" v="今日 286 筆" />
          <C.DRow k="AI 成效報告" v="本月 3 份" />
          <C.DRow k="待覆核報告" v="1 份" />
          <div style={{ display: 'flex', gap: 10, marginTop: 22 }}>
            <DBtn onClick={() => window.__go('analytics')}>查看數據分析</DBtn>
            <DBtn primary onClick={() => window.__loadfail('季度成效報告產生中…')}>產生季度報告</DBtn>
          </div>
        </div>
      ),
    };
  }

  if (d.type === 'tool') {
    const v = d.data;
    const testing = v.api !== '已介接';
    return {
      title: v.model, sub: v.vendor + ' · ' + v.cat,
      body: (
        <div>
          <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
            <C.Badge label={v.api} kind={v.apiKind} /><span style={{ flex: 1 }} /><C.Trend t={v.trend} />
          </div>
          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 10, marginTop: 14 }}>
            <DStat label="在線裝置" value={v.units || '—'} sub={v.units ? '台' : ''} />
            <DStat label="本月用量" value={v.uses ? C.fmt(v.uses) : '—'} sub={v.uses ? '次' : ''} />
          </div>
          <C.DHead>介接資訊</C.DHead>
          <C.DRow k="資料格式" v={v.fmt} />
          <C.DRow k="介接方式" v="統一資料閘道 / OAuth2" />
          <C.DRow k="同步頻率" v="即時 / 每 5 分鐘批次" />
          <C.DHead>資料欄位</C.DHead>
          <DCode>{'{\n  "member_id": "...",\n  "device": "' + v.model + '",\n  "session_at": "2026-06-22T09:14+08",\n  "duration_s": 420,\n  "score": 78,\n  "domain": "' + v.cat + '"\n}'}</DCode>
          {testing && <DNote>此教具仍在介接測試中，數據尚未納入正式統計。</DNote>}
          <div style={{ display: 'flex', gap: 10, marginTop: 22 }}>
            <DBtn onClick={() => window.__go('integrations')}>整合總覽</DBtn>
            <DBtn primary onClick={() => testing ? window.__toast('已重送介接測試') : window.__loadfail('API 文件載入中…')}>{testing ? '重送介接測試' : '檢視 API 文件'}</DBtn>
          </div>
        </div>
      ),
    };
  }

  if (d.type === 'report') {
    const q = d.data;
    const steps = ['擷取該長者前後測數據與教具互動紀錄', '比對同級別基準與個人歷史趨勢', '生成六力變化敘述與個案建議草稿', '自評信心度並標記需機構老師確認之處'];
    return {
      title: q.who + ' · ' + q.type, sub: q.inst + ' · AI 產出報告',
      body: (
        <div>
          <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
            <C.Badge label={q.status} kind={q.kind} /><span style={{ flex: 1 }} />
            <span style={{ fontSize: 12.5, color: 'var(--ink-3)' }}>模型信心度</span>
            <span className="num" style={{ fontWeight: 700, color: confColor(q.conf) }}>{q.conf}%</span>
          </div>
          <div style={{ width: '100%', height: 7, background: 'var(--panel)', borderRadius: 999, overflow: 'hidden', marginTop: 10 }}>
            <div style={{ width: q.conf + '%', height: '100%', background: confColor(q.conf) }} />
          </div>
          <C.DHead>推理軌跡</C.DHead>
          <ol style={{ margin: 0, padding: 0, listStyle: 'none' }}>
            {steps.map((s, i) => (
              <li key={i} style={{ display: 'flex', gap: 10, padding: '8px 0', borderBottom: '1px solid var(--line)' }}>
                <span className="num" style={{ width: 22, height: 22, borderRadius: 999, background: 'var(--accent-soft)', color: 'var(--accent-deep)', fontSize: 12, fontWeight: 700, display: 'flex', alignItems: 'center', justifyContent: 'center', flex: '0 0 auto' }}>{i + 1}</span>
                <span style={{ fontSize: 13, lineHeight: 1.5 }}>{s}</span>
              </li>
            ))}
          </ol>
          <C.DHead>資料來源</C.DHead>
          <C.DRow k="前後測評估" v="2 筆" />
          <C.DRow k="教具互動紀錄" v="48 筆" />
          <C.DRow k="老師觀察紀錄" v="3 筆" />
          <C.DHead>機構老師覆核</C.DHead>
          {q.status === '待覆核' ? (
            <div>
              <C.DRow k="覆核狀態" v="尚未覆核" />
              <C.DRow k="指派機構" v={q.inst} />
              <div style={{ display: 'flex', gap: 10, marginTop: 14 }}>
                <DBtn primary onClick={() => window.__toast('已提醒 ' + q.inst + ' 老師覆核')}>提醒機構老師覆核</DBtn>
              </div>
            </div>
          ) : (
            <div>
              <C.DRow k="覆核老師" v={(q.by || '機構') + ' 老師'} />
              <C.DRow k="老師評分" v={{ up: '認同', edit: '微調沿用', down: '需修正' }[q.rating]} />
              <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '9px 0' }}>
                <span style={{ color: 'var(--ink-3)', fontSize: 13.5 }}>覆核結果</span><C.Badge label={q.status} kind={q.kind} />
              </div>
              <div style={{ display: 'flex', gap: 10, marginTop: 14 }}>
                <DBtn onClick={() => window.__loadfail('正在開啟完整報告…')}>檢視完整報告</DBtn>
              </div>
            </div>
          )}
          {q.status !== '待覆核' && (
            <div>
              <C.DHead>老師修改重點 · 回饋 AI 學習</C.DHead>
              {q.cat && <div style={{ marginBottom: 8 }}><C.Badge label={q.cat} kind={q.rating === 'up' ? 'good' : q.rating === 'edit' ? 'warn' : 'bad'} /></div>}
              <div style={{ background: 'var(--panel)', border: '1px solid var(--line)', borderRadius: 9, padding: '11px 13px', fontSize: 13, lineHeight: 1.65, color: 'var(--ink-2)' }}>{q.issue}</div>
              <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 10, fontSize: 12, color: 'var(--ink-3)' }}>
                <C.Icon n="arrows-clockwise" s={14} style={{ color: 'var(--accent)' }} />
                {q.rating === 'up' ? '已作為正樣本回饋模型' : q.rating === 'edit' ? '修改重點已回饋模型做局部校正' : '已標記為負樣本，重點重訓判讀邏輯'}
              </div>
            </div>
          )}
          <p style={{ fontSize: 11.5, color: 'var(--ink-3)', marginTop: 16, lineHeight: 1.6 }}>※ AI 報告為輔助參考，由機構老師覆核後採用；老師的每次修改與重寫都會回饋模型用於學習。平台僅監看覆核狀態、不代替覆核，非醫療診斷。</p>
        </div>
      ),
    };
  }

  if (d.type === 'doc') {
    const r = d.data;
    const points = ['機構整體六力變化與參與率摘要', '重點個案前後測成效對照', '依' + r.juri + '評鑑指標對應佐證', '次季服務建議'];
    return {
      title: r.title, sub: r.inst + ' · ' + r.period,
      body: (
        <div>
          <C.DRow k="轄區格式" v={r.juri} />
          <C.DRow k="產出者" v={r.by} />
          <C.DRow k="日期" v={r.date} />
          <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '9px 0' }}>
            <span style={{ color: 'var(--ink-3)', fontSize: 13.5 }}>狀態</span><C.Badge label={r.status} kind={r.kind} />
          </div>
          <C.DHead>報告內容</C.DHead>
          <ul style={{ margin: 0, paddingLeft: 18, fontSize: 13.5, lineHeight: 1.9, color: 'var(--ink-2)' }}>
            {points.map((p, i) => <li key={i}>{p}</li>)}
          </ul>
          <div style={{ display: 'flex', gap: 10, marginTop: 22 }}>
            <DBtn onClick={() => window.__loadfail('正在準備 PDF…')}>下載 PDF</DBtn>
            <DBtn onClick={() => window.__loadfail('正在準備 Word…')}>下載 Word</DBtn>
          </div>
          <p style={{ fontSize: 11.5, color: 'var(--ink-3)', marginTop: 16, lineHeight: 1.6 }}>※ 報告由 AI 協助彙整、專業人員覆核；所有數據用於服務優化與成效溝通，非醫療診斷。</p>
        </div>
      ),
    };
  }
  if (d.type === 'model') {
    const m = d.data;
    return {
      title: m.model, sub: m.use,
      body: (
        <div>
          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 10 }}>
            <DStat label="本月成本" value={'NT$' + C.fmt(m.cost)} />
            <DStat label="成本占比" value={m.share + '%'} />
            <DStat label="呼叫次數" value={C.fmt(m.calls)} sub="次" />
            <DStat label="平均單次" value={'NT$' + (m.cost / m.calls).toFixed(2)} />
          </div>
          <C.DHead>用量</C.DHead>
          <C.DRow k="輸入 Token" v={m.tokIn} />
          <C.DRow k="輸出 Token" v={m.tokOut} />
          <C.DRow k="計費方式" v="依 Token 用量計費" />
          <C.DHead>成本控管</C.DHead>
          <div style={{ background: 'var(--panel)', border: '1px solid var(--line)', borderRadius: 9, padding: '11px 13px', fontSize: 13, lineHeight: 1.65, color: 'var(--ink-2)' }}>依用途分工選用最適模型：複雜推理用 Opus、量大報告用 Sonnet、分類與信心度評估用 Haiku，以控管單位成本。</div>
          <div style={{ display: 'flex', gap: 10, marginTop: 18 }}>
            <DBtn onClick={() => window.__go('cost')}>成本總覽</DBtn>
            <DBtn primary onClick={() => window.__loadfail('正在匯出用量明細…')}>檢視用量明細</DBtn>
          </div>
        </div>
      ),
    };
  }
  return {};
}

function App() {
  const [view, setView] = useA('overview');
  const [drawer, setDrawer] = useA(null);
  const [toast, setToast] = useA(null);
  const [nav, setNav] = useA(false);
  // 鏡像最新狀態給 popstate 用（瀏覽器/Safari 上一頁）
  const drawerRef = React.useRef(null); drawerRef.current = drawer;
  const viewRef = React.useRef('overview'); viewRef.current = view;
  const pushHist = () => { try { history.pushState({ lumo: 1 }, ''); } catch (e) {} };
  window.__go = (v) => { setNav(false); setDrawer(null); setView(v); if (v !== 'overview') pushHist(); };
  window.__drawer = (type, data) => { if (type) { setDrawer({ type, data }); pushHist(); } else setDrawer(null); };
  window.__toast = (m) => { setToast({ msg: m, mode: 'ok' }); clearTimeout(window.__tt); window.__tt = setTimeout(() => setToast(null), 2400); };
  window.__loadfail = (m) => { setToast({ msg: m, mode: 'load' }); clearTimeout(window.__tt); window.__tt = setTimeout(() => setToast(null), 3200); };
  React.useEffect(() => {
    const onPop = () => {
      if (drawerRef.current) setDrawer(null);
      else if (viewRef.current !== 'overview') setView('overview');
    };
    window.addEventListener('popstate', onPop);
    return () => window.removeEventListener('popstate', onPop);
  }, []);
  const V = VIEWS[view];
  const dd = buildDrawer(drawer);
  return (
    <div style={{ display: 'flex', minHeight: '100vh' }}>
      <C.Sidebar active={view} go={(v) => window.__go(v)} />
      <C.MobileNav open={nav} active={view} go={(v) => window.__go(v)} onClose={() => setNav(false)} />
      <div id="scroll" style={{ flex: 1, minWidth: 0, height: '100vh', overflowY: 'auto' }}>
        <C.Topbar title={TITLES[view][0]} sub={TITLES[view][1]} onMenu={() => setNav(true)} />
        <V />
      </div>
      <C.Drawer open={!!drawer} title={dd.title} sub={dd.sub} onClose={() => setDrawer(null)}>{dd.body}</C.Drawer>
      {toast && (
        <div style={{ position: 'fixed', left: '50%', bottom: 28, transform: 'translateX(-50%)', zIndex: 90, background: 'var(--ink)', color: '#fff', padding: '11px 18px', borderRadius: 10, fontSize: 13.5, fontWeight: 500, boxShadow: '0 8px 30px rgba(20,30,50,.30)', animation: 'toastin .2s ease', display: 'flex', alignItems: 'center', gap: 9 }}>
          {toast.mode === 'load'
            ? <C.Icon n="spinner-gap" s={17} style={{ color: '#fff', animation: 'spin .8s linear infinite' }} />
            : <C.Icon n="check-circle" s={17} fill style={{ color: 'var(--c-green)' }} />}
          {toast.msg}
        </div>
      )}
    </div>
  );
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
