import $n from '../util/nothing'
import $store from '../store'
import Enums from '../util/Enums'

/**
 * vuex Store 的 action 调用
 * @param {*} action 调用的action名
 * @param {*} params 参数
 */
export function _dispatch (action, params) {
  return $store.dispatch(action, params)
}
/**
 * vuex Store 的 getters 引用
 * @param {*} getters Store中引用的getters属性名
 * @param {*} defaultValue 默认值(结果为空时)
 */
export  function  _getters (getters, defaultValue = null) {
  return $n._ifNull($store.getters[getters], defaultValue)
}
/**
 * 基于Promise调用API
 * @param {*}
 */
export function _callAPI ({callFun = Function, callParams = [], callBack, resultType = Enums.DataType.JSON} = {}) {
  return new Promise((resolve, reject) => {
    callFun(...callParams).then(({ code, count, data, per_page, msg}) => {
      if (code === 0) {
        data = $n._caseValue(
          resultType,
          Enums.DataType.JSON, $n._ifNull(data, {}),
          Enums.DataType.ARRAY, $n._ifNull(data, []),
          Enums.DataType.DATE, $n._isNotNull(data) ? new Date(data) : null,
          Enums.DataType.STRING, $n._ifNull(data, null),
          Enums.DataType.NUMBER, Number($n._ifNull(data, 0)),
          data
        )
        if (callBack) callBack(data)
        resolve(data)
      } else throw {code:code,data:data,msg:msg} || '执行 [' + callFun.name + '] 发生未知错误.'
    }).catch(err => reject(err))
  })
}

/**
 * 基于Promise调用API
 * @param {*}
 */
// export function _callAPIone ({callFun = Function, callParams = [], callBack, resultType = Enums.DataType.JSON} = {}) {
//   return new Promise((resolve, reject) => {
//     callFun(...callParams).then(({ code, count, data, per_page, msg,total}) => {
//       if (code === 0) {
//         data = $n._caseValue(
//           resultType,
//           Enums.DataType.JSON, $n._ifNull(data, {}),
//           Enums.DataType.ARRAY, $n._ifNull(data, []),
//           Enums.DataType.DATE, $n._isNotNull(data) ? new Date(data) : null,
//           Enums.DataType.STRING, $n._ifNull(data, null),
//           Enums.DataType.NUMBER, Number($n._ifNull(data, 0)),
// 		  code,
//           data,
// 		  count,
// 		  per_page,
// 		  msg,
// 		  total
//         )
//         if (callBack) callBack({code:code,count:count,data:data,per_page:per_page,msg:msg,total:total})
//         resolve({code:code,count:count,data:data,per_page:per_page,msg:msg,total:total})
//       } else throw {code:code,data:data,msg:msg} || '执行 [' + callFun.name + '] 发生未知错误.'
//     }).catch(err => reject(err))
//   })
// }

/**
 * 查询
 * @param {*}
 */
export function _query ({api, params, callBack, resultType = Enums.DataType.JSON} = {}) {
  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
}


/**
 * 修改
 * @param {*}
 */
export function _update ({api, params, callBack, resultType = Enums.DataType.JSON} = {}) {
  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
}
/**
 * 保存
 * @param {*}
 */
export function _save ({api, params, callBack, resultType = Enums.DataType.JSON} = {}) {
  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
}
/**
 * 删除
 * @param {*}
 */
export function _delete ({api, params, callBack, resultType = Enums.DataType.JSON} = {}) {
  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
}
/**
 * 调用动作
 * @param {*}
 */
export function _callAction ({api, params, callBack, resultType = Enums.DataType.JSON, action = null} = {}) {
  console.warn('############# Action: ', action)
  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
}
/**
 * 列表查询
 * @param {*}
 */
export function _queryList ({api, params, callBack, resultType = Enums.DataType.ARRAY} = {}) {
  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
}
/**
 * 分页查询
 * @param {*}
 */
export function _queryPage ({api, params, page, callBack, resultType = Enums.DataType.JSON} = {}) {
  return _callAPI({callFun: api, callParams: [params, page], callBack, resultType})
}
/**
 * 流式分页查询
 * @param {*}
 */
export function _queryFlowPage ({api, params, page, callBack, resultType = Enums.DataType.JSON} = {}) {
  return _callAPI({callFun: api, callParams: [params, page], callBack, resultType})
}