import dayjs from 'dayjs';
import _Vue from 'vue';

export const PATTERN_DATETIME = 'YYYY-MM-DD HH:mm:ss';
export const PATTERN_DATE = 'YYYY-MM-DD';
export const PATTERN_TIME = 'HH:mm:ss';

/**
 * 对象数组去重
 * 传入数组 list 返回去重后的数组对象
 * @param list 数据
 * @param valueKey 去重的属性 valueKey
 */
export const removeDuplicates = (list: any, valueKey: string) => {
  const temp = {};
  let arr = [];
  arr = list.reduce(function (item, next) {
    temp[next[valueKey]] ? '' : (temp[next[valueKey]] = true && item.push(next));
    return item;
  }, []);
  return arr;
};

/**
 * 数据NULL处理
 * @param object 数据或对象
 * @param path 如果object传的是对象，path代表字段名称，支持 a.b.c 层级查询
 * @param defaultValue
 */

export const optional = (object: any, path: any, defaultValue: any) => {
  try {
    if (defaultValue === undefined) {
      defaultValue = path;
    } else if (path) {
      // this means path='a.b.c', object = object.a.b.c
      object = path.split('.').reduce((o: any, i: any) => o[i], object);
    }
  } catch (e) {
    console.warn(e.message);
  }
  return object || defaultValue;
};

/**
 * 数据脱敏 123456 => 12**56
 * @param data
 * @return {string}
 */
export const masking = (data: string) => {
  if (!data) return '****';
  let size = data.length / 2 - 1;
  if (size < 2) size = 2;
  const masking = '********************'.substring(0, size);
  const prefix = data.substring(0, (data.length - masking.length) / 2);
  const suffix = data.substring(prefix.length + masking.length, data.length);
  return prefix + masking + suffix;
};

/**
 * 日期格式化
 * @param object 日期或对象
 * @param path 如果object传的是对象，path代表字段名称，支持 a.b.c 层级查询
 * @return {string}
 */
export const date = (object: any, path: any) => {
  return format(object, path, PATTERN_DATE);
};

/**
 * 时间格式化
 * @param object 时间或对象
 * @param path 如果object传的是对象，path代表字段名称，支持 a.b.c 层级查询
 * @return {string}
 */
export const time = (object: any, path: any) => {
  return format(object, path, PATTERN_TIME);
};

/**
 * 日期时间格式化
 * @param object 日期时间或对象
 * @param path 如果object传的是对象，path代表字段名称，支持 a.b.c 层级查询
 * @return {string}
 */
export const datetime = (object: any, path: any) => {
  return format(object, path, PATTERN_DATETIME);
};

/**
 * 日期时间格式化
 * @param object 日期时间或对象
 * @param path 如果object传的是对象，path代表字段名称，支持 a.b.c 层级查询
 * @param pattern 格式
 * @return {string}
 */
export const format = (object: any, path: any, pattern: any) => {
  const date = optional(object, path, '');
  return date && dayjs(date).format(pattern);
};

/**
 * 保留N位小数格式化
 * @param object 数字或对象
 * @param path 如果object传的是对象，path代表字段名称，支持 a.b.c 层级查询
 * @param fractionDigits 保留N位小数
 */
export const fixed = (object: any, path: any, fractionDigits: any) => {
  if (fractionDigits === undefined) {
    fractionDigits = path;
    path = undefined;
  }
  return Number(optional(object, path, 0)).toFixed(fractionDigits);
};

/**
 * 金额格式化 0.00
 * @param object 数字或对象
 * @param path 如果object传的是对象，path代表字段名称，支持 a.b.c 层级查询
 */
export const money = (object: any, path: any) => {
  return fixed(object, path, 2);
};

/**
 * 距离格式化
 * @param object 数字或对象
 * @param path 如果object传的是对象，path代表字段名称，支持 a.b.c 层级查询
 */
export const distance = (object: any, path: any) => {
  return fixed(object, path, 2) + 'km';
};

/**
 * 返回静态资源路径处理方法
 * @param staticPath 静态资源路径前缀
 * @return {function(*=, *=): *}
 */
export const assets = (staticPath: any) => {
  /**
   * 静态资源路径处理
   * @param return.object 路径或对象
   * @param path 如果object传的是对象，path代表字段名称，支持 a.b.c 层级查询
   * @return {*}
   */
  return (object: any, path: any) => {
    const suffixPath = optional(object, path, '');
    if (!suffixPath || suffixPath.startsWith('http')) {
      return suffixPath;
    }
    return staticPath + suffixPath;
  };
};

export default {
  install(Vue: typeof _Vue): void {
    Vue.filter('optional', optional);
    Vue.filter('masking', masking);
    Vue.filter('date', date);
    Vue.filter('time', time);
    Vue.filter('datetime', datetime);
    Vue.filter('format', format);
    Vue.filter('fixed', fixed);
    Vue.filter('money', money);
    Vue.filter('distance', distance);
    Vue.filter('assets', assets(process.env.VUE_APP_STATIC_PATH));
  },
};
