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

class CloseMenuDirective extends BaseDirective {
  static name = '关闭菜单或者模糊匹配关闭菜单';

  match() {
    const { text } = this;
    let result = null;

    if (this.getBeforeLastGroupDirective()) {
      result = text.match(/第([一|二|三|四|五|六|七|八|九|十]+)个/);
      if (result && result.length >= 2) {
        this.matchResult = Utils.chineseToNumber(result[1]);
      } else if (!result) {
        result = text.match(/第[\u4e00-\u9fa5]?(\d+)个/);
        if (result && result.length >= 2) {
          this.matchResult = Number(result[1]);
        }
      }
    }
    result = text.match(/关闭(所有).*(?=(?:,|,|。))/);
    if (!result) {
      result = text.match(/关闭(当前).*(?=(?:,|,|。))/);
    }
    if (!result) {
      result = text.match(/关闭(.*)(?=(?:菜单|功能|路径))/);
    }
    if (!result) {
      result = text.match(/关闭(.*)(?=(?:,|,|。))/);
    }
    if (result && result.length >= 2 && !this.matchResult) {
      this.matchResult = result[1];
    }
    return !!this.matchResult;
  }

  getBeforeLastGroupDirective() {
    const lastMenu = this.directives.at(-1);
    if (!lastMenu) return false;
    if (!(lastMenu instanceof CloseMenuDirective)) return false;
    if (!lastMenu.data || lastMenu.data.type != 'widgets' || lastMenu.data.widgets.length == 0) return false;
    return true;
  }

  async excute() {
    let widgets = null;
    if (typeof this.matchResult === 'number') {
      const widgets = this.getOpenedMenus();
      if (this.matchResult == 0 || this.matchResult > widgets.length) {
        this.data = {};
        this.data.type = 'widgets';
        this.data.widgets = widgets;
        return `索引超出了界限,请重新语音选择关闭第几个菜单`;
      }
      const menu = widgets[this.matchResult];
      event.emit('event:closeMenuByName', menu.name);
      return `关闭${menu.name}菜单成功`;
    }
    if (this.matchResult == '所有') {
      return this.closeAllMenu();
    }
    if (this.matchResult == '当前') {
      return this.closeCurrentMenu();
    }
    widgets = this.getIsOneWdiget();
    if (!widgets) {
      widgets = this.getCompleteMenus();
    }
    if (!widgets) {
      return '已打开菜单中没有查找到此菜单,请检查语音是否正确';
    }
    if (widgets.length == 1) {
      event.emit('event:closeMenuByName', widgets[0].name);
      return `关闭${widgets[0].name}菜单成功`;
    }
    this.data = {};
    this.data.type = 'widgets';
    this.data.widgets = widgets;
    return 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() {
    console.log(store);
    console.log(window.location);
    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;