/**
 * 用户认证相关API接口模块
 * 提供用户登录、注册、认证、短信验证等相关的API接口
 */

import BaseRequest from '../utils/request-helper.js'
import { LOADING_TEXTS } from '../config/constants.js'

// ==================== 用户登录相关API ====================

/**
 * 用户账号密码登录
 * @param {Object} loginData 登录数据对象
 * @param {string} loginData.username 用户名或邮箱
 * @param {string} loginData.password 用户密码
 * @param {boolean} [loginData.rememberMe] 是否记住登录状态
 * @param {Object} [config] 自定义请求配置
 * @returns {Promise} 返回认证结果，包含token和用户信息
 */
export const userLogin = (loginData, config = {}) => {
	return BaseRequest.post('/auth/login', loginData, 'PUBLIC_REQUEST', LOADING_TEXTS.LOGIN, config)
}

/**
 * 微信授权登录
 * @param {Object} wxData 微信登录数据对象
 * @param {string} wxData.code 微信登录凭证code
 * @param {string} [wxData.encryptedData] 加密的用户数据
 * @param {string} [wxData.iv] 初始向量
 * @param {Object} [config] 自定义请求配置
 * @returns {Promise} 返回认证结果，包含token和用户信息
 */
export const wxLogin = (wxData, config = {}) => {
	return BaseRequest.post('/wechat/user/mini/login', wxData, 'PUBLIC_REQUEST', LOADING_TEXTS.LOGIN, config)
}

/**
 * 微信手机号登录
 * @param {Object} phoneData 手机号登录数据对象
 * @param {string} phoneData.code 微信登录code
 * @param {string} phoneData.encryptedData 加密的手机号数据
 * @param {string} phoneData.iv 初始向量
 * @param {Object} [config] 自定义请求配置
 * @returns {Promise} 返回登录结果，包含token和用户信息
 */
export const wxPhoneLogin = (phoneData, config = {}) => {
	return BaseRequest.post('/wechat/user/mini/phone-login', phoneData, 'PUBLIC_REQUEST', LOADING_TEXTS.LOGIN, config)
}

/**
 * 更新用户手机号
 * @param {Object} phoneData 手机号授权数据对象
 * @param {string} phoneData.encryptedData 加密的手机号数据
 * @param {string} phoneData.iv 初始向量
 * @param {Object} [config] 自定义请求配置
 * @returns {Promise} 返回解密后的手机号
 */
export const updatePhoneNumber = (phoneData, config = {}) => {
	return BaseRequest.post('/user/wechat/mini/phone-update', phoneData, 'AUTHENTICATED_UPDATE', LOADING_TEXTS.PHONE_VERIFY, config)
}

/**
 * 获取用户信息
 * @param {Object} [config] 自定义请求配置
 * @returns {Promise} 返回用户信息
 */
export const getUserInfo = (config = {}) => {
	return BaseRequest.get('/user/wechat/mini/userinfo', {}, 'AUTHENTICATED_QUERY_WITH_LOADING', config)
}

/**
 * 更新用户信息
 * @param {Object} userData 用户数据对象
 * @param {Object} [config] 自定义请求配置
 * @returns {Promise} 返回更新结果
 */
export const updateUserInfo = (userData, config = {}) => {
	return BaseRequest.put('/user/wechat/mini/userinfo', userData, 'AUTHENTICATED_UPDATE', LOADING_TEXTS.UPDATING_USER_INFO, config)
}

// ==================== 用户注册相关API ====================

/**
 * 用户账号注册
 * @param {Object} registerData 注册数据对象
 * @param {string} registerData.username 用户名
 * @param {string} registerData.password 密码
 * @param {string} registerData.email 邮箱地址
 * @param {string} [registerData.phoneNumber] 手机号码
 * @param {string} [registerData.inviteCode] 邀请码
 * @param {Object} [config] 自定义请求配置
 * @returns {Promise} 返回注册结果，包含token和用户信息
 */
export const userRegister = (registerData, config = {}) => {
	return BaseRequest.post('/auth/register', registerData, 'PUBLIC_REQUEST', LOADING_TEXTS.REGISTER, config)
}

// ==================== 会话管理相关API ====================

/**
 * 用户登出
 * @param {Object} [config] 自定义请求配置
 * @returns {Promise} 返回登出结果
 */
export const userLogout = (config = {}) => {
	return BaseRequest.post('/auth/logout', {}, 'AUTHENTICATED_UPDATE', LOADING_TEXTS.LOGOUT, config)
}

/**
 * 刷新访问令牌
 * @param {Object} [config] 自定义请求配置
 * @param {string} [config.refreshToken] 自定义刷新令牌，不传则从本地存储获取
 * @returns {Promise} 返回新的token信息
 */
export const refreshToken = (config = {}) => {
	const refreshTokenValue = config.refreshToken || uni.getStorageSync('refreshToken')

	return BaseRequest.post('/auth/refresh', { refreshToken: refreshTokenValue }, 'SILENT_REQUEST', null, config)
}

// ==================== 短信验证相关API ====================

/**
 * 发送短信验证码
 * @param {Object} phoneData 手机号数据对象
 * @param {Object} [config={}] 自定义请求配置
 * @returns {Promise<Object>} 返回发送结果
 */
export const sendSmsCode = (phoneData, config = {}) => {
	return BaseRequest.post('/sms/send', phoneData, 'PUBLIC_REQUEST', LOADING_TEXTS.SEND_SMS, config)
}

/**
 * 验证短信验证码
 * @param {Object} verifyData 验证数据对象
 * @param {Object} [config={}] 自定义请求配置
 * @returns {Promise<Object>} 返回验证结果
 */
export const verifySmsCode = (verifyData, config = {}) => {
	return BaseRequest.post('/sms/verify', verifyData, 'PUBLIC_REQUEST', LOADING_TEXTS.VERIFY_SMS, config)
}

/**
 * 重置用户密码
 * @param {Object} resetData 重置密码数据对象
 * @param {Object} [config={}] 自定义请求配置
 * @returns {Promise<Object>} 返回重置结果
 */
export const resetPassword = (resetData, config = {}) => {
	return BaseRequest.post('/auth/reset-password', resetData, 'PUBLIC_REQUEST', LOADING_TEXTS.RESET_PASSWORD, config)
}
