import {getOptions, isOptionEnabled} from '../../common/optionsUtils.js';

const kInteropLoadMoreClasses = {
  // New (interop) UI without nested replies
  'scTailwindThreadMorebuttonload-all': 'threadall',
  'scTailwindThreadMorebuttonload-more': 'thread',

  // New (interop) UI with nested replies
  'scTailwindThreadMessagegapload-all': 'threadall',
  'scTailwindThreadMessagegapload-more': 'thread',
};

export default class InfiniteScroll {
  constructor() {
    this.intersectionObserver = null;
  }

  setUpIntersectionObserver(node, isScrollableContent) {
    if (this.intersectionObserver === null) {
      var scrollableContent = isScrollableContent ?
          node :
          node.querySelector('.scrollable-content');
      if (scrollableContent !== null) {
        let intersectionOptions = {
          root: scrollableContent,
          rootMargin: '0px',
          threshold: 1.0,
        };
        this.intersectionObserver = new IntersectionObserver(
            this.intersectionCallback, intersectionOptions);
      }
    }
  }

  intersectionCallback(entries, observer) {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        console.debug('[infinitescroll] Clicking button: ', entry.target);
        entry.target.click();
      }
    });
  }

  observeLoadMoreBar(bar) {
    if (this.intersectionObserver === null) {
      console.warn(
          '[infinitescroll] ' +
          'The intersectionObserver is not ready yet.');
      return;
    }

    getOptions(['thread', 'threadall']).then(threadOptions => {
      if (threadOptions.thread)
        this.intersectionObserver.observe(
            bar.querySelector('.load-more-button'));
      if (threadOptions.threadall)
        this.intersectionObserver.observe(
            bar.querySelector('.load-all-button'));
    });
  }

  observeLoadMoreInteropBtn(btn) {
    if (this.intersectionObserver === null) {
      console.warn(
          '[infinitescroll] ' +
          'The intersectionObserver is not ready yet.');
      return;
    }

    let parentClasses = btn.parentNode?.classList;
    let feature = null;
    for (const [c, f] of Object.entries(kInteropLoadMoreClasses)) {
      if (parentClasses?.contains?.(c)) {
        feature = f;
        break;
      }
    }
    if (feature === null) return;
    isOptionEnabled(feature).then(isEnabled => {
      if (isEnabled) this.intersectionObserver.observe(btn);
    });
  }
};
