import * as Gestures from '@vaadin/component-base/src/gestures.js';

function init(target) {
  if (target.$contextMenuTargetConnector) {
    return;
  }

  target.$contextMenuTargetConnector = {
    openOnHandler(e) {
      // used by Grid to prevent context menu on selection column click
      if (target.preventContextMenu && target.preventContextMenu(e)) {
        return;
      }
      e.preventDefault();
      e.stopPropagation();
      this.$contextMenuTargetConnector.openEvent = e;
      let detail = {};
      if (target.getContextMenuBeforeOpenDetail) {
        detail = target.getContextMenuBeforeOpenDetail(e);
      }
      target.dispatchEvent(
        new CustomEvent('vaadin-context-menu-before-open', {
          detail: detail
        })
      );
    },

    updateOpenOn(eventType) {
      this.removeListener();
      this.openOnEventType = eventType;

      customElements.whenDefined('vaadin-context-menu').then(() => {
        if (Gestures.gestures[eventType]) {
          Gestures.addListener(target, eventType, this.openOnHandler);
        } else {
          target.addEventListener(eventType, this.openOnHandler);
        }
      });
    },

    removeListener() {
      if (this.openOnEventType) {
        if (Gestures.gestures[this.openOnEventType]) {
          Gestures.removeListener(target, this.openOnEventType, this.openOnHandler);
        } else {
          target.removeEventListener(this.openOnEventType, this.openOnHandler);
        }
      }
    },

    openMenu(contextMenu) {
      contextMenu.open(this.openEvent);
    },

    removeConnector() {
      this.removeListener();
      target.$contextMenuTargetConnector = undefined;
    },
  };
}

window.Vaadin.Flow.contextMenuTargetConnector = { init };
