(() => {
  let iframe;
  let overlay;
  let buddyButton;
  let buddyModal;
  let buddyClose;
  let isNotifyed = false;
  let isChatboxOpen = false;

  // Hide the modal and overlay on click
  const hideModalAndOverlay = () => {
    if (isNotifyed) buddyButton.children[2].style.display = "none";

    isChatboxOpen = false;
    document.body.style.overflowY = 'auto';
    overlay.classList.remove('show');
    buddyModal.classList.remove('show');
    setTimeout(() => {
      buddyButton.classList.remove('hidden');
    }, 500);
  };

  // Show the modal or bottom sheet on buddy button click
  const toggleBuddyModal = () => {
    isChatboxOpen = true;
    document.body.style.overflowY = 'hidden';
    buddyButton.classList.add('hidden');
    setTimeout(() => {
      overlay.classList.add('show');
      buddyModal.classList.add('show');
    }, 500);
  };

  const messageFromIframeChild = (event) => {
    const allowedOriginPattern = /^https:\/\/(?:[\w-]+\.)*edgeprop\.sg$/;
    if (!allowedOriginPattern.test(event.origin)) return;

    if (event.data?.epbuddy?.closePopup) {
      hideModalAndOverlay();
      return;
    }
    
    isNotifyed = event.data?.epbuddy && !event.data?.epbuddy.isLoading && !event.data?.epbuddy.isTyping;
    if (isNotifyed && !isChatboxOpen) buddyButton.children[2].style.display = "block";
  }

  // Remove event listeners
  const cleanupListeners = () => {
    window.removeEventListener('message', messageFromIframeChild);
    overlay?.removeEventListener?.('click', hideModalAndOverlay);
    buddyButton?.removeEventListener?.('click', toggleBuddyModal);
    buddyClose?.removeEventListener?.('click', hideModalAndOverlay);
  };

  // Add event listeners
  const setupListeners = () => {
    overlay = document.querySelector('.buddy-chatbot-overlay');
    buddyButton = document.querySelector('.buddy-chatbot-icon');
    buddyModal = document.querySelector('.buddy-chatbot-modal');
    buddyClose = document.querySelector('.buddy-chatbot-close');

    window.addEventListener('message', messageFromIframeChild);
    overlay?.addEventListener?.('click', hideModalAndOverlay);
    buddyButton?.addEventListener?.('click', toggleBuddyModal);
    buddyClose?.addEventListener?.('click', hideModalAndOverlay);
  };

  // Load necessary scripts and styles, and setup the chatbot
  const loadChatbot = async () => {
    const scriptElement = document.querySelector('script[src*="/buddy/embed.js"]');
    const scriptSrc = scriptElement?.src || "";

    if (!scriptSrc) {
      console.error('Embed script not found');
      return;
    }

    const { searchParams } = new URL(scriptSrc);
    if (searchParams.get('askbuddy') == 0) return;

    const sourceParam = searchParams.get('source');
    const projectName = sourceParam?.includes?.("newlaunch-") ? sourceParam.replace("newlaunch-", "") || "" : "";

    const response = await fetch(`${window.location.origin}/buddy/embed.html?v=${Date.now()}`);
    const html = await response.text();
    document.body.insertAdjacentHTML('beforeend', html);

    iframe = document.querySelector('.buddy-chatbot-iframe');
    iframe.src = `https://buddy.edgeprop.sg/${projectName}?embed=1&${searchParams.toString()}&v=${new Date().getTime()}`;

    setupListeners();
  };

  document.addEventListener('DOMContentLoaded', loadChatbot);
  window.addEventListener('beforeunload', cleanupListeners);
  window.addEventListener('popstate', cleanupListeners);
  window.addEventListener('hashchange', cleanupListeners);
})();