/**
 * 银行端小程序认证服务
 * @file authService.js
 * @description 处理用户登录、登出、用户信息管理等功能
 */

const { apiService } = require('./apiService.js')

// 认证服务
const authService = {
  /**
   * 用户登录
   * @param {string} username - 用户名
   * @param {string} password - 密码
   * @returns {Promise} 登录结果
   */
  async login(username, password) {
    try {
      console.log('开始登录:', username)
      
      // 参数验证
      if (!username || !password) {
        throw new Error('用户名和密码不能为空')
      }
      
      if (username.length < 3) {
        throw new Error('用户名至少3个字符')
      }
      
      if (password.length < 6) {
        throw new Error('密码至少6个字符')
      }
      
      // 调用登录API
      const response = await apiService.auth.login(username, password)
      
      console.log('登录响应:', response)
      
      if (response && response.success && response.data) {
        return {
          success: true,
          token: response.data.token,
          user: response.data.user,
          message: response.message || '登录成功'
        }
      } else {
        throw new Error(response.message || '登录失败')
      }
    } catch (error) {
      console.error('登录错误:', error)
      throw error
    }
  },

  /**
   * 获取当前用户信息
   * @returns {Promise} 用户信息
   */
  async getUserInfo() {
    try {
      const response = await apiService.auth.getCurrentUser()
      
      if (response && response.success && response.data) {
        return response.data
      } else {
        throw new Error(response.message || '获取用户信息失败')
      }
    } catch (error) {
      console.error('获取用户信息错误:', error)
      throw error
    }
  },

  /**
   * 用户登出
   * @returns {Promise} 登出结果
   */
  async logout() {
    try {
      console.log('开始登出')
      
      // 调用登出API
      const response = await apiService.auth.logout()
      
      console.log('登出响应:', response)
      
      return {
        success: true,
        message: '登出成功'
      }
    } catch (error) {
      console.error('登出错误:', error)
      // 即使API调用失败，也认为登出成功（清除本地数据）
      return {
        success: true,
        message: '登出成功'
      }
    }
  },

  /**
   * 刷新用户信息
   * @returns {Promise} 用户信息
   */
  async refreshUserInfo() {
    try {
      const userInfo = await this.getUserInfo()
      
      // 更新本地存储的用户信息
      wx.setStorageSync('bank_user', userInfo)
      
      return userInfo
    } catch (error) {
      console.error('刷新用户信息错误:', error)
      throw error
    }
  },

  /**
   * 检查登录状态
   * @returns {boolean} 是否已登录
   */
  isLoggedIn() {
    const token = wx.getStorageSync('bank_token')
    const user = wx.getStorageSync('bank_user')
    
    return !!(token && user)
  },

  /**
   * 获取存储的用户信息
   * @returns {Object|null} 用户信息
   */
  getStoredUser() {
    try {
      return wx.getStorageSync('bank_user') || null
    } catch (error) {
      console.error('获取存储用户信息错误:', error)
      return null
    }
  },

  /**
   * 获取存储的token
   * @returns {string|null} token
   */
  getStoredToken() {
    try {
      return wx.getStorageSync('bank_token') || null
    } catch (error) {
      console.error('获取存储token错误:', error)
      return null
    }
  },

  /**
   * 修改密码
   * @param {Object} passwordData - 密码数据
   * @param {string} passwordData.oldPassword - 旧密码
   * @param {string} passwordData.newPassword - 新密码
   * @returns {Promise} 修改结果
   */
  async changePassword(passwordData) {
    try {
      console.log('开始修改密码')
      
      const { oldPassword, newPassword } = passwordData
      
      // 参数验证
      if (!oldPassword || !newPassword) {
        throw new Error('旧密码和新密码不能为空')
      }
      
      if (newPassword.length < 6) {
        throw new Error('新密码至少6个字符')
      }
      
      if (oldPassword === newPassword) {
        throw new Error('新密码不能与旧密码相同')
      }
      
      // 调用修改密码API
      const response = await apiService.auth.changePassword({
        oldPassword,
        newPassword
      })
      
      console.log('修改密码响应:', response)
      
      if (response && response.success) {
        return {
          success: true,
          message: response.message || '密码修改成功'
        }
      } else {
        throw new Error(response.message || '修改密码失败')
      }
    } catch (error) {
      console.error('修改密码错误:', error)
      throw error
    }
  },

  /**
   * 清除所有认证信息
   */
  clearAuth() {
    try {
      wx.removeStorageSync('bank_token')
      wx.removeStorageSync('bank_user')
      console.log('认证信息已清除')
    } catch (error) {
      console.error('清除认证信息错误:', error)
    }
  }
}

module.exports = authService