import { DisplayPosition } from '@/type/display-position';
import lt from 'lodash/lt';
import lte from 'lodash/lte';
import eq from 'lodash/eq';
import _includes from 'lodash/includes';

export const __formValue__ = '__formValue__';
export const __filterValue__ = '__filterValue__';
export const __tableCurrentRow__ = '__tableCurrentRow__';
export const __dataSource__ = '__dataSource__';
export const __arrayTableCurrentRow__ = '__arrayTableCurrentRow__';
export const __arrayTableCurrentRowIndex__ = '__arrayTableCurrentRowIndex__';
export const __selectedRowKeys__ = '__selectedRowKeys__';
export const __selectedRowRecords__ = '__selectedRowRecords__';
export const __totalCount__ = '__totalCount__';
export const __tableExtra__ = '__tableExtra__';
// 当前第几步
export const __step_current__ = '__step_current__';
export const __step_list__ = '__step_list__';
export const __step_activeKey__ = '__step_activeKey__';
// 当前步骤详细信息
export const __step_currentItem__ = '__step_currentItem__';
export const __paging__ = '__paging__';
export const __tableData__ = '__tableData__';
export const __tableColumns__ = '__tableColumns__';
export const __flowData__ = '__flowData__';
export const __tab_activeKey__ = '__tab_activeKey__';
// 左树当前选中的值
export const __left_tree_currentValue__ = '__left_tree_currentValue__';
// 左树当前选中的项
export const __left_tree_currentItem__ = '__left_tree_currentItem__';
// 列表当前点击的行
export const __list_currentItem__ = '__list_currentItem__';
// 列表当前点击的行的索引
export const __list_activeKey__ = '__list_activeKey__';

// 公共参数
export const __extraParam__ = '__extraParam__';
// 挂到valueOf上的属性间填充符号
export const __stateValueOfSplit__ = '.';
export const openDialogModeLabel = '弹窗表单本次打开的用途';
export const formDialogStateLabel = '[当前弹窗表单的状态信息]';
export const formStateLabel = '[当前表单的状态信息]';
export const tableCurrentRowLabel = '点击的当前行数据';
export const currentPageLabel = '表格当前点击的页码(currentPage)';
export const pageSizeLabel = '表格当前一页展示几条(pageSize)';
export const currentFormCardLabel = '当前卡片的数据';
export const currentFormStepLabel = '分步表单-当前是第几步';
export const leftTreeStateLabel = '当前树的信息';
export const leftTreeAfterDropDataSourceLabel =
  '拖拽后树的完整数据（dataSource）';
// 分步表单当前第几步
export const __form_step_current__ = '__form_step_current__';
export const componentRefSplit = '_$ref$_';

export function getFormExprNameByPosition(config) {
  const { position } = config;
  let result;
  switch (position) {
    case DisplayPosition.filter:
      result = __filterValue__;
      break;
    case DisplayPosition.form:
    case DisplayPosition.cnArrayTable:
    case DisplayPosition.formDialog:
      result = __formValue__;
      break;
    default:
      result = __formValue__;
  }
  return result;
}

function equal(a, b, config) {
  const { type } = config || {};
  if (type === 'array') {
    return (
      a === undefined ||
      a === null ||
      a === '' ||
      (Array.isArray(a) && a.length === 0)
    );
  } else {
    if (b === undefined || b === null || b === '') {
      if (a === 0 || a === false) {
        return false;
      } else {
        return !a;
      }
    } else {
      return eq(a, b);
    }
  }
}
function notEqual(a, b, config) {
  const { type } = config || {};
  if (type === 'array') {
    return Array.isArray(a) && a.length > 0;
  } else {
    if (b === undefined || b === null || b === '') {
      if (a === 0 || a === false) {
        return true;
      } else {
        return !!a;
      }
    } else {
      return !eq(a, b);
    }
  }
}

function includes(a, b, config) {
  const { type } = config || {};
  return _includes(a, b);
}
function notIncludes(a, b, config) {
  const { type } = config || {};
  return !_includes(a, b);
}

export const symbolMap = {
  '<': lt,
  '<=': lte,
  '>': function (a, b) {
    return a > b;
  },
  '>=': function (a, b) {
    return a >= b;
  },
  '==': equal,
  '=': equal,
  '===': equal,
  '!=': notEqual,
  includes,
  notIncludes,
};

export const compareList = [
  {
    label: '大于',
    value: '>',
  },
  {
    label: '大于等于',
    value: '>=',
  },
  {
    label: '小于',
    value: '<',
  },
  {
    label: '小于等于',
    value: '<=',
  },
];

export const compareMap = {};
compareList.forEach((item) => {
  const { label, value } = item || {};
  compareMap[value] = label;
});

export const timeUnitList = [
  {
    label: '天',
    value: 'day',
  },
  {
    label: '周',
    value: 'week',
  },
  {
    label: '月',
    value: 'month',
  },
  {
    label: '年',
    value: 'year',
  },
];

export const timeUnitList2 = [
  {
    label: '秒',
    value: 'second',
  },
  {
    label: '分钟',
    value: 'minute',
  },
  {
    label: '小时',
    value: 'hour',
  },
];

export const timeUnitMap = {};
timeUnitList.forEach((item) => {
  const { label, value } = item || {};
  timeUnitMap[value] = label;
});
timeUnitList2.forEach((item) => {
  const { label, value } = item || {};
  timeUnitMap[value] = label;
});
export const timeMillisecondMap = {
  hour: 3600000,
  minute: 60000,
  second: 1000,
};

export const getCommonBoolDataSource = () => {
  return [
    {
      label: '是',
      value: true,
    },
    {
      label: '否',
      value: false,
    },
  ];
};

export function getOpenDialogModeEnum(config) {
  const { prefix = '', suffix = '' } = config || {};
  return [
    {
      label: `${prefix}新增${suffix}`,
      value: 'new',
    },
    {
      label: `${prefix}编辑${suffix}`,
      value: 'edit',
    },
    {
      label: `${prefix}详情${suffix}`,
      value: 'detail',
    },
  ];
}
