/**
 * 登录帮助工具类
 * 用于根据平台类型跳转到对应的登录页面
 */

import useUserStore from '@/stores/useUserStore';

/** 一体机 H5 首页地址 */
export const MACHINE_HOME_URL = 'https://www.xjksly.cn/mechine-single-vue/';

/**
 * 检查当前平台类型
 * @returns {string} 平台类型：'mp-weixin' | 'h5' | 'app'
 */
export function getPlatformType() {
    // #ifdef MP-WEIXIN
    return 'mp-weixin';
    // #endif
    
    // #ifdef H5
    return 'h5';
    // #endif
    
    // #ifdef APP-PLUS
    return 'app';
    // #endif
    
    return 'h5'; // 默认返回H5
}

/**
 * 跳转到对应平台的登录页面
 * @param {Object} options 跳转选项
 * @param {string} options.redirectUrl 登录成功后跳转的URL
 * @param {string} options.loginType 登录类型：'wechat' | 'account' | 'idCard'
 */
export function navigateToLoginPage(options = {}) {
    const { redirectUrl, loginType = 'account' } = options;
    const platform = getPlatformType();
    
    let loginPage = '';
    let params = {};
    
    if (redirectUrl) {
        params.redirectUrl = redirectUrl;
    }
    
    switch (platform) {
        case 'mp-weixin':
        case 'app':
        case 'h5':
            // 跳转到微信登录页面
            loginPage = '/packageA/pages/login/wx-login';
            break;
            
        default:
            loginPage = '/packageA/pages/login/h5-login';
    }
    
    if (loginPage) {
        const queryString = Object.keys(params).length > 0 
            ? `?${new URLSearchParams(params).toString()}`
            : '';
            
        const finalUrl = `${loginPage}${queryString}`;
        const pages = getCurrentPages();
        
        if (pages.length >= 10) {
            // 页面栈已满，使用redirectTo替代
            uni.redirectTo({
                url: finalUrl,
                fail: (err) => {
                    console.error('页面跳转失败:', err);
                }
            });
        } else {
            uni.navigateTo({
                url: finalUrl,
                fail: (err) => {
                    console.error('页面跳转失败:', err);
                    // 失败后尝试redirectTo
                    uni.redirectTo({
                        url: finalUrl,
                        fail: (err2) => {
                            console.error('redirectTo也失败:', err2);
                        }
                    });
                }
            });
        }
    }
}

/**
 * 检查用户是否已登录
 * @returns {boolean}
 */
export function isUserLoggedIn() {
    const userStore = useUserStore();
    const tokenValue = uni.getStorageSync('token') || '';
    return !!(tokenValue && userStore.hasLogin);
}

/**
 * H5 一体机端：弹窗提示登录，点击确定跳转一体机首页
 * @param {Object} options
 * @param {string} options.content 提示文案
 * @returns {Promise<boolean>} 用户是否点击确定
 */
export function promptH5MachineLogin(options = {}) {
    const { content = '您还未登录，请先登录' } = options;
    return new Promise((resolve) => {
        uni.showModal({
            title: '提示',
            content,
            showCancel: true,
            cancelText: '取消',
            confirmText: '确定',
            success: (res) => {
                if (res.confirm) {
                    // #ifdef H5
                    window.location.href = MACHINE_HOME_URL;
                    // #endif
                    resolve(true);
                } else {
                    resolve(false);
                }
            },
            fail: () => resolve(false),
        });
    });
}

/**
 * 检查登录状态，如果未登录则跳转到对应登录页面
 * @param {Object} options 选项
 * @param {string} options.redirectUrl 登录成功后跳转的URL
 * @param {string} options.loginType 登录类型
 * @param {string} options.content H5 一体机端登录提示文案
 * @returns {boolean} 是否已登录
 */
export function checkLoginAndNavigate(options = {}) {
    if (isUserLoggedIn()) {
        return true;
    }

    if (getPlatformType() === 'h5') {
        promptH5MachineLogin(options);
        return false;
    }

    navigateToLoginPage(options);
    return false;
}

