import { store, event } from '@wisdom-utils/utils';
import BaseDirective from '../BaseDirective';
import CloseSingleDirective from './CloseSingleDirective';
import config from '../../config';

class CloseMenuDirective extends BaseDirective {
  static name = '关闭菜单或者模糊匹配关闭菜单';
  static beforeLoadDirectives = [CloseSingleDirective]
  match() {
    const { text } = this;
    let result = null;
    if(!result) {
      result = text.match(new RegExp(`关闭(所有).*(?=(?:[${Array.from(config.punctuationMark).join("|")}]?))`))
    }
    if (!result) {
      result = text.match(new RegExp(`关闭(当前).*(?=(?:[${Array.from(config.punctuationMark).join("|")}]?))`))
    }
    if (!result) {
      result = text.match(/关闭(.*)(?=(?:菜单|功能|路径))/);
    }
    if (!result) {
      result = text.match(new RegExp(`关闭(.*)(?=(?:[${Array.from(config.punctuationMark).join("|")}]?))`))
    }
    if (result && result.length >= 2 && !this.matchResult) {
      this.matchResult = result[1];
    }
    return !!this.matchResult;
  }

  async excute({
    sendMsg = function () { }
  }) {
    let widgets = null;
    if (this.matchResult == '所有') {
      return sendMsg(this.closeAllMenu());
    }
    if (this.matchResult == '当前') {
      return sendMsg(this.closeCurrentMenu());
    }
    widgets = this.getIsOneWdiget();
    if (!widgets) {
      widgets = this.getCompleteMenus();
    }
    if (!widgets) {
      return sendMsg('已打开菜单中没有查找到此菜单,请检查语音是否正确');
    }
    if (widgets.length == 1) {
      event.emit('event:closeMenuByName', widgets[0].name);
      return sendMsg(`关闭${widgets[0].name}菜单成功`);
    }
    this.data = {};
    this.data.type = 'widgets';
    this.data.widgets = widgets;
    return sendMsg(this.widgetsToMsg(widgets));
  }

  widgetsToMsg(widgets) {
    return `有以下${widgets.length}个菜单打开\n${widgets
      .map((widget, index) => `${index + 1}.${widget.name}`)
      .join('\n')},\n请语音确认一下关闭第几个菜单`;
  }

  closeAllMenu() {
    event.emit('event:closeAllMenu', true);
    return `成功关闭所有菜单`;
  }

  closeCurrentMenu() {
    const menus = this.getOpenedMenus();
    const menu = location.pathname.match(/\/civbase(.*)/);
    if (!menu || menu.length <= 1) {
      return '系统发生匹配错误';
    }
    const currentMenu = menus.find(item => item.location.pathname == decodeURI(menu[1]));
    if (!currentMenu) {
      return '系统发生异常';
    }
    const isHome = currentMenu.name == '首页';
    if (isHome) {
      return `当前菜单为首页,不能被关闭`;
    }
    event.emit('event:closeMenuByName', currentMenu.name);
    return `关闭${currentMenu.name}菜单成功`;
  }

  getCompleteMenus() {
    const widgets = this.getOpenedMenus();
    const reg = new RegExp(this.matchResult);
    const results = widgets.filter(i => reg.test(i.name));
    return results.length > 0 ? results : null;
  }

  getIsOneWdiget() {
    const widgets = this.getOpenedMenus();
    const widget = widgets.find(i => i.name == this.matchResult);
    return widget ? [widget] : null;
  }

  getOpenedMenus() {
    const menus = store.get('event:openedMenus');
    return Array.from(menus.current.values());
  }
}


export default CloseMenuDirective