/* global React, ReactDOM, ToastProvider, Sidebar, TopBar, HomeScreen, PipedriveScreen, KnowledgeBaseScreen, SettingsScreen */
const { useState, useEffect, useCallback } = React;

// ── Auth helpers ───────────────────────────────────────────────────────────────
function getToken() { return sessionStorage.getItem('robylab_token') || ''; }
function setToken(t) { sessionStorage.setItem('robylab_token', t); }
function clearToken() { sessionStorage.removeItem('robylab_token'); }
function authHeader() { return { Authorization: 'Basic ' + getToken() }; }

window.getToken = getToken;
window.authHeader = authHeader;

// ── Login screen ───────────────────────────────────────────────────────────────
function LoginScreen({ onLogin }) {
  const [user, setUser] = useState('');
  const [pass, setPass] = useState('');
  const [err, setErr] = useState('');
  const [loading, setLoading] = useState(false);

  const submit = async (e) => {
    e.preventDefault();
    if (!user || !pass) { setErr('Enter username and password'); return; }
    setLoading(true);
    setErr('');
    const token = btoa(user + ':' + pass);
    try {
      const r = await fetch('/api/auth/check', { headers: { Authorization: 'Basic ' + token } });
      if (r.ok) { setToken(token); onLogin(); }
      else { setErr('Invalid credentials'); }
    } catch { setErr('Could not reach server'); }
    setLoading(false);
  };

  return (
    <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', background: 'var(--s-bg-0)' }}>
      <div style={{ background: 'var(--s-bg-2)', border: '1px solid var(--s-border-strong)', borderRadius: 'var(--s-r-lg)', padding: '32px 36px', width: 340, boxShadow: 'var(--s-shadow-modal)' }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 28 }}>
          <svg width="36" height="36" viewBox="0 0 1000 1000" style={{ borderRadius: 8, flexShrink: 0 }}>
            <rect width="1000" height="1000" fill="#0000aa"/>
            <g fill="#ffde40" transform="matrix(1.6251891,0,0,1.6251891,-265.22029,107.92313)">
              <path d="m 331.3,339.6 c 0,-43.1 -25.8,-73.1 -50.7,-102.2 -1.3,-1.6 -2.6,-3.1 -4,-4.6 -32.2,-37.9 -38.9,-45.7 -38.9,-69.9 0,-9.1 6.6,-18.9 17.3,-18.9 9,0 15.3,7.8 15.3,18.9 v 31.9 h 59.4 v -42.3 c 0,-15.6 -7.9,-31.4 -21.5,-43.2 C 293.9,96.9 275,90.1 255,90.1 c -24.4,0 -44.9,7.8 -59.2,22.5 -13.4,13.8 -20.7,33.3 -20.7,55 0,33.3 16.2,66.4 48.2,98.4 28.7,28.3 45.4,49.8 45.4,76 0,14.3 -5.9,21.3 -18.1,21.3 -12.2,0 -20.1,-8.4 -20.1,-21.3 v -29.5 h -59 v 42.3 c 0,13.4 6,26.8 16.6,37.6 L 321.2,379 c 6.6,-11.7 10.1,-25.2 10.1,-39.4 z"/>
              <polygon points="483.7,147.9 483.7,94.1 335.5,94.1 335.5,147.9 379.1,147.9 379.1,373.2 442.1,366.9 442.1,147.9 "/>
              <polygon points="555.3,340.7 555.3,269.5 617.3,269.5 617.3,213.7 555.3,213.7 555.3,147.9 617.3,147.9 617.3,94.1 492.3,94.1 492.3,361.9 617.3,349.4 617.3,340.7 "/>
              <path d="m 688.3,291.9 h 14.9 c 16.6,0 33,-5 45,-13.8 14.4,-10.5 22,-25.8 22,-44.1 v -82 c 0,-18.4 -7.6,-33.6 -22,-44.1 -12,-8.8 -28.5,-13.8 -45,-13.8 h -78.3 v 254.5 l 63.4,-6.4 z m 0,-142 h 9.3 c 7.9,0 11.7,4.4 11.7,13.3 v 59.6 c 0,8.9 -3.8,13.3 -11.7,13.3 h -9.3 z"/>
            </g>
          </svg>
          <div>
            <div style={{ fontSize: 16, fontWeight: 700, fontFamily: 'var(--s-font-display)' }}>Robylab</div>
            <div style={{ fontSize: 12, color: 'var(--s-fg-3)' }}>Internal tools</div>
          </div>
        </div>
        <form onSubmit={submit} style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
          <Input label="Username" value={user} onChange={e => setUser(e.target.value)} autoFocus autoComplete="username"/>
          <Input label="Password" type="password" value={pass} onChange={e => setPass(e.target.value)} autoComplete="current-password"/>
          {err && <div style={{ fontSize: 12, color: 'var(--s-danger)', padding: '6px 0' }}>{err}</div>}
          <Button variant="primary" full loading={loading} style={{ marginTop: 4 }}>Sign in</Button>
        </form>
      </div>
    </div>
  );
}

