import _typeof from 'babel-runtime/helpers/typeof';
/**
 * @文件说明: 定义函数方法的工具类
 * @创建人: pjtools@vip.qq.com
 * @创建时间: 2020-03-11 22:23:05
 */

import { isArray as isAntdArray, isInteger as isAntdInteger, isFunction as isAntdFunction, has as antdHas } from 'ant-design-vue/es/_util/vue-types/utils';

/**
 * 获取转换的前缀ClassName名称
 * @param {string} suffixCls 前缀Class名
 * @param {string} customizePrefixCls 自定义前缀Class名
 */
export var getPrefixCls = function getPrefixCls(suffixCls, customizePrefixCls) {
  if (customizePrefixCls) return customizePrefixCls;
  return 'pjtools-' + suffixCls;
};

/**
 * 判断是否为字符串类型
 * @param {string} value 待判断的值
 */
export var isString = function isString(value) {
  return !!(typeof value === 'string');
};

/**
 * 判断是否为数值（包括：字符串型数值）
 * @param {number} value 待判断的数值
 */
export var isNumeric = function isNumeric(value) {
  return !isNaN(parseFloat(value)) && isFinite(value);
};

/**
 * 判断是否为Function型函数
 * @param {function} value 待判断的对象
 */
export var isFunction = isAntdFunction;

/**
 * 判断是否为Array数组类型
 * @param {array} value 待判断的对象
 */
export var isArray = isAntdArray;

/**
 * 判断是否为非零长度的Array数组类型
 * @param {array} value 待判断的对象
 */
export var isNotEmptyArray = function isNotEmptyArray(value) {
  return !!(isArray(value) && value.length);
};

/**
 * 判断是否为Boolean布尔类型
 * @param {boolean} value 待判断的对象
 */
export var isBoolean = function isBoolean(value) {
  return typeof value === 'boolean';
};

/**
 * 判断是否为布尔类型的True值
 * @param {boolean} value 待判断的对象
 */
export var isBooleanTrue = function isBooleanTrue(value) {
  return !!(isBoolean(value) && value === true);
};

/**
 * 判断是否为布尔类型的False值
 * @param {boolean} value 待判断的对象
 */
export var isBooleanFlase = function isBooleanFlase(value) {
  return !!(isBoolean(value) && value === false);
};

/**
 * 判断是否为Integer整数类型
 * @param {number} value 待判断的对象
 */
export var isInteger = isAntdInteger;

/**
 * 判断是否为空值，其中：undefined， null，''， NaN，false，[]，{}，不包括数值0
 * @param {any} value 待判断的对象
 */
export var isEmpty = function isEmpty(value) {
  switch (typeof value === 'undefined' ? 'undefined' : _typeof(value)) {
    case 'undefined':
      return true;
    case 'string':
      if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length === 0) {
        return true;
      }
      break;
    case 'boolean':
      if (!value) {
        return true;
      }
      break;
    case 'number':
      if (isNaN(value)) {
        return true;
      }
      break;
    case 'object':
      if (null === value || value.length === 0) {
        return true;
      }
      for (var i in value) {
        return false;
      }
      return true;
  }
  return false;
};

/**
 * 判断Object对象是否存在属性名
 * @param {number} obj Object对象
 * @param {string} prop 待检查的属性名
 */
export var has = antdHas;

/**
 * 判断是否为Http形式的链接地址
 * @param {string} value 待检查的链接地址
 */
export var isHttpUrl = function isHttpUrl(value) {
  var reg = new RegExp('(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]');
  return reg.test(value);
};

/**
 * 判断是否为地图Map的坐标数组结构
 * @param {string} value 待检查的地理坐标
 */
export var isCoordinate = function isCoordinate(value) {
  if (value && isArray(value) && value.length === 2) {
    if (typeof value[0] === 'number' && typeof value[1] === 'number') {
      if (value[0] === 0 && value[1] === 0) {
        return false;
      }
      return true;
    }
  }
  return false;
};

/**
 * 判断DOM对象上是否存在Class类名
 * @param {Element} node DOM对象
 * @param {string} className 待判断的ClassName
 */
export var hasClass = function hasClass(node, className) {
  if (node.classList) {
    return node.classList.contains(className);
  }
  var originClass = node.className;
  return (' ' + originClass + ' ').indexOf(' ' + className + ' ') > -1;
};

/**
 * 在DOM对象上添加Class类名
 * @param {Element} node DOM对象
 * @param {string} className 待添加的ClassName名
 */
export var addClass = function addClass(node, className) {
  if (node.classList) {
    node.classList.add(className);
  } else {
    if (!hasClass(node, className)) {
      node.className = node.className + ' ' + className;
    }
  }
};

/**
 * 在DOM对象上移除Class类名
 * @param {Element} node DOM对象
 * @param {string} className 待移除的ClassName名
 */
export var removeClass = function removeClass(node, className) {
  if (node.classList) {
    node.classList.remove(className);
  } else {
    if (hasClass(node, className)) {
      var originClass = node.className;
      node.className = (' ' + originClass + ' ').replace(' ' + className + ' ', ' ');
    }
  }
};

/**
 * 将相对路径地址转换成绝对路径地址
 * @param {string} url 待转换的相对路径
 * @param {string} prefix 前缀路径
 */
export var getUrlToLink = function getUrlToLink(url) {
  var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;

  if (prefix) {
    url = prefix + '/' + url;
  }
  url = url.replace(/\/\/\//g, '/').replace(/\/\//g, '/');
  // 借助浏览器等链接能力辅助转化
  var link = document.createElement('a');
  link.href = url;
  return link.href;
};

/**
 * 通过异步Fetch请求JS文件，读取文件流并解析
 * @param {string} url 待请求的JS文件路径地址
 */
export var fetchJsFile = function fetchJsFile(url) {
  return new Promise(function (resolve, reject) {
    fetch(url, {
      method: 'GET'
    }).then(function (response) {
      response && response.text().then(function (data) {
        try {
          var json = null;
          // 判断文件后缀是否为JSON文件后缀
          var fileUrl = url.split('?')[0];
          if (/.json$/.test(fileUrl)) {
            json = data && JSON.parse(data);
          } else {
            json = data && eval(data);
          }
          resolve(json);
        } catch (e) {
          resolve(null);
        }
      });
    })['catch'](function (error) {
      reject(error);
    });
  });
};

/**
 * 通过GET异步Fetch请求JSON数据
 * @param {string} url 待请求的地址
 */
export var fetchGetJson = function fetchGetJson(url) {
  return new Promise(function (resolve, reject) {
    fetch(url, {
      method: 'GET'
    }).then(function (response) {
      response && response.json().then(function (data) {
        resolve(data);
      })['catch'](function (error) {
        reject(error);
      });
    })['catch'](function (error) {
      reject(error);
    });
  });
};

/**
 * 通过POST异步Fetch请求JSON数据
 * @param {string} url 待请求的地址
 */
export var fetchPostJson = function fetchPostJson(url) {
  var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

  return new Promise(function (resolve, reject) {
    var formdata = '';
    Object.keys(data).map(function (key, idx) {
      if (idx !== 0) {
        formdata += '&';
      }
      formdata += encodeURIComponent(key) + '=' + (_typeof(data[key]) === 'object' ? JSON.stringify(data[key]) : data[key]);
    });

    fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
      },
      body: formdata
    }).then(function (response) {
      response && response.json().then(function (data) {
        resolve(data);
      })['catch'](function (error) {
        reject(error);
      });
    })['catch'](function (error) {
      reject(error);
    });
  });
};