// App.jsx — root: auth, routing, theme, upload simulation, tweaks. Mounts last.
/* global React, ReactDOM, I, PlatGlyph, PLATFORMS, Login, Mark, Composer, History, Integrations,
   SEED_CONN, INTEGRATIONS, useTweaks, TweaksPanel, TweakSection, TweakRadio, TweakColor, TweakToggle */

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "style": "elegan",
  "accent": "#b89048",
  "pattern": true
}/*EDITMODE-END*/;

const ACCENTS = ['#b89048', '#0d6b58', '#a8553a', '#7a6a3c'];

function rowNeedsAttention(t) {
  const v = PLATFORMS.map(p => t[p.id]).filter(x => x && x !== 'idle');
  return v.includes('failed');
}
function rowRunning(t) {
  return PLATFORMS.map(p => t[p.id]).some(x => x === 'processing');
}

function App() {
  const [tw, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [authed, setAuthed] = React.useState(false);
  const [authChecked, setAuthChecked] = React.useState(false);
  const [screen, setScreen] = React.useState('compose');
  const [theme, setTheme] = React.useState(() => localStorage.getItem('assuffah-theme') || 'light');
  const [history, setHistory] = React.useState([]);
  const [conn, setConn] = React.useState(SEED_CONN);
  const [toasts, setToasts] = React.useState([]);
  const seq = React.useRef(100);

  // apply theme + tweaks to <html>
  React.useEffect(() => {
    const el = document.documentElement;
    el.setAttribute('data-theme', theme);
    el.setAttribute('data-style', tw.style);
    el.style.setProperty('--accent', tw.accent);
    el.style.setProperty('--accent-2', tw.accent);
    if (!tw.pattern) el.style.setProperty('--pattern-op', '0');
    else el.style.removeProperty('--pattern-op');
    localStorage.setItem('assuffah-theme', theme);
  }, [theme, tw]);

  const toast = (text) => {
    const id = ++seq.current;
    setToasts(t => [...t, { id, text }]);
    setTimeout(() => setToasts(t => t.filter(x => x.id !== id)), 3400);
  };

  // cek sesi saat load (hindari kedip layar login bila sudah masuk)
  React.useEffect(() => {
    window.MUAPI.me()
      .then(u => { if (u) setAuthed(true); })
      .catch(() => {})
      .finally(() => setAuthChecked(true));
  }, []);

  // muat riwayat nyata dari backend
  const loadHistory = React.useCallback(async () => {
    try { setHistory(await window.MUAPI.listUploads()); }
    catch (e) { /* belum login / backend belum siap — diamkan */ }
  }, []);

  // muat status koneksi integrasi nyata dari backend
  const loadConn = React.useCallback(async () => {
    try {
      const c = await window.MUAPI.integrations();
      setConn(prev => ({ ...prev, ...c }));
    } catch (e) { /* belum login — diamkan */ }
  }, []);

  React.useEffect(() => { if (authed) { loadHistory(); loadConn(); } }, [authed, loadHistory, loadConn]);

  // polling: selama ada baris yang masih "processing", segarkan tiap 2.5 dtk
  React.useEffect(() => {
    const running = history.some(h => rowRunning(h.targets));
    if (!running) return;
    const t = setInterval(loadHistory, 2500);
    return () => clearInterval(t);
  }, [history, loadHistory]);

  const setTarget = (hid, pid, val) => setHistory(hs => hs.map(h =>
    h.id === hid ? { ...h, targets: { ...h.targets, [pid]: val } } : h));

  const addUpload = async (data) => {
    try {
      const entry = await window.MUAPI.createUpload(data); // POST multipart → backend
      setHistory(hs => [entry, ...hs.filter(h => h.id !== entry.id)]);
      setScreen('history');
      toast(data.schedule ? 'Dijadwalkan & masuk antrean sebar' : 'Video diunggah — menyebar ke platform…');
      // status per-platform akan ter-update lewat polling loadHistory()
    } catch (e) {
      toast('Gagal mengunggah: ' + e.message);
    }
  };

  const setConnStatus = (pid, patch) => setConn(c => ({ ...c, [pid]: { ...c[pid], ...patch } }));
  const platName = (pid) => (PLATFORMS.find(p => p.id === pid) || {}).name || pid;

  // hubungkan: kirim kredensial (vals dari kartu Integrasi) ke backend
  const connect = async (pid, vals) => {
    setConnStatus(pid, { status: 'connecting' });
    try {
      const res = await window.MUAPI.connectIntegration(pid, vals || {});
      if (res.authUrl) { // platform OAuth (mis. TikTok) — arahkan untuk otorisasi
        toast(`Mengarahkan ke ${platName(pid)} untuk otorisasi…`);
        window.location.href = res.authUrl;
        return;
      }
      setConnStatus(pid, { status: 'connected', account: res.account, since: 'Tersambung baru saja' });
      toast(`${platName(pid)} berhasil terhubung`);
    } catch (e) {
      await loadConn(); // kembalikan status sebenarnya
      toast(`Gagal menghubungkan ${platName(pid)}: ${e.message}`);
    }
  };
  const disconnect = async (pid) => {
    try { await window.MUAPI.disconnectIntegration(pid); } catch (e) {}
    setConnStatus(pid, { status: 'disconnected', account: null, since: null });
    toast(`${platName(pid)} diputuskan`);
  };
  const refresh = (pid, vals) => connect(pid, vals); // token manual: perbarui = kirim ulang kredensial

  const retry = async (hid, pid) => {
    setTarget(hid, pid, 'processing'); // optimistik; status final dari polling
    try { await window.MUAPI.retry(hid, pid); }
    catch (e) { toast('Gagal mengulang: ' + e.message); }
  };

  const logout = async () => {
    try { await window.MUAPI.logout(); } catch (e) {}
    setAuthed(false);
    setHistory([]);
    setScreen('compose');
  };

  const attention = history.filter(h => rowNeedsAttention(h.targets)).length;
  const connIssues = PLATFORMS.filter(p => ['disconnected', 'expired'].includes(conn[p.id].status)).length;

  if (!authChecked) return null; // tunggu cek sesi selesai (hindari kedip)

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

  return (
    <div className="app">
      <header className="topbar">
        <div className="brand">
          <span className="seal"><Mark /></span>
          <div className="wm"><b>Assuffah</b><span>Studio Multi-Upload</span></div>
        </div>

        <nav className="nav">
          <button className={screen === 'compose' ? 'active' : ''} onClick={() => setScreen('compose')}>
            <I.grid /><span className="lbl">Multi Upload</span>
          </button>
          <button className={screen === 'history' ? 'active' : ''} onClick={() => setScreen('history')}>
            <I.list /><span className="lbl">Riwayat</span>
            {attention > 0 && <span className="badge">{attention}</span>}
          </button>
          <button className={screen === 'integrasi' ? 'active' : ''} onClick={() => setScreen('integrasi')}>
            <I.plug /><span className="lbl">Integrasi</span>
            {connIssues > 0 && <span className="badge">{connIssues}</span>}
          </button>
        </nav>

        <div className="spacer" />
        <button className="iconbtn" onClick={() => setTheme(t => t === 'dark' ? 'light' : 'dark')}
                title="Ganti mode terang/gelap" aria-label="Tema">
          {theme === 'dark' ? <I.sun /> : <I.moon />}
        </button>
        <button className="iconbtn" onClick={logout} title="Keluar" aria-label="Keluar">
          <I.logout />
        </button>
        <div className="avatar" title="Admin Media">AM</div>
      </header>

      <div className="page">
        {screen === 'compose'
          ? <Composer onSubmit={addUpload} conn={conn} goIntegrasi={() => setScreen('integrasi')} />
          : screen === 'history'
          ? <History history={history} onRetry={retry} goCompose={() => setScreen('compose')} />
          : <Integrations conn={conn} onConnect={connect} onDisconnect={disconnect} onRefresh={refresh} />}
      </div>

      <footer className="app-foot">
        <span>© 2026 Assuffah · Studio Multi-Upload</span>
        <span className="af-dot">•</span>
        <span>Semua hak dilindungi</span>
      </footer>

      <nav className="mobnav">
        <button className={screen === 'compose' ? 'active' : ''} onClick={() => setScreen('compose')}>
          <I.grid /><span>Upload</span>
        </button>
        <button className={screen === 'history' ? 'active' : ''} onClick={() => setScreen('history')}>
          <span className="mn-ic"><I.list />{attention > 0 && <i className="mdot" />}</span><span>Riwayat</span>
        </button>
        <button className={screen === 'integrasi' ? 'active' : ''} onClick={() => setScreen('integrasi')}>
          <span className="mn-ic"><I.plug />{connIssues > 0 && <i className="mdot" />}</span><span>Integrasi</span>
        </button>
      </nav>

      <div className="toast-wrap">
        {toasts.map(t => (
          <div className="toast" key={t.id}><span className="tic"><I.check /></span>{t.text}</div>
        ))}
      </div>
    </div>
  );
}

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