// app/main.jsx — 알파카 시제품 조립: 전체화면 챗봇(데스크톱) / 모바일 뷰(뷰포트 자동)
// 리본 ERP 목업 백드롭 제거. 업체(tenant) 선택은 챗봇 헤더로 이동. 데스크톱/모바일 수동 토글 삭제.

const { useState, useEffect } = React;
const RC = window.RibbonChat;
const { McpStatusBar, ChatThread, ChatInput, Icon, Spike, I } = RC;
const { HistorySidebar, FaqManager } = window.RibbonPanels;
const { AdminHub } = window.RibbonAdmin;

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "accent": "#cc785c",
  "chatDark": false,
  "density": "regular",
  "showSources": true,
  "mcpStatus": true
}/*EDITMODE-END*/;

// 뷰포트 폭으로 모바일 판정(수동 토글 없음).
function useIsMobile(bp = 820) {
  const [m, setM] = useState(typeof window !== 'undefined' && window.innerWidth < bp);
  useEffect(() => {
    const on = () => setM(window.innerWidth < bp);
    window.addEventListener('resize', on);
    return () => window.removeEventListener('resize', on);
  }, [bp]);
  return m;
}

// ── 업체(tenant) 선택 — 챗봇 헤더용 ─────────────────────────
function TenantSelect({ tenant, onTenantChange }) {
  const D = window.RibbonData;
  const tn = tenant || D.TENANTS[0];
  return (
    <div style={{ position: 'relative', display: 'inline-flex', alignItems: 'center' }}>
      <select value={tn.id} onChange={e => onTenantChange && onTenantChange(e.target.value)} title="업체 전환"
        style={{ appearance: 'none', WebkitAppearance: 'none', height: 32, padding: '0 28px 0 11px', borderRadius: 'var(--radius-md)',
          border: '1px solid var(--border-hairline)', background: 'var(--surface-soft)', cursor: 'pointer',
          fontFamily: 'var(--font-sans)', fontSize: 12.5, fontWeight: 600, color: 'var(--text-heading)', maxWidth: 220 }}>
        {D.TENANTS.map(t => <option key={t.id} value={t.id}>{t.name + ' · ' + t.region}</option>)}
      </select>
      <span style={{ position: 'absolute', right: 9, pointerEvents: 'none', display: 'flex' }}>
        <Icon d="M6 9l6 6 6-6" size={14} color="var(--text-muted)" /></span>
    </div>
  );
}

