import * as dd from 'dingtalk-jsapi'
import axios from 'axios'
import qs from 'qs'
import { MINGPAY_CONSTANT } from './constant'
const config = {
  ddconfig: () => {
    return new Promise((resolve, reject) => {
      let senddate = qs.stringify({
        version: MINGPAY_CONSTANT.MINGPAY_CONSTANT_VERSION,
        url: MINGPAY_CONSTANT.MINGPAY_CONSTANT_URL,
        agentId: MINGPAY_CONSTANT.MINGPAY_CONSTANT_AGENTID
      })
      return axios.post(`http://139.196.213.18:8300/v1/auth/getJsAuthenticationParameter?${senddate}`).then((res) => {
        let agentId = res.data.data.agentId
        let timeStamp = res.data.data.timeStamp
        let nonceStr = res.data.data.nonceStr
        let signature = res.data.data.signature
        sessionStorage.setItem('corpId', res.data.data.corpId)
        dd.config({
          agentId: agentId, // 必填,微应用ID
          corpId: sessionStorage.getItem('corpId'), // 必填,企业ID
          timeStamp: timeStamp, // 必填,生成签名的时间戳
          nonceStr: nonceStr, // 必填,生成签名的随机串
          signature: signature, // 必填,签名
          type: 0, // 0/1选填。0表示微应用的jsapi,1表示服务窗的jsapi;不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持
          jsApiList: [
            'biz.contact.choose',
            'biz.contact.complexPicker'
          ] // 必填,需要使用的jsapi列表,注意:不要带dd。
        })
        dd.error(function (error) {
          console.log('dd error: ' + JSON.stringify(error))
          resolve('no')
        })
        setTimeout(() => {
          resolve()
        }, 2000)
      })
    })
  },
  ddready: (item) => {
    return new Promise((resolve, reject) => {
      dd.ready(function () {
        return resolve(config[item]())
      })
    })
  },
  ddpermission: () => {
    // dd.ready参数为回调函数,在环境准备就绪时触发,jsapi的调用需要保证在该回调函数触发后调用,否则无效。
    return new Promise((resolve, reject) => {
      dd.runtime.permission.requestAuthCode({
        corpId: sessionStorage.getItem('corpId'), // 企业id
        onSuccess: function (info) {
          let senddate = qs.stringify({
            version: 'v1',
            code: info.code,
            corpId: 'ding9a93ca550f036ffe35c2f4657eb6378f'
          })
          return axios.post(`http://139.196.213.18:8300/v1/auth/token?${senddate}`).then((res) => {
            if (res.data.resultCode === '0') {
              sessionStorage.setItem('token', res.data.data.accessToken.access_token)
              sessionStorage.setItem('userId', res.data.data.oapiUser.userid)
              sessionStorage.setItem('avatar', res.data.data.oapiUser.avatar)
              sessionStorage.setItem('name', res.data.data.oapiUser.name)
              resolve('ok')
            } else {
              resolve('noPermission')
            }
          }).catch((err) => {
            console.log(err)
          })
        }
      })
    })
  },
  ddchooseOne: () => {
    return new Promise((resolve, reject) => {
      dd.biz.contact.choose({
        multiple: false, // 是否多选:true多选 false单选; 默认true
        users: [], // 默认选中的用户列表,员工userid;成功回调中应包含该信息
        corpId: sessionStorage.getItem('corpId'), // 企业id
        max: 1, // 人数限制,当multiple为true才生效,可选范围1-1500
        onSuccess: function (data) {
          return resolve(data)
        },
        onFail: function (err) {
          return reject(err)
        }
      })
    })
  },
  ddchoose: () => {
    return new Promise((resolve, reject) => {
      dd.biz.contact.complexPicker({
        title: '人员选择', // 标题
        corpId: sessionStorage.getItem('corpId'), // 企业的corpId
        multiple: true, // 是否多选
        limitTips: '超出了', // 超过限定人数返回提示
        maxUsers: 1000, // 最大可选人数
        pickedUsers: [], // 已选用户
        pickedDepartments: [], // 已选部门
        disabledUsers: [], // 不可选用户
        disabledDepartments: [], // 不可选部门
        requiredUsers: [], // 必选用户(不可取消选中状态)
        requiredDepartments: [], // 必选部门(不可取消选中状态)
        appId: 246391838, // 微应用的Id
        permissionType: 'GLOBAL', // 可添加权限校验,选人权限,目前只有GLOBAL这个参数
        responseUserOnly: false, // 返回人,或者返回人和部门
        startWithDepartmentId: -1, // 仅支持0和-1
        onSuccess: function (result) {
          return resolve(result)
        },
        onFail: function (err) {
          return reject(err)
        }
      })
    })
  }
}

export { config }