import Vue from 'vue'
import { login, getLoginUser, logout } from '@/api/modular/system/loginManage'
import { sysDictTypeTree } from '@/api/modular/system/dictManage'
import { sysMenuChange } from '@/api/modular/system/menuManage'
import { GetClientData, GetConfigInfo } from '@/api/modular/main/systeminfo'
// eslint-disable-next-line no-unused-vars
import { ACCESS_TOKEN, ALL_APPS_MENU, DICT_TYPE_TREE_DATA, NOTICE_RECEIVED } from '@/store/mutation-types'
import { sysFileInfoPreview } from '@/api/modular/system/fileManage'
import {
  unReadNotice
} from '@/api/modular/system/noticeReceivedManage'

import { welcome, dateFormat } from '@/utils/util'
import store from '../index'
import router from '../../router'

const user = {
  state: {
    token: '',
    name: '',
    welcome: '',
    avatar: '',
    buttons: [], // 按钮权限
    allButtons: [], // 所有按钮权限
    alldevicetypes: [], // 所有设备类型
    allconfig: {}, // 配置信息
    clientdata: {}, // 枚举值
    admintype: '', // 是否是超管
    roles: [],
    info: {},
    notices: [] // 接收的通知公告
  },

  mutations: {
    SET_TOKEN: (state, token) => {
      state.token = token
    },
    SET_NAME: (state, { name, welcome }) => {
      state.name = name
      state.welcome = welcome
    },
    SET_AVATAR: (state, avatar) => {
      state.avatar = avatar
    },
    SET_ROLES: (state, roles) => {
      state.roles = roles
    },
    SET_INFO: (state, info) => {
      state.info = info
    },
    SET_BUTTONS: (state, buttons) => {
      state.buttons = buttons
    },
    SET_ALL_BUTTONS: (state, allButtons) => {
      state.allButtons = allButtons
    },
    SET_ADMINTYPE: (state, admintype) => {
      state.admintype = admintype
    },
    // 设置设备类型
    SET_DEVICETYPE: (state, alltypes) => {
      state.alldevicetypes = alltypes
    },
    // 设置配置信息
    SET_CONFIGINFO: (state, allconfig) => {
      state.allconfig = allconfig
    },
    // 设置枚举
    SET_CLIENTDATA: (state, data) => {
      state.clientdata = data
    },
    SET_NOTICES: (state, notices) => {
      state.notices = notices
    },
    APPEND_NOTICE: (state, notice) => {
      notice.publicTime = dateFormat(notice.publicTime, 'YYYY-mm-dd HH:MM:SS')
      const notices = state.notices
      const temp = notices.rows.filter(m => { return m.value === notice.type })[0]
      const other = notices.rows.filter(m => { return m.value !== notice.type })
      temp.noticeData.unshift(notice)
      notices.totalrows++
      if (temp.noticeData.length > 6) {
        temp.noticeData.pop()
      }
      notices.rows = []
      notices.rows.push(temp)
      notices.rows.push.apply(notices.rows, other)
      notices.rows.sort((obj1, obj2) => {
        return obj1.index - obj2.index
      })
      state.notices = notices
    },
    SUBTRACT_NOTICE: (state, notice) => {
      // 查看通知后在消息提示中消除已经查看过的，此函数 可能 存在未知bug
      // notice.publicTime = dateFormat(notice.publicTime, 'YYYY-mm-dd HH:MM:SS')
      const notices = state.notices
      // debugger
      const temp = notices.rows.filter(m => { return m.value === notice.type })[0]
      const other = notices.rows.filter(m => { return m.value !== notice.type })
      temp.noticeData.shift(notice)
      notices.totalrows--
      if (temp.noticeData.length > 6) {
        temp.noticeData.pop()
      }
      notices.rows = []
      notices.rows.pop(temp)
      notices.rows.pop.apply(notices.rows, other)
      notices.rows.sort((obj1, obj2) => {
        return obj1.index - obj2.index
      })
      state.notices = notices
    }
  },

  actions: {
    // 登录
    Login ({ commit }, userInfo) {
      Vue.ls.remove(ALL_APPS_MENU)// 清除菜单缓存
      return new Promise((resolve, reject) => {
        login(userInfo).then(response => {
          if (response.code !== 0) {
            reject(response.message)
            return
          }
         // 从响应 Header 中读取，处理逻辑移至 request.js 中处理
          // const result = response.data
          // Vue.ls.set(ACCESS_TOKEN, result, 7 * 24 * 60 * 60 * 1000)
          // commit('SET_TOKEN', result)
          resolve()
        // eslint-disable-next-line handle-callback-err
        }).catch(error => {
          // eslint-disable-next-line prefer-promise-reject-errors
          reject('后端未启动或代理错误')
        })
      })
    },

    // 获取用户信息
    GetInfo ({ commit }) {
      return new Promise((resolve, reject) => {
        getLoginUser().then(response => {
          if (response.code === 0) {
            const data = response.data
            commit('SET_ADMINTYPE', data.admintype)
            commit('SET_ROLES', 1)
            commit('SET_BUTTONS', data.permissions)
            commit('SET_ALL_BUTTONS', data.allpermissions)
            commit('SET_INFO', data)
            commit('SET_NAME', { name: data.name, welcome: welcome() })
            if (data.avatar != null) {
              sysFileInfoPreview({ id: data.avatar }).then((res) => {
                commit('SET_AVATAR', window.URL.createObjectURL(new Blob([res])))
              }).catch((err) => {
                this.$myerror('预览错误：' + err.message)
              })
              // commit('SET_AVATAR', process.env.VUE_APP_API_BASE_URL + '/sysFileInfo/preview?id=' + data.avatar)
            } else {
              commit('SET_AVATAR', '/avatar2.jpg')
            }
            resolve(data)
          } else {
            // eslint-disable-next-line no-undef
            reject(new Error(response.message))
          }
        })
        // 登录过期后前端会发生高频访问后端的问题
        // .catch(error => {
        //  reject(error)
        // })
      })
    },

    // 登出
    Logout ({ commit, state }) {
      return new Promise((resolve) => {
        logout(state.token).then(() => {
          resolve()
        }).catch(() => {
          resolve()
        }).finally(() => {
          commit('SET_TOKEN', '')
          commit('SET_ROLES', [])
          commit('SET_BUTTONS', [])
          commit('SET_ALL_BUTTONS', [])
          commit('SET_ADMINTYPE', '')
          Vue.ls.remove(ACCESS_TOKEN)
          Vue.ls.remove(ALL_APPS_MENU)
          Vue.ls.remove(DICT_TYPE_TREE_DATA)
          Vue.ls.remove('X-Access-Token')
        })
      })
    },
    // 加载配置信息
    getConfig({ commit }) {
      return new Promise((resolve, reject) => {
        GetConfigInfo().then((data) => {
          if (data.code === 0) {
            const result = data.data
            commit('SET_CONFIGINFO', result)
            resolve(result)
          } else {
            // eslint-disable-next-line no-undef
            reject(new Error(data.message))
          }
        }).catch(error => {
          reject(error)
        })
      })
    },
    // 加载所有字典数据
    dictTypeData () {
      return new Promise((resolve, reject) => {
        sysDictTypeTree().then((data) => {
          if (data.code === 0) {
            const result = data.data
            Vue.ls.set(DICT_TYPE_TREE_DATA, result)
            resolve()
          } else {
            // eslint-disable-next-line no-undef
            reject(new Error(data.message))
          }
        }).catch(error => {
          reject(error)
        })
      })
    },
    // 加载所有的枚举
    getclientdata({ commit }) {
      return new Promise((resolve, reject) => {
        GetClientData().then((data) => {
          if (data.code === 0) {
            const result = data.data
            commit('SET_CLIENTDATA', result)
            resolve(result)
          } else {
            // eslint-disable-next-line no-undef
            reject(new Error(data.message))
          }
        }).catch(error => {
          reject(error)
        })
      })
    },
    // 切换应用菜单
    MenuChange ({ commit }, application) {
      return new Promise((resolve) => {
        sysMenuChange({ application: application.code }).then((res) => {
          const apps = { 'code': '', 'name': '', 'active': '', 'menu': '' }
          apps.active = true
          apps.menu = res.data
          // eslint-disable-next-line camelcase
          const all_app_menu = Vue.ls.get(ALL_APPS_MENU)
          // eslint-disable-next-line camelcase
          const new_false_all_app_menu = []
          // 先去除所有默认的，以为此时切换的即将成为前端缓存默认的应用
          all_app_menu.forEach(item => {
            if (item.active) {
              item.active = false
            }
            new_false_all_app_menu.push(item)
          })
          // 此时缓存中全部都是不默认的应用
          Vue.ls.set(ALL_APPS_MENU, new_false_all_app_menu)
          apps.name = application.name
          apps.code = application.code
          const applocationR = []
          applocationR.push(apps)
          Vue.ls.set(ALL_APPS_MENU, applocationR)
          resolve(res)
          const antDesignmenus = res.data
          store.dispatch('GenerateRoutes', { antDesignmenus }).then(() => {
            // for (let i = 0, length = store.getters.addRouters.length; i < length; i += 1) {
            //   const element = store.getters.addRouters[i]
            //   router.addRoute(element)
            // }
             router.addRoutes(store.getters.addRouters)
          })
          // 切换应用刷新整体界面，暂且取消
          // window.location.reload()
        }).catch(() => {
          resolve()
        })
      })
    },
    // 获取收到的通知
    getNoticReceiveList({
      commit
    }) {
      return new Promise((resolve, reject) => {
        unReadNotice({
          pageSize: 6
        }).then((data) => {
          if (data.code === 0) {
            const result = data.data
            commit('SET_NOTICES', result)
            resolve()
          } else {
            // eslint-disable-next-line no-undef
            reject(new Error(data.message))
          }
        }).catch(error => {
          reject(error)
        })
      })
    }

  }
}

export default user
