/**
 * 认证模块 - 登录、注册、绑定相关接口
 */
import RequestManager from '../request';

/**
 * 保存登录Token到本地存储
 * 支持新版双Token格式和旧版单Token格式
 * @param {Object|String} data 登录响应数据
 * @param {String} data.accessToken 访问令牌（新版）
 * @param {String} data.refreshToken 刷新令牌（新版）
 * @param {Number} data.expiresIn 过期时间（秒）（新版）
 */
export const saveLoginTokens = (data) => {
    if (typeof data === 'string') {
        // 旧版格式：直接返回token字符串
        uni.setStorageSync('token', data);
    } else if (data && typeof data === 'object') {
        // 新版格式：返回包含accessToken、refreshToken、expiresIn的对象
        if (data.accessToken) {
            uni.setStorageSync('token', data.accessToken);
            uni.setStorageSync('accessToken', data.accessToken);
        }
        if (data.refreshToken) {
            uni.setStorageSync('refreshToken', data.refreshToken);
        }
        if (data.expiresIn) {
            // 计算过期时间戳（当前时间 + expiresIn秒）
            const tokenExpireTime = Date.now() + (data.expiresIn * 1000);
            uni.setStorageSync('tokenExpireTime', tokenExpireTime);
        }
        // 兼容旧版：如果响应中有token字段（向后兼容）
        if (data.token && !data.accessToken) {
            uni.setStorageSync('token', data.token);
        }
    }
};

/**
 * 清除所有登录Token
 */
export const clearLoginTokens = () => {
    uni.removeStorageSync('token');
    uni.removeStorageSync('accessToken');
    uni.removeStorageSync('refreshToken');
    uni.removeStorageSync('tokenExpireTime');
    uni.removeStorageSync('userinfo');
};

/**
 * 获取当前存储的Token信息
 * @returns {Object} Token信息对象
 */
export const getStoredTokens = () => {
    return {
        token: uni.getStorageSync('token'),
        accessToken: uni.getStorageSync('accessToken'),
        refreshToken: uni.getStorageSync('refreshToken'),
        tokenExpireTime: uni.getStorageSync('tokenExpireTime')
    };
};

/**
 * 检查Access Token是否即将过期（提前5分钟）
 * @returns {Boolean} 是否即将过期
 */
export const isTokenExpiringSoon = () => {
    const tokenExpireTime = uni.getStorageSync('tokenExpireTime');
    if (!tokenExpireTime) {
        return false;
    }
    // 提前5分钟（300秒）认为即将过期
    const bufferTime = 5 * 60 * 1000;
    return Date.now() >= (tokenExpireTime - bufferTime);
};

/**
 * 检查Access Token是否已过期
 * @returns {Boolean} 是否已过期
 */
export const isTokenExpired = () => {
    const tokenExpireTime = uni.getStorageSync('tokenExpireTime');
    if (!tokenExpireTime) {
        return false;
    }
    return Date.now() >= tokenExpireTime;
};

/**
 * 微信手机号快速验证登录
 * @param {String} phoneCode 微信手机号授权code（getPhoneNumber返回）
 * @param {String} pid 推荐人ID
 * @returns {Promise} 登录结果
 */
export const wxPhoneLogin = async (phoneCode, pid = '') => {
    // 先获取微信登录code，用于获取openid
    const loginRes = await new Promise((resolve, reject) => {
        uni.login({
            provider: 'weixin',
            success: resolve,
            fail: reject
        });
    });
    
    return await RequestManager.post('/wxPhoneLogin', {
        phoneCode,
        loginCode: loginRes.code,
        pid
    });
};

/**
 * 微信登录
 * @param {Object} params 登录参数
 * @param {String} params.code 微信登录code
 * @param {String} params.nickname 昵称
 * @param {String} params.headimg 头像
 * @param {String} params.pid 推荐人ID
 * @returns {Promise} 登录结果
 */
export const wxLogin = async (params = {}) => {
    return await RequestManager.post('/login', params);
};

/**
 * 手机号验证码登录
 * @param {String} mobile 手机号
 * @param {String} code 验证码
 * @param {String} pid 推荐人ID
 * @returns {Promise} 登录结果
 */
export const mobileLogin = async (mobile, code, pid = '') => {
    return await RequestManager.post('/mobileLogin', {
        mobile,
        code,
        pid
    });
};

/**
 * 发送短信验证码
 * @param {String} phone 手机号
 * @returns {Promise} 发送结果
 */
export const sendSms = async (phone) => {
    return await RequestManager.post('/v2/account/sendSms', { phone });
};

/**
 * 微信绑定手机号（通过微信授权）
 * @param {String} code 微信授权code
 * @returns {Promise} 绑定结果
 */
export const bindMobileByWx = async (code) => {
    return await RequestManager.post('/login_bind_mobile', { code });
};

/**
 * 验证码绑定手机号（H5端）
 * @param {String} mobile 手机号
 * @param {String} code 验证码
 * @returns {Promise} 绑定结果
 */
export const bindMobileByCode = async (mobile, code) => {
    return await RequestManager.post('/login_bind_mobile_h5', {
        mobile,
        code
    });
};

/**
 * 刷新Token
 * @param {String} refreshToken 刷新令牌
 * @returns {Promise} 刷新结果，包含新的accessToken、refreshToken、expiresIn
 */
export const refreshToken = async (refreshToken) => {
    return await RequestManager.post('/refresh', {
        refreshToken
    });
};

/**
 * 退出登录（撤销Refresh Token）
 * @returns {Promise} 退出结果
 */
export const logout = async () => {
    const storedRefreshToken = uni.getStorageSync('refreshToken');
    if (storedRefreshToken) {
        try {
            await RequestManager.post('/logout', {
                refreshToken: storedRefreshToken
            });
        } catch (error) {
            console.log('撤销Token失败，继续清除本地存储:', error);
        }
    }
    // 无论后端调用是否成功，都清除本地存储
    clearLoginTokens();
};

/**
 * 记录登录
 * @returns {Promise} 记录结果
 */
export const recordLogin = async () => {
    return await RequestManager.post('/login_record', {});
};

/**
 * 账号注销
 * @returns {Promise} 注销结果
 */
export const logOff = async () => {
    return await RequestManager.post('/user_log_off', {});
};

/**
 * 绑定邀请码
 * @param {String} inviteCode 邀请码
 * @returns {Promise} 绑定结果
 */
export const bindInviteCode = async (inviteCode) => {
    return await RequestManager.post('/bind_invite_code', {
        invite_code: inviteCode
    });
};
