import * as api from './api/api'
import LocleUtil from "./LocleUtil";

export function timeFix () {
  const time = new Date()
  const hour = time.getHours()
  return hour < 9 ? LocleUtil.getLocale('m.common.tip.morning1') : (hour <= 11 ? LocleUtil.getLocale('m.common.tip.morning2') : (hour <= 13 ? LocleUtil.getLocale('m.common.tip.afternoon1') : (hour < 20 ? LocleUtil.getLocale('m.common.tip.afternoon2') : LocleUtil.getLocale('m.common.tip.evening'))))
}

/**
 * 触发 window.resize
 */
export function triggerWindowResizeEvent () {
  let event = document.createEvent('HTMLEvents')
  event.initEvent('resize', true, true)
  event.eventType = 'message'
  window.dispatchEvent(event)
}

/**
 * 过滤对象中为空的属性
 * @param obj
 * @returns {*}
 */
export function filterObj (obj) {
  if (!(typeof obj == 'object')) {
    return
  }

  for (let key in obj) {
    if (obj.hasOwnProperty(key)
      && (obj[key] == null || obj[key] == undefined || obj[key] === '')) {
      delete obj[key]
    }
  }
  return obj
}

/**
 * 深度克隆对象、数组
 * @param obj 被克隆的对象
 * @return 克隆后的对象
 */
export function cloneObject (obj) {
  return JSON.parse(JSON.stringify(obj))
}

/**
 * 随机生成数字
 *
 * 示例：生成长度为 12 的随机数：randomNumber(12)
 * 示例：生成 3~23 之间的随机数：randomNumber(3, 23)
 *
 * @param1 最小值 | 长度
 * @param2 最大值
 * @return int 生成后的数字
 */
export function randomNumber () {
  // 生成 最小值 到 最大值 区间的随机数
  const random = (min, max) => {
    return Math.floor(Math.random() * (max - min + 1) + min)
  }
  if (arguments.length === 1) {
    let [length] = arguments
    // 生成指定长度的随机数字，首位一定不是 0
    let nums = [...Array(length).keys()].map((i) => (i > 0 ? random(0, 9) : random(1, 9)))
    return parseInt(nums.join(''))
  } else if (arguments.length >= 2) {
    let [min, max] = arguments
    return random(min, max)
  } else {
    return Number.NaN
  }
}

/**
 * 随机生成字符串
 * @param length 字符串的长度
 * @param chats 可选字符串区间（只会生成传入的字符串中的字符）
 * @return string 生成的字符串
 */
export function randomString (length, chats) {
  if (!length) length = 1
  if (!chats) chats = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
  let str = ''
  for (let i = 0; i < length; i++) {
    let num = randomNumber(0, chats.length - 1)
    str += chats[num]
  }
  return str
}

/**
 * 重复值验证工具方法
 *
 * 使用示例：
 * { validator: (rule, value, callback) => validateDuplicateValue('sys_fill_rule', 'rule_code', value, this.model.id, callback) }
 *
 * @param tableName 被验证的表名
 * @param fieldName 被验证的字段名
 * @param fieldVal 被验证的值
 * @param dataId 数据ID，可空
 * @param callback
 */
export function validateDuplicateValue (tableName, fieldName, fieldVal, dataId, callback) {
  if (fieldVal) {
    let params = { tableName, fieldName, fieldVal, dataId }
    api.duplicateCheck(params).then(res => {
      res['success'] ? callback() : callback(res['message'])
    }).catch(err => {
      callback(err.message || err)
    })
  } else {
    callback()
  }
}

/**
 * 根据编码校验规则code，校验传入的值是否合法
 *
 * 使用示例：
 * { validator: (rule, value, callback) => validateCheckRule('common', value, callback) }
 *
 * @param ruleCode 编码校验规则 code
 * @param value 被验证的值
 * @param callback
 */
export function validateCheckRule (ruleCode, value, callback) {
  if (ruleCode && value) {
    value = encodeURIComponent(value)
    api.checkRuleByCode({ ruleCode, value }).then(res => {
      res['success'] ? callback() : callback(res['message'])
    }).catch(err => {
      callback(err.message || err)
    })
  } else {
    callback()
  }
}

/**
 * 可用于判断是否成功
 * @type {symbol}
 */
export const succeedSymbol = Symbol()
/**
 * 可用于判断是否失败
 * @type {symbol}
 */
export const failedSymbol = Symbol()

/**
 * 使 promise 无论如何都会 resolve，除非传入的参数不是一个Promise对象或返回Promise对象的方法
 * 一般用在 Promise.all 中
 *
 * @param promise 可传Promise对象或返回Promise对象的方法
 * @returns {Promise<any>}
 */
export function alwaysResolve (promise) {
  return new Promise((resolve, reject) => {
    let p = promise
    if (typeof promise === 'function') {
      p = promise()
    }
    if (p instanceof Promise) {
      p.then(data => {
        resolve({ type: succeedSymbol, data })
      }).catch(error => {
        resolve({ type: failedSymbol, error })
      })
    } else {
      reject('alwaysResolve: 传入的参数不是一个Promise对象或返回Promise对象的方法')
    }
  })
}
export function copy(text, callback) {
  // 实现复制方法一：
  if (navigator.clipboard) {
    navigator.clipboard.writeText(text);
    callback && callback(true);
    return;
  }

  // 实现复制方法二：
  let copyInput = document.getElementById('copyInput');
  if (!copyInput) {
    let copyInput = document.createElement('input');
    copyInput.setAttribute('id', 'copyInput');
    copyInput.style.position = 'fixed';
    copyInput.style.left = '-100%';
    copyInput.style.top = '0';
    copyInput.style.zIndex = '-100';
    copyInput.style.opacity = '0';
    document.body.appendChild(copyInput);
  }
  copyInput.value = text;
  copyInput.focus();
  copyInput.select();

  // document.execCommand 可能会被废弃
  if (document.execCommand('copy')) {
    document.execCommand('copy');
  }

  copyInput.blur();

  callback && callback(true);
}
export function getScreenRatio() {
  var ratio=0;
  var screen=window.screen;
  var ua=navigator.userAgent.toLowerCase();

  if(window.devicePixelRatio !== undefined)  {
    ratio=window.devicePixelRatio;
  } else if(~ua.indexOf('msie')) {
    if(screen.deviceXDPI && screen.logicalXDPI) {
      ratio=screen.deviceXDPI/screen.logicalXDPI;
    }
  }
  else if(window.outerWidth !== undefined && window.innerWidth !== undefined) {
    ratio=window.outerWidth/window.innerWidth;
  }

  return ratio;
}
