import type { TestStore } from '@ephox/agar';
import type { Menu, Toolbar } from '@ephox/bridge';
import { Arr } from '@ephox/katamari';

export const fetchMailMergeData = (settings: { collapseSearchResults: boolean }, store: TestStore): Toolbar.ToolbarMenuButtonSpec['fetch'] => (callback, fetchContext) => {
  const makeMailMerge = (info: { value: string; title?: string }): Menu.MenuItemSpec => ({
    type: 'menuitem',
    text: info.title ?? info.value,
    onAction: () => {
      store.adder('Triggering: ' + info.value)();
    }
  });

  const makeCategory = (title: string, items: Menu.NestedMenuItemContents[]): Menu.NestedMenuItemSpec => ({
    type: 'nestedmenuitem',
    text: title,
    getSubmenuItems: () => items
  });

  const currentDateMerge = {
    value: 'Current.Date',
    title: 'Current date in DD/MM/YYYY format'
  };

  const tocMerge = {
    value: 'Campaign.Toc',
    title: 'Linked table of contents in your campaign'
  };

  const phoneHomeMerge = { value: 'Phone.Home' };
  const phoneWorkMerge = { value: 'Phone.Work' };

  const personFirstnameMerge = { value: 'Person.Name.First' };
  const personSurnameMerge = { value: 'Person.Name.Last' };
  const personFullnameMerge = { value: 'Person.Name.Full' };

  const personWorkEmail = { value: 'Person.Email.Work' };
  const personHomeEmail = { value: 'Person.Email.Home' };

  const hasNoSearchPattern = !fetchContext || (fetchContext && fetchContext.pattern.length === 0);

  if (!settings.collapseSearchResults || hasNoSearchPattern) {
    callback([
      makeMailMerge(currentDateMerge),
      makeMailMerge(tocMerge),
      makeCategory(
        'Phone',
        [
          makeMailMerge(phoneHomeMerge),
          makeMailMerge(phoneWorkMerge)
        ]
      ),
      makeCategory(
        'Person',
        [
          makeMailMerge(personFirstnameMerge),
          makeMailMerge(personSurnameMerge),
          makeMailMerge(personFullnameMerge),
          makeCategory(
            'Email',
            [
              makeMailMerge(personWorkEmail),
              makeMailMerge(personHomeEmail)
            ]
          )
        ]
      )
    ]);
  } else {
    const allMerges: Array<{ value: string; title?: string }> = [
      currentDateMerge,
      tocMerge,
      phoneHomeMerge,
      phoneWorkMerge,
      personFirstnameMerge,
      personSurnameMerge,
      personFullnameMerge,
      personWorkEmail,
      personHomeEmail
    ];

    const matches = Arr.filter(allMerges, (m): boolean => {
      const valueMatches = m.value.toLowerCase().indexOf(fetchContext.pattern.toLowerCase()) > -1;
      return valueMatches || (
        m.title !== undefined && (m.title.toLowerCase().indexOf(fetchContext.pattern.toLowerCase()) > -1)
      );
    });

    if (matches.length > 0) {
      callback(
        Arr.map(matches, makeMailMerge)
      );
    } else {
      callback([
        {
          type: 'menuitem',
          text: 'No Results',
          enabled: false,
          onAction: () => {
            // eslint-disable-next-line no-console
            console.log('No results');
          }
        }
      ]);
    }
  }
};
