/**
 * 数据定义工具类
 */
const DataUtils = {
  /**
   * 定义空对象作为默认值
   * @type {Object}
   */
  OBJECT_EMPTY: Object.freeze({}),

  /**
   * 未定义值
   * @type {Number}
   */
  VALUE_UNDEF: -99999.0,

  /**
   * 值精度
   * @type {Number}
   */
  VALUE_DEVIATE: 0.0000001,

  PI: Math.PI,
  FACTOR_RAD: Math.PI / 180.0, // 弧度与度的比例因子
  FACTOR_DEG: 180.0 / Math.PI, // 度与弧度的比例因子

  /**
   * 返回默认参数
   *
   * @function
   *
   * @param {*} a
   * @param {*} b
   * @returns {*} 如果第一个参数不是undefined，返回第一个，否则返回第二个参数
   */
  default(a, b) {
    return this.isDef(a) ? a : b;
  },

  /**
   * 创建UUID
   *
   * @returns {String}
   */
  uuid() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
      let r = (Math.random() * 16 | 0)
      let v = c == 'x' ? r : (r&0x3 | 0x8);

      return v.toString(16);
    });
  },

  /**
   * 判断参数是否定义
   *
   * @function
   *
   * @param {*} v
   * @returns {Boolean} true-对象是定义的，false-对象未定义
   */
  isDef(v) {
    return v !== undefined && v !== null;
  },

  /**
   * 判断值是否定义
   */
  isValDef(val) {
    return this.isDef(val) &&
      val instanceof Number &&
      val !== this.VALUE_UNDEF;
  },

  /**
   * 克隆对象
   *  @param {Object} obj
   *
   * @returns {Object}
   */
  clone(obj) {
    if (!obj) return null;

    if (obj.constructor === Date) return new Date(obj);
    if (obj.constructor === RegExp) return new RegExp(obj);
    if (obj.constructor !== Object) return obj;

    let newObj = new obj.constructor();
    for (let key in obj) {
      let val = obj[key];
      //newObj[key] = typeof val === 'object' ? arguments.callee(val) : val;
      newObj[key] = val;
    }

    return newObj;
  },

  /**
   * 格式化日期/时间
   * @param {String|Date} d -日期(时间)
   * @param {String} pattern -格式
   *
   * @returns {String}
   */
  formatDt(d, pattern) {
    if (!d) return "";

		if (typeof d != "object") {
			if (/[TZ]/.test(d) == false && /[-]/.test(d)) {
				// 考虑到浏览器兼容性问题，将yyyy-MM-dd转换成yyyy/MM/dd的格式再进行new Date
				d = d.replace(/-/g, '/');
			}
			d = new Date(d);
		}
		pattern = pattern || 'yyyy-MM-dd';

		var y = d.getFullYear().toString(),
			o = {
				M: d.getMonth() + 1,
				d: d.getDate(),
				h: d.getHours(),
				m: d.getMinutes(),
				s: d.getSeconds()
			};
		pattern = pattern.replace(/(y+)/ig, function (a, b) {
			return y.substr(4 - Math.min(4, b.length));
		});
		for (var i in o) {
			pattern = pattern.replace(new RegExp('(' + i + '+)', 'g'), function (a, b) {
				return (o[i] < 10 && b.length > 1) ? '0' + o[i] : o[i];
			});
		}

		return pattern;
  }
};

export default DataUtils;