// ── App ────────────────────────────────────────────────────────────────────────
function App() {
  const [authed, setAuthed] = useState(!!getToken());
  const [route, setRoute] = useState('home');
  const [toolStatuses, setToolStatuses] = useState({ pipedrive: null, knowledge: null });

  const navigate = (target) => {
    setRoute(target);
    requestAnimationFrame(() => {
      const el = document.getElementById('content-scroll');
      if (el) el.scrollTop = 0;
    });
  };

  // Poll tool statuses every 30s
  const pollStatuses = useCallback(async () => {
    if (!getToken()) return;
    try {
      const [pd, kb] = await Promise.allSettled([
        fetch('/api/pd/api/sync/status', { headers: authHeader() }).then(r => r.json()),
        fetch('/api/kb/sync/status', { headers: authHeader() }).then(r => r.json()),
      ]);
      setToolStatuses({
        pipedrive: pd.status === 'fulfilled' && pd.value.isRunning ? 'running' : 'idle',
        knowledge: kb.status === 'fulfilled' && (kb.value.crm_running || kb.value.files_running || kb.value.summarize_running) ? 'running' : 'idle',
      });
    } catch {}
  }, []);

  useEffect(() => {
    if (!authed) return;
    pollStatuses();
    const id = setInterval(pollStatuses, 30000);
    return () => clearInterval(id);
  }, [authed, pollStatuses]);

  // Handle 401 from proxy — logout
  useEffect(() => {
    if (!authed) return;
    const handler = (e) => {
      if (e.detail?.status === 401) { clearToken(); setAuthed(false); }
    };
    window.addEventListener('robylab-401', handler);
    return () => window.removeEventListener('robylab-401', handler);
  }, [authed]);

  if (!authed) return <LoginScreen onLogin={() => setAuthed(true)}/>;

  const breadcrumbs = (() => {
    if (route === 'home')     return ['Robylab', 'Home'];
    if (route === 'pipedrive') return ['Robylab', 'Tools', 'Pipedrive Sync'];
    if (route === 'knowledge') return ['Robylab', 'Tools', 'Knowledge Base'];
    if (route === 'settings') return ['Robylab', 'System', 'Settings'];
    return ['Robylab'];
  })();

  return (
    <ToastProvider>
      <div style={{ display: 'flex', height: '100%', width: '100%' }}>
        <Sidebar active={route} onNavigate={navigate} toolStatuses={toolStatuses}/>
        <main style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0, height: '100%' }}>
          <TopBar breadcrumbs={breadcrumbs}/>
          <div id="content-scroll" style={{ flex: 1, overflowY: 'auto' }}>
            {route === 'home'      && <HomeScreen onNavigate={navigate}/>}
            {route === 'pipedrive' && <PipedriveScreen onUnauth={() => { clearToken(); setAuthed(false); }}/>}
            {route === 'knowledge' && <KnowledgeBaseScreen/>}
            {route === 'settings'  && <SettingsScreen/>}
          </div>
        </main>
      </div>
    </ToastProvider>
  );
}

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