/**
 * 银行端小程序认证工具
 * @file auth.js
 * @description 处理认证状态管理、token管理等功能
 */

// 认证工具类
const auth = {
  // 存储键名
  TOKEN_KEY: 'bank_token',
  USER_KEY: 'bank_user',
  
  /**
   * 设置token
   * @param {string} token - 认证token
   */
  setToken(token) {
    try {
      if (!token) {
        console.warn('设置token失败: token为空')
        return false
      }
      
      wx.setStorageSync(this.TOKEN_KEY, token)
      console.log('Token已保存')
      return true
    } catch (error) {
      console.error('设置token错误:', error)
      return false
    }
  },

  /**
   * 获取token
   * @returns {string|null} token
   */
  getToken() {
    try {
      return wx.getStorageSync(this.TOKEN_KEY) || null
    } catch (error) {
      console.error('获取token错误:', error)
      return null
    }
  },

  /**
   * 设置用户信息
   * @param {Object} user - 用户信息
   */
  setUser(user) {
    try {
      if (!user) {
        console.warn('设置用户信息失败: 用户信息为空')
        return false
      }
      
      wx.setStorageSync(this.USER_KEY, user)
      console.log('用户信息已保存:', user.username || user.name)
      return true
    } catch (error) {
      console.error('设置用户信息错误:', error)
      return false
    }
  },

  /**
   * 获取用户信息
   * @returns {Object|null} 用户信息
   */
  getUser() {
    try {
      return wx.getStorageSync(this.USER_KEY) || null
    } catch (error) {
      console.error('获取用户信息错误:', error)
      return null
    }
  },

  /**
   * 检查是否已认证
   * @returns {boolean} 是否已认证
   */
  isAuthenticated() {
    const token = this.getToken()
    const user = this.getUser()
    
    return !!(token && user)
  },

  /**
   * 获取用户角色
   * @returns {string|null} 用户角色
   */
  getUserRole() {
    try {
      const user = this.getUser()
      return user ? user.role : null
    } catch (error) {
      console.error('获取用户角色错误:', error)
      return null
    }
  },

  /**
   * 获取用户名
   * @returns {string|null} 用户名
   */
  getUsername() {
    try {
      const user = this.getUser()
      return user ? (user.username || user.name) : null
    } catch (error) {
      console.error('获取用户名错误:', error)
      return null
    }
  },

  /**
   * 清除认证信息
   */
  clearAuth() {
    try {
      wx.removeStorageSync(this.TOKEN_KEY)
      wx.removeStorageSync(this.USER_KEY)
      console.log('认证信息已清除')
    } catch (error) {
      console.error('清除认证信息错误:', error)
    }
  },

  /**
   * 登出
   * @param {boolean} showToast - 是否显示提示
   */
  logout(showToast = true) {
    try {
      // 清除本地认证信息
      this.clearAuth()
      
      if (showToast) {
        wx.showToast({
          title: '已退出登录',
          icon: 'success',
          duration: 2000
        })
      }
      
      // 跳转到登录页
      setTimeout(() => {
        wx.reLaunch({
          url: '/pages/login/login'
        })
      }, showToast ? 1000 : 0)
      
    } catch (error) {
      console.error('登出错误:', error)
    }
  },

  /**
   * 检查token是否过期
   * @returns {boolean} token是否过期
   */
  isTokenExpired() {
    try {
      const token = this.getToken()
      if (!token) return true
      
      // 简单的token过期检查（实际项目中应该解析JWT token）
      // 这里可以根据实际需求实现更复杂的过期检查
      return false
    } catch (error) {
      console.error('检查token过期错误:', error)
      return true
    }
  },

  /**
   * 更新用户信息
   * @param {Object} newUserInfo - 新的用户信息
   */
  updateUser(newUserInfo) {
    try {
      if (!newUserInfo) {
        console.warn('更新用户信息失败: 新用户信息为空')
        return false
      }
      
      const currentUser = this.getUser()
      if (!currentUser) {
        console.warn('更新用户信息失败: 当前用户信息不存在')
        return false
      }
      
      // 合并用户信息
      const updatedUser = { ...currentUser, ...newUserInfo }
      this.setUser(updatedUser)
      
      console.log('用户信息已更新')
      return true
    } catch (error) {
      console.error('更新用户信息错误:', error)
      return false
    }
  }
}

module.exports = auth