// ── 채팅 헤더 (업체 선택 + 새 대화/FAQ/닫기) ─────────────────
function ChatHeader({ conv, tenant, onTenantChange, onNew, onFaq, onClose, mobile }) {
  return (
    <div style={{ display: 'flex', alignItems: 'center', gap: 11, padding: mobile ? '10px 12px' : '11px 16px',
      borderBottom: '1px solid var(--border-hairline)', background: 'var(--surface-page)', flexShrink: 0 }}>
      <div style={{ width: 30, height: 30, borderRadius: 'var(--radius-full)', background: 'var(--surface-card)', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>
        <Spike size={17} /></div>
      <div style={{ flexShrink: 0 }}>
        <div style={{ fontFamily: 'var(--font-sans)', fontSize: 14.5, fontWeight: 600, color: 'var(--text-heading)', lineHeight: 1.15 }}>알파카</div>
        <div style={{ display: 'flex', alignItems: 'center', gap: 5 }}>
          <span style={{ width: 6, height: 6, borderRadius: '50%', background: 'var(--color-success)' }} />
          <span style={{ fontSize: 10.5, color: 'var(--text-muted)', fontWeight: 500 }}>{conv.messages.length > 0 ? '맥락 유지 중' : '온라인'}</span>
        </div>
      </div>
      <div style={{ marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 8 }}>
        {!mobile && <TenantSelect tenant={tenant} onTenantChange={onTenantChange} />}
        <div style={{ display: 'flex', alignItems: 'center', gap: 2 }}>
          <HBtn d={I.plus} label="새 대화" onClick={onNew} />
          <HBtn d="M8 2v4M16 2v4M3 9h18M5 5h14a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2z" label="FAQ 관리" onClick={onFaq} />
          <HBtn d={I.x} label="대화 종료(저장)" onClick={onClose} />
        </div>
      </div>
    </div>
  );
}
function HBtn({ d, label, onClick }) {
  const [h, setH] = useState(false);
  return (
    <button onClick={onClick} title={label} onMouseEnter={() => setH(true)} onMouseLeave={() => setH(false)}
      style={{ width: 32, height: 32, borderRadius: 'var(--radius-md)', border: 'none', cursor: 'pointer',
        background: h ? 'var(--surface-card)' : 'transparent', display: 'flex', alignItems: 'center', justifyContent: 'center', transition: 'background .12s' }}>
      <Icon d={d} size={17} color="var(--text-muted)" /></button>
  );
}

// ── 채팅 컬럼 (헤더+상태+스레드+입력 / FAQ 오버레이) ─────────
function ChatColumn({ conv, t, tenant, onTenantChange, faqOpen, setFaqOpen, onClose, mobile, style }) {
  const opts = { showSources: t.showSources, mcpStatus: t.mcpStatus };
  const threadPad = t.density === 'compact' ? 'rb-pad-c' : t.density === 'comfy' ? 'rb-pad-x' : '';
  return (
    <div className={'rb-col rb-col-wide ' + (t.chatDark ? 'rb-dark ' : '') + (mobile ? 'rb-mobile ' : '') + threadPad}
      style={{ display: 'flex', flexDirection: 'column', minHeight: 0, position: 'relative', background: 'var(--surface-page)', ...style }}>
      <ChatHeader conv={conv} tenant={tenant} onTenantChange={onTenantChange} onNew={conv.reset} onFaq={() => setFaqOpen(true)} onClose={onClose} mobile={mobile} />
      {t.mcpStatus && <McpStatusBar status={conv.status} />}
      <ChatThread conv={conv} onChip={conv.send} opts={opts} />
      <ChatInput onSend={conv.send} busy={conv.busy} />
      {faqOpen && <FaqManager onClose={() => setFaqOpen(false)} onChip={conv.send} />}
      {conv.reportMsg && <window.RibbonFeedback.FeedbackModal conv={conv} tenant={tenant} onClose={conv.closeReport} />}
    </div>
  );
}

// ── 데스크톱: 사이드바(최근 대화) + 전체화면 챗봇 ───────────
function DesktopChat({ conv, t, tenant, onTenantChange, faqOpen, setFaqOpen }) {
  return (
    <div style={{ position: 'relative', flex: 1, minHeight: 0, display: 'flex', background: 'var(--surface-page)' }}>
      <HistorySidebar onNew={conv.reset} onChip={conv.send} onOpenFaq={() => setFaqOpen(true)}
        sessions={conv.sessions} activeId={conv.activeId} onSelect={conv.loadSession} onDelete={conv.deleteSession} />
      <ChatColumn conv={conv} t={t} tenant={tenant} onTenantChange={onTenantChange} faqOpen={faqOpen} setFaqOpen={setFaqOpen}
        onClose={conv.reset} style={{ flex: 1, minWidth: 0 }} />
    </div>
  );
}

// ── 모바일: 디바이스 프레임 안의 챗봇 ───────────────────────
function MobileChat({ conv, t, tenant, faqOpen, setFaqOpen }) {
  const { IOSDevice } = window;
  return (
    <div style={{ flex: 1, minHeight: 0, display: 'flex', alignItems: 'center', justifyContent: 'center',
      background: 'var(--surface-soft)', padding: 24, overflow: 'auto' }}>
      <div style={{ transform: 'scale(var(--mobile-scale,1))', transformOrigin: 'center' }}>
        <IOSDevice>
          <div style={{ height: '100%', paddingTop: 50, paddingBottom: 14, boxSizing: 'border-box' }}>
            <ChatColumn conv={conv} t={t} tenant={tenant} onTenantChange={() => {}} faqOpen={faqOpen} setFaqOpen={setFaqOpen}
              mobile onClose={conv.reset} style={{ height: '100%', borderRadius: 0 }} />
          </div>
        </IOSDevice>
      </div>
    </div>
  );
}

// ── 상단 데모 크롬 (챗봇 / 관리자 토글) ─────────────────────
function TopChrome({ view, setView }) {
  return (
    <div style={{ display: 'flex', alignItems: 'center', gap: 14, padding: '0 18px', height: 52, flexShrink: 0,
      borderBottom: '1px solid var(--border-hairline)', background: 'var(--surface-page)', fontFamily: 'var(--font-sans)' }}>
      <Spike size={18} />
      <span style={{ fontSize: 13.5, fontWeight: 600, color: 'var(--text-heading)' }}>알파카 — 리본 AI</span>
      <span style={{ fontSize: 11.5, color: 'var(--text-faint)' }}>시제품</span>
      <div style={{ marginLeft: 'auto', display: 'inline-flex', background: 'var(--surface-soft)', borderRadius: 'var(--radius-md)', padding: 3, gap: 2, border: '1px solid var(--border-hairline)' }}>
        {[['chat', '챗봇', 'M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'], ['admin', '관리자', 'M12 2l8 4v6c0 5-3.5 8-8 10-4.5-2-8-5-8-10V6z']].map(([v, label, d]) => (
          <button key={v} onClick={() => setView(v)} style={{ display: 'inline-flex', alignItems: 'center', gap: 6, padding: '6px 12px', borderRadius: 'var(--radius-sm)', border: 'none', cursor: 'pointer',
            fontFamily: 'var(--font-sans)', fontSize: 12.5, fontWeight: 600, transition: 'all .12s',
            background: view === v ? 'var(--surface-page)' : 'transparent', boxShadow: view === v ? 'var(--shadow-soft)' : 'none',
            color: view === v ? 'var(--text-heading)' : 'var(--text-muted)' }}>
            <Icon d={d} size={15} color={view === v ? 'var(--accent)' : 'var(--text-muted)'} />{label}</button>
        ))}
      </div>
    </div>
  );
}

// ── App ──────────────────────────────────────────────────────
function App() {
  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const conv = RC.useConversation();
  const isMobile = useIsMobile();
  const [view, setView] = useState('chat'); // 'chat' | 'admin'
  const [tenantId, setTenantId] = useState('thesafe');
  const [faqOpen, setFaqOpen] = useState(false);
  const tenant = window.RibbonData.TENANTS.find(x => x.id === tenantId);

  useEffect(() => { document.documentElement.style.setProperty('--accent', t.accent); }, [t.accent]);
  // 선택 업체를 전역에 노출 → chat.jsx 가 /api/chat 에 tenant_id 로 실어 보낸다(업체 스코프).
  useEffect(() => { window.RibbonData.currentTenantId = tenantId; }, [tenantId]);

  return (
    <div style={{ height: '100vh', display: 'flex', flexDirection: 'column', background: 'var(--surface-soft)' }}>
      <TopChrome view={view} setView={setView} />
      {view === 'admin'
        ? <AdminHub />
        : isMobile
          ? <MobileChat conv={conv} t={t} tenant={tenant} faqOpen={faqOpen} setFaqOpen={setFaqOpen} />
          : <DesktopChat conv={conv} t={t} tenant={tenant} onTenantChange={setTenantId} faqOpen={faqOpen} setFaqOpen={setFaqOpen} />}

      <TweaksPanel>
        <TweakSection label="브랜드" />
        <TweakColor label="강조 색상" value={t.accent}
          options={['#cc785c', '#5db8a6', '#e8a55a', '#7595c4']} onChange={v => setTweak('accent', v)} />
        <TweakSection label="채팅 영역" />
        <TweakToggle label="다크 채팅" value={t.chatDark} onChange={v => setTweak('chatDark', v)} />
        <TweakRadio label="밀도" value={t.density} options={['compact', 'regular', 'comfy']} onChange={v => setTweak('density', v)} />
        <TweakSection label="기능" />
        <TweakToggle label="MCP 상태 표시줄" value={t.mcpStatus} onChange={v => setTweak('mcpStatus', v)} />
        <TweakToggle label="답변 출처 표시" value={t.showSources} onChange={v => setTweak('showSources', v)} />
      </TweaksPanel>
    </div>
  );
}

ReactDOM.createRoot(document.getElementById('root')).render(<App />);
