/**
@license
Copyright (c) 2025 trading_peter
This program is available under Apache License Version 2.0
*/

/**
 * Orchastrates a intersetion observer to execute code if the element becomes visible or hidden/disconnected.
 */
export const Visibility = function(superClass) {
  return class extends superClass {

    constructor() {
      super();
      
      // Create intersection observer
      this._observer = new IntersectionObserver(entries => {
        entries.forEach(entry => {
          if (entry.isIntersecting) {
            this.visibilityChanged(true);
          } else {
            this.visibilityChanged(false);
          }
        });
      });
    }

    /**
     * Invoked when the element becomes either visible / connected or hidden / disconnected.
     * The callback's logic must be able to handle multiple, successive calls with the same state.
     * @param {boolean} visible
     */
    visibilityChanged(visible) {
      console.warn(this.tagName, 'should override onVisible');
    }

    connectedCallback() {
      super.connectedCallback();
      // Start observing this element
      this._observer.observe(this);
    }

    disconnectedCallback() {
      super.disconnectedCallback();
      // Clean up
      this._observer.unobserve(this);
      this._observer.disconnect();

      this.visibilityChanged(false);
    }
  };
}