// Content script TikTok (isolated world).
// Coordena: injetar inject-tt.js no page-world, escutar postMessage com items
// capturados, alimentar o painel flutuante (panel.js) e despachar pro service worker
// quando o usuário clicar em Importar.

(function () {
  if (window.__IS_TT_INJECTED__) return;
  window.__IS_TT_INJECTED__ = true;

  console.log('[IS-Ext/TikTok] content script carregado');

  // Injeta scripts no page-world. Em MV3, a forma garantida é inserir <script src>
  // apontando pra um web_accessible_resource — o Chrome carrega no contexto da página.
  function injectScript(filename) {
    const s = document.createElement('script');
    s.src = chrome.runtime.getURL(filename);
    s.onload = () => s.remove();
    (document.head || document.documentElement).appendChild(s);
  }

  // panel.js e autoscroll.js agora são declarados como content_scripts no manifest
  // (rodam no mesmo isolated world, sem precisar carregar via fetch). Aqui só conferimos
  // que o __IS_PANEL__ ficou disponível.

  let panelReady = false;
  let autoScrollCtrl = null;

  function bootstrap() {
    if (!window.__IS_PANEL__ || !window.__IS_AUTOSCROLL__) {
      console.error('[IS-Ext/TT] panel.js / autoscroll.js não carregaram. Conferir manifest.');
      return;
    }

    // Inicializa painel flutuante
    window.__IS_PANEL__.init({
      platform: 'tiktok',
      onImport: handleImport,
      onAutoScroll: handleAutoScroll
    });
    panelReady = true;

    // inject-tt.js agora é registrado direto no manifest com run_at=document_start
    // + world=MAIN (pega as primeiras requests do TT desde o início).
    startProfileWatcher();
  }

  // ── Reset do painel ao trocar de perfil ─────────────────────────────────
  // TikTok é SPA — URL muda sem reload da página. Detecta @user no path e quando
  // muda, zera o painel pra não misturar vídeos de perfis diferentes.
  let _currentProfile = extractProfile(location.pathname);
  function extractProfile(pathname) {
    const m = pathname.match(/^\/@([^/?#]+)/);
    return m ? m[1] : null;
  }
  function startProfileWatcher() {
    setInterval(() => {
      const next = extractProfile(location.pathname);
      if (next !== _currentProfile) {
        console.log(`[IS-Ext/TT] perfil mudou: @${_currentProfile || '?'} → @${next || '?'}, limpando painel`);
        _currentProfile = next;
        window.__IS_PANEL__?.clear();
      }
    }, 800);
  }

  // ── Bridge SW ↔ page-world pra fetch CDN ──────────────────────────────
  // SW manda { type: 'IS_EXT_FETCH_URL', url }, content script forwarda pro
  // inject-tt.js no page-world (que tem cookies + origem certa), recebe o
  // buffer de volta e devolve pro SW via sendResponse.
  chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
    if (msg?.type !== 'IS_EXT_FETCH_URL') return false;
    const requestId = 'fetch_' + Math.random().toString(36).slice(2);
    const timer = setTimeout(() => {
      window.removeEventListener('message', listener);
      sendResponse({ ok: false, error: 'timeout (60s)' });
    }, 60000);
    const listener = (event) => {
      if (event.source !== window) return;
      const d = event.data;
      if (!d || d.__is_ext_fetch_reply !== true || d.requestId !== requestId) return;
      clearTimeout(timer);
      window.removeEventListener('message', listener);
      if (d.error) {
        sendResponse({ ok: false, error: d.error });
      } else {
        sendResponse({ ok: true, b64: d.b64, mime: d.mime });
      }
    };
    window.addEventListener('message', listener);
    window.postMessage({ __is_ext_fetch: true, url: msg.url, requestId }, '*');
    return true; // async response
  });

  // Recebe items capturados pelo inject-tt.js (via window.postMessage)
  window.addEventListener('message', (event) => {
    if (event.source !== window) return;
    const data = event.data;
    if (!data || !data.__is_ext) return;

    if (data.type === 'IS_EXT_TIKTOK_ITEMS') {
      // Só aceita items se estiver dentro de um perfil (/@user). Filtra também
      // pelo author pra ignorar items do feed/recomendados que vazaram na API.
      const profile = extractProfile(location.pathname);
      if (!profile) {
        console.log('[IS-Ext/TT] não está em perfil — items ignorados');
        return;
      }
      if (panelReady && Array.isArray(data.items)) {
        const filtered = data.items.filter(it => it.author === profile);
        if (filtered.length === 0) return;
        const added = window.__IS_PANEL__.addItems(filtered);
        if (added > 0) console.log(`[IS-Ext/TT] +${added} items de @${profile} (total ${window.__IS_PANEL__.getItems().length})`);
      }
    } else if (data.type === 'IS_EXT_TT_READY') {
      console.log('[IS-Ext/TT] page-world injector pronto');
    }
  });

  function handleAutoScroll(turnOn) {
    if (turnOn) {
      autoScrollCtrl = window.__IS_AUTOSCROLL__.startAutoScroll({
        onStop: (reason) => {
          window.__IS_PANEL__.setAutoScrollState(false);
          console.log('[IS-Ext/TT] auto-scroll parou:', reason);
        }
      });
      window.__IS_PANEL__.setAutoScrollState(true);
    } else {
      autoScrollCtrl?.stop();
      window.__IS_PANEL__.setAutoScrollState(false);
    }
  }

  function handleImport(items) {
    console.log('[IS-Ext/TT] importar:', items.length, 'items');
    chrome.runtime.sendMessage({ type: 'ENQUEUE_DOWNLOAD', items }, (r) => {
      if (chrome.runtime.lastError) {
        console.error('[IS-Ext/TT] enqueue err:', chrome.runtime.lastError);
        return;
      }
      if (r?.ok) {
        console.log('[IS-Ext/TT] enfileirados', r.added);
        // Marca como queued localmente (UX imediata) e começa o polling
        window.__IS_PANEL__?.applyJobStatuses(items.map(it => ({
          id: `${it.platform}:${it.id}`, status: 'queued'
        })));
        startStatusPolling();
      } else {
        console.warn('[IS-Ext/TT] enqueue resposta:', r);
      }
    });
  }

  // Polling pra atualizar status na UI enquanto os downloads rolam
  let _statusTimer = null;
  function startStatusPolling() {
    if (_statusTimer) return;
    const tick = () => {
      chrome.runtime.sendMessage({ type: 'GET_QUEUE' }, (r) => {
        if (chrome.runtime.lastError || !r?.ok) return;
        window.__IS_PANEL__?.applyJobStatuses(r.items || []);
        const allTerminal = (r.items || []).every(j => ['done', 'failed', 'blocked'].includes(j.status));
        if (allTerminal && r.items?.length) {
          clearInterval(_statusTimer);
          _statusTimer = null;
        }
      });
    };
    tick();
    _statusTimer = setInterval(tick, 1500);
  }

  bootstrap();
})();