/**
 * 处理身份证号码登录的URL参数
 * @param {string} url 包含参数的URL
 * @returns {Object} 解析后的参数对象
 */
export function parseIdCardLoginParams(url) {
    const urlObj = new URL(url, window.location.origin);
    const params = {};
    
    // 获取身份证号码base64参数
    const idCard = urlObj.searchParams.get('idCard');
    if (idCard) {
        params.idCard = idCard;
    }
    
    // 获取重定向URL
    const redirectUrl = urlObj.searchParams.get('redirectUrl');
    if (redirectUrl) {
        params.redirectUrl = redirectUrl;
    }
    
    return params;
}

/**
 * Base64解码身份证号码
 * @param {string} base64Str base64编码的字符串
 * @returns {string} 解码后的身份证号码
 */
/** 预取的 wx.login code，须在 getPhoneNumber 之前获取，授权后勿再 login */
let cachedWxLoginCode = '';
/** 用户点击授权按钮时发起的 login 请求（tap 先于 getPhoneNumber 触发） */
let wxLoginCodePromise = null;

/**
 * 预取 wx.login 的 code（与后续 getPhoneNumber 的 encryptedData 使用同一 session）
 */
export function refreshWxLoginCode() {
    return new Promise((resolve, reject) => {
        // #ifdef MP-WEIXIN
        uni.login({
            provider: 'weixin',
            success: (res) => {
                if (res.code) {
                    cachedWxLoginCode = res.code;
                    resolve(res.code);
                } else {
                    reject(new Error('未获取到微信登录凭证'));
                }
            },
            fail: (err) => reject(err),
        });
        // #endif
        // #ifndef MP-WEIXIN
        resolve('');
        // #endif
    });
}

/**
 * 在用户点击「手机号快捷登录」时调用（@tap，早于 getPhoneNumber 弹窗）
 * 确保 login code 与本次授权的 session_key 一致，避免首次授权解密失败
 */
export function prepareWxLoginCodeOnTap() {
    wxLoginCodePromise = refreshWxLoginCode();
    return wxLoginCodePromise;
}

/**
 * 在 getPhoneNumber 回调中取本次点击产生的 login code
 */
export async function consumeWxLoginCodeFromTap() {
    try {
        if (wxLoginCodePromise) {
            return await wxLoginCodePromise;
        }
        if (cachedWxLoginCode) {
            const code = cachedWxLoginCode;
            cachedWxLoginCode = '';
            return code;
        }
        return await refreshWxLoginCode();
    } finally {
        wxLoginCodePromise = null;
    }
}

export function getWxLoginCode() {
    return cachedWxLoginCode;
}

/** 取出并清空缓存（微信 code 仅能使用一次） */
export function takeWxLoginCode() {
    const code = cachedWxLoginCode;
    cachedWxLoginCode = '';
    return code;
}

export function decodeIdCardBase64(base64Str) {
    try {
        // #ifdef H5
        return atob(base64Str);
        // #endif
        
        // #ifdef MP-WEIXIN
        const result = uni.base64ToArrayBuffer(base64Str);
        return String.fromCharCode.apply(null, new Uint8Array(result));
        // #endif
        
        // #ifdef APP-PLUS
        return plus.base64.decode(base64Str);
        // #endif
        
        // 默认使用H5方式
        return atob(base64Str);
    } catch (error) {
        console.error('Base64解码失败:', error);
        throw new Error('身份证号码解码失败');
    }
}

export default {
    getPlatformType,
    navigateToLoginPage,
    checkLoginAndNavigate,
    isUserLoggedIn,
    promptH5MachineLogin,
    MACHINE_HOME_URL,
    parseIdCardLoginParams,
    decodeIdCardBase64,
    refreshWxLoginCode,
    prepareWxLoginCodeOnTap,
    consumeWxLoginCodeFromTap,
    getWxLoginCode,
    takeWxLoginCode,
};
