import NP from 'number-precision'
import API from '@/api'
import { showError } from '@/util/util.js'
import { getNetwork } from '@/util/contract.js'
import Eos from 'eosjs'

export const actions = {
  setScatter: ({ commit }, scatter) => commit('setScatter', scatter),
  setEos: ({ commit }, eosjs) => commit('setEos', eosjs),
  setAccount: ({ commit }, account) => commit('setAccount', account),
  /**
   * 调起授权登录
	 * @param {Object} store
	 * @param {Object} params
   */
  async doScatterLogin ({ dispatch, commit, state }, params) {
    if (!state.scatter) {
      showError('Please install the scatter', 'Scatter')
    } else {
      // 获取最快主网
      let networkConfig = getNetwork()

      // 调用getIdentity方法获取用户名
      try {
        var identity = await state.scatter.getIdentity({
          accounts: [networkConfig]
        })
      } catch (error) {
        showError(error.message)
        return Promise.reject(error)
      }
      console.log(identity)
      let accounts = identity.accounts.find(x => x.blockchain === 'eos')

      commit('setAccount', accounts)

      // 如果当前登录的用户名和cookie中保存的account不一致
      // 则删除cookie中保存的account
      // 避免某些用户在移动端钱包中切换账号时跳过注销流程导致账号不一致的问题
      // if (Cookie.getCookie('account') !== accounts.name) {
      //   Cookie.delCookie('account')
      // }

      // 设置全局EOS对象
      window.EOS = state.scatter.eos(networkConfig, Eos, {})

      // 调用scatter登录成功后获取用户EOS、GT
      // dispatch('getUserEOS')
      // dispatch('getUserGT')
      await dispatch('getAccount')

      // 每分钟刷新一次
      // this.limitTimer = setInterval(() => {
      //   dispatch('getAccount')
      // }, 60000)

      return Promise.resolve()
    }
  },

  /**
   * 注销当前scatter账号
	 * @param {Object} store
	 * @param {Object} params
   */
  doScatterLoginOut ({ commit, state }, params) {
    // Cookie.delCookie('user_id')
    // Cookie.delCookie('token')
    localStorage.removeItem('user_id')
    localStorage.removeItem('token')

    state.scatter && state.scatter.forgetIdentity()

    commit('setAccount', '')
  },

  /**
   * 更新用户EOS币数量
	 * @param {Object} store
	 * @param {Object} params
   */
  getUserEOS ({ dispatch, commit, state }, params) {
    return new Promise((resolve, reject) => {
      window.EOS.getCurrencyBalance('eosio.token', state.account.name, 'EOS').then(([ balance ]) => {
        let balanceNum = Number(balance.replace(/\sEOS/, '')).toFixed(4)

        balanceNum = NP.times(balanceNum, 10000)

        commit('setBalance', balanceNum)
        commit('setEOSError', 0)

        resolve()
      }).catch(error => {
        // 失败重新尝试，最大尝试5次
        commit('setEOSError', state.eosErrorCount + 1)

        if (state.eosErrorCount <= 5) {
          setTimeout(() => {
            dispatch('getUserEOS')
          }, 1000 * state.eosErrorCount)
        }

        reject(error)
      })
    })
  },
  /**
   * 获取用户信息
	 * @param {Object} store
	 * @param {Object} params
   */
  getAccount ({ commit, state }, params) {
    return new Promise((resolve, reject) => {
      window.EOS.getAccount(state.account.name).then(data => {
        // 设置公钥
        const perms = JSON.parse(JSON.stringify(data.permissions))
        perms.forEach(v => {
          if (v.perm_name === 'active') {
            let publicKey = v.required_auth.keys[0].key
            commit('setPublicKey', publicKey)
          }
        })
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  },

  /**
   * 进行验证身份登录，生成业务登录态token
	 * @param {Object} store
	 * @param {Object} params
   */
  async doGameLogin ({ dispatch, commit, state }, params) {
    if (localStorage.getItem('user_id') && localStorage.getItem('token')) {
      commit('setUserId', localStorage.getItem('user_id'))
      commit('setToken', localStorage.getItem('token'))
      return Promise.resolve()
    } else {
      let rData = await API.user.getRandom({ account: state.account.name })
      let random = rData.data.data
      let pubkey = state.publicKey

      return new Promise((resolve, reject) => {
        state.scatter.getArbitrarySignature(pubkey, random, 'Need Login').then(sign => {
          let param = {
            account: state.account.name,
            sign,
            pubkey,
            data: random
          }

          API.user.eosLogin(param).then(({ data }) => {
            if (data.result === 1) {
              let userId = data.data.user_id
              let token = data.data.token
              localStorage.setItem('user_id', userId)
              localStorage.setItem('token', token)

              commit('setUserId', userId)
              commit('setToken', token)

              resolve(data)
            } else {
              reject(new Error(data.msg))
            }
          })
        }).catch(error => {
          reject(error)
        })
      })
    }
  },
  /**
   * 登录态过期，清除当前登录态相关数据，重新调起登录
	 * @param {Object} store
	 * @param {Object} params
   */
  resetGameLogin ({ dispatch, commit, state }, params) {
    localStorage.removeItem('user_id')
    localStorage.removeItem('token')
    dispatch('doGameLogin')
  }
}
