// Saas/content/leaver.js
// Automatización para abandonar un grupo de Facebook desde su página individual de grupo

(async function() {
  if (window.fbGroupLeaverInstance) return;
  window.fbGroupLeaverInstance = true;

  const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms));

  function simulateClick(element) {
    if (!element) return;
    element.focus();
    element.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, buttons: 1 }));
    element.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, buttons: 1 }));
    element.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }));
    if (typeof element.click === 'function') {
      element.click();
    }
  }

  function findJoinedButton() {
    const elements = Array.from(document.querySelectorAll('div[role="button"], button, span[role="button"], a[role="button"]'));
    const targets = ["eres miembro", "joined", "miembro", "miembro del grupo", "joined group", "te uniste", "joined v"];
    
    for (const el of elements) {
      if (el.offsetWidth === 0 && el.offsetHeight === 0) continue;
      const text = (el.innerText || el.textContent || "").trim().toLowerCase();
      const ariaLabel = (el.getAttribute("aria-label") || "").trim().toLowerCase();
      
      if (targets.some(t => text === t || text.startsWith(t) || ariaLabel === t || ariaLabel.startsWith(t))) {
        return el;
      }
    }
    
    // Fallback: look for span with text containing "miembro" or "joined" inside a button or div
    const spans = Array.from(document.querySelectorAll('span'));
    for (const span of spans) {
      if (span.offsetWidth === 0 && span.offsetHeight === 0) continue;
      const text = (span.innerText || span.textContent || "").trim().toLowerCase();
      if (text === "eres miembro" || text === "joined" || text === "miembro" || text === "te uniste") {
        const parentButton = span.closest('div[role="button"], button');
        if (parentButton) return parentButton;
      }
    }
    return null;
  }

  function findLeaveMenuOption() {
    const elements = Array.from(document.querySelectorAll('span, div, [role="menuitem"], a'));
    const targets = ["abandonar grupo", "leave group", "salir del grupo", "abandonar", "leave"];
    
    let matched = elements.find(el => {
      if (el.offsetWidth === 0 && el.offsetHeight === 0) return false;
      const text = (el.innerText || el.textContent || "").trim().toLowerCase();
      const ariaLabel = (el.getAttribute("aria-label") || "").trim().toLowerCase();
      return targets.some(t => text === t || ariaLabel === t);
    });

    if (matched) return matched;

    matched = elements.find(el => {
      if (el.offsetWidth === 0 && el.offsetHeight === 0) return false;
      if (el.tagName !== 'SPAN' && el.tagName !== 'A' && el.children.length > 2) return false;
      const text = (el.innerText || el.textContent || "").trim().toLowerCase();
      const ariaLabel = (el.getAttribute("aria-label") || "").trim().toLowerCase();
      return targets.some(t => text.includes(t) || ariaLabel.includes(t));
    });

    return matched;
  }

  async function findDialogConfirmButton() {
    const allElements = Array.from(document.querySelectorAll('button, div[role="button"], span, div, a'));
    const targets = ["abandonar grupo", "leave group", "abandonar", "leave", "salir", "confirmar"];
    const candidates = [];
    
    for (const el of allElements) {
      if (el.offsetWidth === 0 && el.offsetHeight === 0) continue;
      
      const text = (el.innerText || el.textContent || "").trim().toLowerCase();
      const ariaLabel = (el.getAttribute("aria-label") || "").trim().toLowerCase();
      
      if (text.includes("cancelar") || text.includes("cancel") || text.includes("cerrar") || text.includes("close")) {
        continue;
      }
      
      if (targets.some(t => text === t || ariaLabel === t || text.includes(t))) {
        candidates.push({
          element: el,
          tag: el.tagName,
          text: text,
          rect: el.getBoundingClientRect()
        });
      }
    }

    if (candidates.length === 0) return null;

    for (let i = candidates.length - 1; i >= 0; i--) {
      const c = candidates[i];
      const isButton = c.tag === 'BUTTON' || c.element.getAttribute('role') === 'button' || c.element.closest('div[role="dialog"]') || c.element.closest('[style*="position: fixed"]');
      if (isButton) return c.element;
    }

    return candidates[candidates.length - 1].element;
  }

  async function run() {
    try {
      console.log("[FB Auto-Leaver] Cargando página del grupo...");
      await wait(3000);

      // 1. Localizar y clickear el botón "Eres miembro"
      const joinedBtn = findJoinedButton();
      if (!joinedBtn) {
        throw new Error("No se encontró el botón de miembro ('Eres miembro' / 'Joined'). Es posible que no seas miembro o la UI sea diferente.");
      }

      console.log("[FB Auto-Leaver] Haciendo clic en el botón de miembro...");
      joinedBtn.scrollIntoView({ block: 'center', inline: 'nearest' });
      await wait(500);
      simulateClick(joinedBtn);
      
      // Esperar que se despliegue el menú
      await wait(2000);

      // 2. Localizar y clickear la opción "Abandonar grupo"
      const leaveOption = findLeaveMenuOption();
      if (!leaveOption) {
        throw new Error("No se encontró la opción 'Abandonar grupo' en el menú desplegable.");
      }

      console.log("[FB Auto-Leaver] Haciendo clic en la opción 'Abandonar grupo' del menú...");
      simulateClick(leaveOption);

      // Esperar que aparezca el diálogo emergente
      await wait(2000);

      // 3. Confirmar salida en el diálogo
      const confirmBtn = await findDialogConfirmButton();
      if (!confirmBtn) {
        throw new Error("No se encontró el botón de confirmación en el modal emergente.");
      }

      console.log("[FB Auto-Leaver] Confirmando salida...");
      simulateClick(confirmBtn);

      // Obtener intervalo del storage para esperar antes de reportar
      chrome.storage.local.get({ leave_interval: 5 }, async (data) => {
        const waitTime = (data.leave_interval || 5) * 1000;
        console.log(`[FB Auto-Leaver] Salida confirmada. Esperando ${data.leave_interval} segundos...`);
        await wait(waitTime);

        chrome.runtime.sendMessage({
          type: "LEAVE_RESULT",
          data: {
            status: "success",
            motivo: "Abandonado correctamente"
          }
        });
      });

    } catch (err) {
      console.error("[FB Auto-Leaver] Error:", err.message);
      chrome.runtime.sendMessage({
        type: "LEAVE_RESULT",
        data: {
          status: "error",
          motivo: err.message
        }
      });
    }
  }

  run();
})();
