import { e2e } from '../index';

export enum PanelMenuItems {
  Edit = 'Edit',
  Inspect = 'Inspect',
  More = 'More...',
  Extensions = 'Extensions',
}

export const openPanelMenuItem = (menu: PanelMenuItems, panelTitle = 'New panel') => {
  // we changed the way we open the panel menu in react panels with the new panel header
  detectPanelType(panelTitle, (isAngularPanel) => {
    if (isAngularPanel) {
      e2e.components.Panels.Panel.title(panelTitle).should('be.visible').click();
      e2e.components.Panels.Panel.headerItems(menu).should('be.visible').click();
    } else {
      e2e.components.Panels.Panel.menu(panelTitle).click({ force: true }); // force click because menu is hidden and show on hover
      e2e.components.Panels.Panel.menuItems(menu).should('be.visible').click();
    }
  });
};

export const openPanelMenuExtension = (extensionTitle: string, panelTitle = 'New panel') => {
  const menuItem = PanelMenuItems.Extensions;
  // we changed the way we open the panel menu in react panels with the new panel header
  detectPanelType(panelTitle, (isAngularPanel) => {
    if (isAngularPanel) {
      e2e.components.Panels.Panel.title(panelTitle).should('be.visible').click();
      e2e.components.Panels.Panel.headerItems(menuItem)
        .should('be.visible')
        .parent()
        .parent()
        .invoke('addClass', 'open');
      e2e.components.Panels.Panel.headerItems(extensionTitle).should('be.visible').click();
    } else {
      e2e.components.Panels.Panel.menu(panelTitle).click({ force: true }); // force click because menu is hidden and show on hover
      e2e.components.Panels.Panel.menuItems(menuItem).trigger('mouseover', { force: true });
      e2e.components.Panels.Panel.menuItems(extensionTitle).click({ force: true });
    }
  });
};

function detectPanelType(panelTitle: string, detected: (isAngularPanel: boolean) => void) {
  e2e.components.Panels.Panel.title(panelTitle).then((el) => {
    const isAngularPanel = el.find('plugin-component.ng-scope').length > 0;

    if (isAngularPanel) {
      Cypress.log({
        name: 'detectPanelType',
        displayName: 'detector',
        message: 'Angular panel detected, will use legacy selectors.',
      });
    }

    detected(isAngularPanel);
  });
}
