// Content script Instagram (isolated world). Mesma estrutura do tiktok.js.

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

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

  function injectScript(filename) {
    const s = document.createElement('script');
    s.src = chrome.runtime.getURL(filename);
    s.onload = () => s.remove();
    (document.head || document.documentElement).appendChild(s);
  }

  let panelReady = false;
  let autoScrollCtrl = null;

  function bootstrap() {
    if (!window.__IS_PANEL__ || !window.__IS_AUTOSCROLL__) {
      console.error('[IS-Ext/IG] panel.js / autoscroll.js não carregaram. Conferir manifest.');
      return;
    }
    window.__IS_PANEL__.init({
      platform: 'instagram',
      onImport: handleImport,
      onAutoScroll: handleAutoScroll
    });
    panelReady = true;

    // inject-ig.js agora é registrado direto no manifest com run_at=document_start
    // + world=MAIN (pega as primeiras requests do IG). O guard __IS_IG_INJECT__ no
    // próprio inject garante idempotência caso algum fluxo ainda chame injectScript.
    startProfileWatcher();
  }

  // ── Reset do painel ao trocar de perfil ─────────────────────────────────
  // IG é SPA. Profile path típico: /username/, /username/reels/, /username/tagged/.
  // Reservamos rotas conhecidas que NÃO são username pra não confundir.
  const IG_NON_PROFILE = new Set(['', 'reels', 'explore', 'p', 'reel', 'tv', 'stories', 'accounts', 'direct', 'about', 'developer', 'legal']);
  function extractProfile(pathname) {
    const seg = pathname.split('/').filter(Boolean)[0];
    if (!seg || IG_NON_PROFILE.has(seg)) return null;
    return seg;
  }
  let _currentProfile = extractProfile(location.pathname);
  function startProfileWatcher() {
    setInterval(() => {
      const next = extractProfile(location.pathname);
      if (next !== _currentProfile) {
        console.log(`[IS-Ext/IG] perfil mudou: @${_currentProfile || '?'} → @${next || '?'}, limpando painel`);
        _currentProfile = next;
        window.__IS_PANEL__?.clear();
      }
    }, 800);
  }

  // ── Bridge SW ↔ page-world pra fetch CDN ──────────────────────────────
  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;
  });

  window.addEventListener('message', (event) => {
    if (event.source !== window) return;
    const data = event.data;
    if (!data || !data.__is_ext) return;

    if (data.type === 'IS_EXT_IG_ITEMS') {
      const profile = extractProfile(location.pathname);
      if (!profile) {
        console.log('[IS-Ext/IG] não está em perfil — items ignorados');
        return;
      }
      if (panelReady && Array.isArray(data.items)) {
        const target = profile.toLowerCase();

        // Estratégia de filtro:
        //  - Match exato do author (case-insensitive): aceita.
        //  - Author vazio/null: ACEITA (alguns shapes do IG do graphql/query trazem
        //    items SEM owner info — esses costumam ser do perfil aberto mesmo).
        //  - Author diferente: REJEITA (vem do feed de descoberta misturado na resposta).
        const acceptedAuthors = new Map();    // author → count
        const rejectedAuthors = new Map();
        const filtered = data.items.filter(it => {
          const a = (it.author || '').toLowerCase();
          if (!a || a === target) {
            acceptedAuthors.set(a || '(sem author)', (acceptedAuthors.get(a || '(sem author)') || 0) + 1);
            return true;
          }
          rejectedAuthors.set(a, (rejectedAuthors.get(a) || 0) + 1);
          return false;
        });

        // Diagnóstico: sempre loga o que veio (ajuda muito a debugar mismatches)
        if (data.items.length > 0) {
          const acc = Array.from(acceptedAuthors.entries()).map(([k, v]) => `${k}:${v}`).join(', ') || '—';
          const rej = Array.from(rejectedAuthors.entries()).slice(0, 4).map(([k, v]) => `${k}:${v}`).join(', ') || '—';
          console.log(`[IS-Ext/IG] de ${data.items.length} items: aceitos=[${acc}] rejeitados=[${rej}]`);
        }

        if (filtered.length === 0) return;
        const added = window.__IS_PANEL__.addItems(filtered);
        if (added > 0) console.log(`[IS-Ext/IG] +${added} items de @${profile} (total ${window.__IS_PANEL__.getItems().length})`);
      }
    } else if (data.type === 'IS_EXT_IG_READY') {
      console.log('[IS-Ext/IG] 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/IG] auto-scroll parou:', reason);
        }
      });
      window.__IS_PANEL__.setAutoScrollState(true);
    } else {
      autoScrollCtrl?.stop();
      window.__IS_PANEL__.setAutoScrollState(false);
    }
  }

  function handleImport(items) {
    console.log('[IS-Ext/IG] importar:', items.length, 'items');
    chrome.runtime.sendMessage({ type: 'ENQUEUE_DOWNLOAD', items }, (r) => {
      if (chrome.runtime.lastError) {
        console.error('[IS-Ext/IG] enqueue err:', chrome.runtime.lastError);
        return;
      }
      if (r?.ok) {
        window.__IS_PANEL__?.applyJobStatuses(items.map(it => ({
          id: `${it.platform}:${it.id}`, status: 'queued'
        })));
        startStatusPolling();
      }
      console.log('[IS-Ext/IG] enqueue resposta:', r);
    });
  }

  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();
})();
