/*
 * @Author: GuLiMmo 2820890765@qq.com
 * @Date: 2024-08-27 14:48:42
 * @LastEditors: GuLiMmo 2820890765@qq.com
 * @LastEditTime: 2024-08-27 16:25:34
 * @FilePath: /drone-web/src/store/user.ts
 * @Description:
 * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
 */
/*
 * @Author: GuLiMmo 2820890765@qq.com
 * @Date: 2024-01-16 13:37:21
 * @LastEditors: GuLiMmo 2820890765@qq.com
 * @LastEditTime: 2024-08-23 14:56:41
 * @FilePath: /newBigScreen/src/store/modules/user.js
 * @Description:
 *
 * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
 */
import { ELocalStorageKey } from '@/types/enums'
import { getButtons, loginByUsername, getUserInfo, logout, refreshToken } from '@/api/user'
import { setStore, getStore } from '@/utils/store'
import { validatenull } from '@/utils/validate'
import md5 from 'js-md5'
import { showNotify } from 'vant';
import { setToken, setRefreshToken, removeToken, removeRefreshToken } from '@/utils/auth'

const user = {
  state: {
    // userInfo: {},
    tenantId: getStore({ name: 'tenantId' }) || '',
    userInfo: getStore({ name: 'userInfo' }) || [],
    permission: getStore({ name: 'permission' }) || {},
    authButtons: getStore({ name: 'authButtons' }) || [],
    roles: [],
    menuId: {},
    menu: getStore({ name: 'menu' }) || [],
    menuAll: getStore({ name: 'menuAll' }) || [],
    loginFlag: getStore({ name: 'loginFlag' }),
    token: getStore({ name: 'token' }) || '',
    refreshToken: getStore({ name: 'refreshToken' }) || '',
    roleMenu: getStore({ name: 'menuList' }) || [],
  },
  actions: {
    // 根据用户名登录
    LoginByUsername ({ commit }: any, userInfo: { tenantId: string; deptId: string; roleId: string; username: string; password: any; type: string; key: string; code: string; grant_type: string }) {
      return new Promise((resolve, reject) => {
        loginByUsername(
          userInfo.tenantId,
          userInfo.deptId,
          userInfo.roleId,
          userInfo.username,
          md5(userInfo.password),
          userInfo.type,
          userInfo.key,
          userInfo.code,
          userInfo.grant_type,
        )
          .then((res) => {
            const data = res.data
            if (data.error_description) {
              showNotify({ type: 'danger', message: data.error_description })
            } else {
              commit('SET_LOGIN_FLAG', true)
              commit('SET_TOKEN', data.access_token)
              commit('SET_REFRESH_TOKEN', data.refresh_token)
              commit('SET_TENANT_ID', data.tenant_id)
              commit('SET_USER_INFO', data)
              // localStorage.setItem(ELocalStorageKey.Token, data.access_token)
              // localStorage.setItem(ELocalStorageKey.Username, data.user_name)
              // this.dispatch('GetButtons')
              // commit('SET_SELECTED_WORKSPACE', userInfo);
              // commit('DEL_ALL_TAG');
              // commit('CLEAR_LOCK');
              resolve(true)
            }
          })
          .catch((error) => {
            reject(error)
          })
      })
    },
    // 获取用户信息
    GetUserInfo ({ commit }: any) {
      return new Promise((resolve, reject) => {
        getUserInfo()
          .then((res) => {
            const data = res.data.data
            commit('SET_ROLES', data.roles)
            resolve(data)
          })
          .catch((err) => {
            reject(err)
          })
      })
    },
    // 获取当前角色按钮权限
    GetButtons ({ commit }: any) {
      return new Promise((resolve, reject) => {
        getButtons()
          .then((res) => {
            const data = res.data.data
            commit('SET_BUTTONS', data)
            resolve(data)
          })
          .catch((err) => {
            reject(err)
          })
      })
    },
    // 刷新token
    refreshToken ({ state, commit }: any, userInfo: { deptId: string; roleId: string }) {
      return new Promise((resolve, reject) => {
        refreshToken(
          state.refreshToken,
          state.tenantId,
          !validatenull(userInfo) ? userInfo.deptId : state.userInfo.dept_id,
          !validatenull(userInfo) ? userInfo.roleId : state.userInfo.role_id,
        )
          .then((res) => {
            const data = res.data
            commit('SET_LOGIN_FLAG', true)
            commit('SET_TOKEN', data.access_token)
            commit('SET_REFRESH_TOKEN', data.refresh_token)
            commit('SET_USER_INFO', data)
            resolve('')
          })
          .catch((error) => {
            reject(error)
          })
      })
    },
    // 登出
    LogOut ({ commit }: any) {
      return new Promise((resolve, reject) => {
        logout()
          .then(() => {
            commit('SET_LOGIN_FLAG', false)
            commit('SET_TOKEN', '')
            commit('SET_MENU', [])
            commit('SET_MENU_ALL_NULL', [])
            commit('SET_ROLES', [])
            commit('SET_TAG_LIST', [])
            commit('DEL_ALL_TAG')
            commit('CLEAR_LOCK')
            removeToken()
            removeRefreshToken()
            resolve('')
          })
          .catch((error) => {
            reject(error)
          })
      })
    },
    // 注销session
    FedLogOut ({ commit }: any) {
      return new Promise((resolve) => {
        commit('SET_LOGIN_FLAG', false)
        commit('SET_TOKEN', '')
        commit('SET_MENU_ALL_NULL', [])
        commit('SET_MENU', [])
        commit('SET_ROLES', [])
        commit('SET_TAG_LIST', [])
        commit('DEL_ALL_TAG')
        commit('CLEAR_LOCK')
        removeToken()
        removeRefreshToken()
        resolve('')
        window.localStorage.clear()
      })
    },
  },
  mutations: {
    SET_ROLE_MENU (state: { roleMenu: any; menuList: any }, menuList: any) {
      state.roleMenu = menuList
      setStore({ name: 'roleMenu', content: state.menuList })
    },
    SET_LOGIN_FLAG: (state: { loginFlag: any }, loginFlag: any) => {
      state.loginFlag = loginFlag
      setStore({ name: 'loginFlag', content: state.loginFlag })
    },
    SET_TOKEN: (state: { token: string }, token: string) => {
      setToken(token)
      state.token = token
      setStore({ name: 'token', content: state.token })
      window.localStorage.setItem(ELocalStorageKey.Token, token)
    },
    SET_LOCAL_STORAGE_USER_INFO (state: { userInfo: { [x: string]: string } }, userInfo: { [x: string]: string }) {
      Object.keys(userInfo).forEach((key) => {
        state.userInfo[key] = userInfo[key]
        localStorage.setItem(key, userInfo[key])
      })
    },
    CLEAR_LOCAL_STORAGE_USER_INFO (state: { userInfo: {} }) {
      localStorage.clear()
      state.userInfo = {}
    },
    SET_REFRESH_TOKEN: (state: { refreshToken: string }, refreshToken: string) => {
      setRefreshToken(refreshToken)
      state.refreshToken = refreshToken
      setStore({ name: 'refreshToken', content: state.refreshToken })
    },
    SET_TENANT_ID: (state: { tenantId: string }, tenantId: string) => {
      state.tenantId = tenantId
      setStore({ name: 'tenantId', content: state.tenantId })
    },
    SET_USER_INFO: (state: { userInfo: {} }, userInfo: { account: string }) => {
      //   if (validatenull(userInfo.avatar)) {
      //     userInfo.avatar = '/img/bg/img-logo.png';
      //   }
      state.userInfo = userInfo
      setStore({ name: 'userInfo', content: state.userInfo })
      window.localStorage.setItem('username', userInfo.account)
    },
    SET_ROLES: (state: { roles: any }, roles: any) => {
      state.roles = roles
    },
    SET_PERMISSION: (state: { permission: { [x: string]: boolean } }, permission: any) => {
      const result: any[] = []

      function getCode (list: { children: any; code: string }[]) {
        list.forEach((ele: { children: any; code: any }) => {
          if (typeof ele === 'object') {
            const chiildren = ele.children
            const code = ele.code
            if (chiildren) {
              getCode(chiildren)
            } else {
              result.push(code)
            }
          }
        })
      }

      getCode(permission)
      state.permission = {}
      result.forEach((ele) => {
        state.permission[ele] = true
      })
      setStore({ name: 'permission', content: state.permission })
    },
    SET_BUTTONS (state: { authButtons: string[] }, buttons: any[]) {
      const buttonGroup: string[] = []
      buttons.forEach((button) => {
        buttonGroup.push(button.code)
        if (button?.children) {
          button?.children.forEach((btnChild: { code: string }) => {
            buttonGroup.push(btnChild.code)
          })
        }
      })
      state.authButtons = buttonGroup
      setStore({ name: 'authButtons', content: buttonGroup })
    },
  },
}

export default user
