<script>
//app.js
import { $http } from './config/https.js';
import { httpconfig } from './config/httpconfig';
import Cache  from './utils/cache';
import messageUtil from './utils/message.js';
// #ifdef H5
import wechath5 from './utils/wechath5.js';
// #endif
export default {
    data() {
        return {};
    },
    globalData: {
        share: false,

        // 分享默认为false
        height: 0,

        statusBarHeight: uni.getWindowInfo()['statusBarHeight'],
        overlayVisible: false,
        imageIconDomain: httpconfig.imgDomain,
        appID: '',
        sessionKey: '',
        timObj: null,

        // 单点登录进行中标志位：为 true 时各页面应跳过“未登录跳登录页”的逻辑，
        // 等待 SSO 完成后 refreshCurrentPage 会自动刷新页面
        ssoPending: false,

        /**
         * 获取App信息
         */
        getAppInfo: function () {
            // #ifdef H5 || !MP-WEIXIN
            // H5 或非微信小程序环境，跳过 getAccountInfoSync（仅小程序可用）
            // #endif
            // #ifdef MP-WEIXIN
            var accountInfo = uni.getAccountInfoSync();
            var appID = accountInfo.miniProgram.appId;
            // 登录接口
            let data = {
                params: [
                    {
                        appID: appID,
                        flag: 'D'
                    }
                ]
            };
            let that = this;
            $http.post('urlDeault', this, {
                code: '03100143',
                data: data,
                success: function (res) {
                    if (res.errorCode == '0') {
                        Cache.set('appInfo', res.result);
                        uni.setNavigationBarTitle({
                            title: res.result.docAppName
                        });
                    }
                }
            });
            // #endif

            // #ifdef H5
            // H5 中 uni.getAccountInfoSync 可能返回公众号/外层容器 appId，医生端固定使用配置的 appID。
            const h5AppID = httpconfig.doctorAppID || '';
            if (h5AppID) {
                console.log('[App] getAppInfo appID:', h5AppID);
                $http.post('urlDeault', this, {
                    code: '03100143',
                    data: { params: [{ appID: h5AppID, flag: 'D' }] },
                    success: function (res) {
                        if (res.errorCode == '0') {
                            Cache.set('appInfo', res.result);
                            console.log('[App] getAppInfo 成功，触发 messageUtil.initTim()');
                            try {
                                messageUtil.initTim();
                            } catch (e) {
                                console.warn('[App] initTim after getAppInfo failed:', e);
                            }
                        }
                    }
                });
            }
            // #endif
        },

        /**
         * 自动更新
         */
        autoUpdate: function () {
            // getUpdateManager 仅微信小程序支持
            if (typeof uni.getUpdateManager !== 'function') return;
            var that = this;
            // 获取小程序更新机制兼容
            if (uni.canIUse('getUpdateManager')) {
                const updateManager = uni.getUpdateManager();
                //1. 检查小程序是否有新版本发布
                updateManager.onCheckForUpdate(function (res) {
                    // 请求完新版本信息的回调
                    if (res.hasUpdate) {
                        //检测到新版本，需要更新，给出提示
                        uni.showModal({
                            title: '更新提示',
                            content: '检测到新版本，是否下载新版本并重启小程序？',
                            success: function (res) {
                                if (res.confirm) {
                                    //2. 用户确定下载更新小程序，小程序下载及更新静默进行
                                    that.downLoadAndUpdate(updateManager);
                                } else if (res.cancel) {
                                    //用户点击取消按钮的处理，如果需要强制更新，则给出二次弹窗，如果不需要，则这里的代码都可以删掉了
                                    uni.showModal({
                                        title: '温馨提示~',
                                        content: '本次版本更新涉及到新的功能添加，旧版本无法正常访问的哦~',
                                        showCancel: false,
                                        //隐藏取消按钮
                                        confirmText: '确定更新',
                                        //只保留确定更新按钮
                                        success: function (res) {
                                            if (res.confirm) {
                                                //下载新版本，并重新应用
                                                that.downLoadAndUpdate(updateManager);
                                            }
                                        }
                                    });
                                }
                            }
                        });
                    }
                });
            } else {
                // 如果希望用户在最新版本的客户端上体验您的小程序，可以这样子提示
                uni.showModal({
                    title: '提示',
                    content: '当前微信版本过低，无法使用该功能，请升级到最新微信版本后重试。'
                });
            }
        },

        /**
         * 下载小程序新版本并重启应用
         */
        downLoadAndUpdate: function (updateManager) {
            var that = this;
            uni.showLoading();
            //静默下载更新小程序新版本
            updateManager.onUpdateReady(function () {
                uni.hideLoading();
                //新的版本已经下载好，调用 applyUpdate 应用新版本并重启
                updateManager.applyUpdate();
            });
            updateManager.onUpdateFailed(function () {
                // 新的版本下载失败
                uni.showModal({
                    title: '已经有新版本了哟~',
                    content: '新版本已经上线啦~，请您删除当前小程序，重新搜索打开哟~'
                });
            });
        },

        /**
         * 单点登录处理
         * @param {string} data - URL 中的加密数据
         * @param {string} hospID - 医院ID
         * @param {object} launchOptions - 启动参数（包含 path 等）
         */
        handleSSO: function (data, hospID, launchOptions) {
            var that = this;
            // 标记 SSO 进行中，阻止页面在 SSO 完成前跳转登录页
            that.ssoPending = true;
            let reqData = {
                params: [
                    {
                        data: data,
                        hospID: hospID || 88,
                    }
                ],
                session: [{}]
            };
            $http.post('urlDeault', this, {
                code: '08010034',
                data: reqData,
                success: function (res) {
                    that.ssoPending = false;
                    if (res.errorCode == '0') {
                        let locInfo = res.result[0];
                        if (locInfo.userCode && locInfo.userCode.indexOf('xyskf') > -1) {
                            locInfo.userID = 'KF001';
                        }
                        uni.setStorage({
                            key: 'userData',
                            data: locInfo,
                            success: function () {
                                let TIMInfo = Cache.get('TIMInfo') || {};
                                const redirectByRole = function () {
                                    // 仅跳转一次，防止 loginTim 成功与 fallback 定时器重复触发
                                    if (that._ssoRedirectDone) return;
                                    that._ssoRedirectDone = true;
                                    if (String(locInfo.groupID) === '352') {
                                        uni.reLaunch({
                                            url: '/pages/staticPages/workbench/workbench'
                                        });
                                    } else {
                                        uni.switchTab({
                                            url: '/pages/tabBar/home/home'
                                        });
                                    }
                                };
                                if (TIMInfo.loginStatus !== 'Y') {
                                    messageUtil.loginTim(redirectByRole);
                                    // fallback：若 loginTim 回调因异常未触发，3s 后仍继续跳转。
                                    setTimeout(function () {
                                        redirectByRole();
                                    }, 3000);
                                } else {
                                    redirectByRole();
                                }
                            }
                        });
                    } else {
                        uni.showToast({
                            title: res.errorMessage || '单点登录失败',
                            icon: 'none'
                        });
                    }
                },
                fail: function (res) {
                    that.ssoPending = false;
                    uni.showToast({
                        title: res.errorMessage || '单点登录失败',
                        icon: 'none'
                    });
                }
            }, {
                error: 'Y'
            });
        },

        /**
         * 刷新当前页面（用于单点登录后）
         * @param {object} launchOptions - 启动参数（包含 path 等）
         */
        refreshCurrentPage: function (launchOptions) {
            // #ifdef H5
            if (typeof window !== 'undefined' && window.location) {
                let href = window.location.href;
                // 移除 data 和 hospID 参数
                href = href.replace(/([?&])data=[^&]*&?/g, '$1');
                href = href.replace(/([?&])hospID=[^&]*&?/g, '$1');
                href = href.replace(/[?&]$/, '');
                // 替换可能的空查询参数 ?& 为 ?
                href = href.replace(/\?&/g, '?');
                const currentBase = window.location.href.split('#')[0];
                window.location.href = href;
                // 原 window.reload() 不是函数，改为 location.reload；
                // hash 模式下只改变 href 的 hash/query 不会触发页面刷新，需要显式 reload
                if (currentBase === href.split('#')[0] && typeof window.location.reload === 'function') {
                    window.location.reload();
                }
            }
            // #endif
            // #ifndef H5
            let path = launchOptions && launchOptions.path;
            if (!path) {
                let pages = getCurrentPages();
                if (pages.length > 0) {
                    path = pages[pages.length - 1].route;
                }
            }
            if (path) {
                uni.redirectTo({
                    url: '/' + path
                });
            }
            // #endif
        }
    },
    methods: {
        prefetchH5PageModulesInDev() {
            if (!import.meta.env || !import.meta.env.DEV) return;
            const pageLoaders = Object.values(import.meta.glob('./pages/**/*.vue'));
            const concurrency = 4;
            let cursor = 0;
            const run = async () => {
                while (cursor < pageLoaders.length) {
                    const loader = pageLoaders[cursor++];
                    try {
                        await loader();
                    } catch (error) {
                        console.warn('[dev:h5] prefetch page module failed:', error);
                    }
                }
            };
            for (let i = 0; i < concurrency; i += 1) {
                run();
            }
        }
    },
    onLaunch: function (options = {}) {
        console.log('getDeviceInfo==', uni.getWindowInfo());
        this.globalData.getAppInfo();
        this.globalData.autoUpdate();
        // uni.removeStorageSync('userData');
        Cache.remove('TIMInfo');
        const windowInfo = uni.getWindowInfo();
        if (windowInfo) {
            this.globalData.height = windowInfo.statusBarHeight;
        }

		// #ifdef H5
        this.prefetchH5PageModulesInDev();
		options = options || { query: {} };

		// 单点登录：任意页面 URL 中带有 data 参数时，执行单点登录并刷新当前页面
		// 兼容 data 出现在 hash 路由 query（options.query）或主 URL search 中的情况
		let ssoData = options.query && options.query.data;
		let ssoHospID = options.query && options.query.hospID;
		if (!ssoData && typeof window !== 'undefined' && window.location && window.location.search) {
			try {
				let urlParams = new URLSearchParams(window.location.search);
				ssoData = urlParams.get('data') || '';
				ssoHospID = ssoHospID || urlParams.get('hospID') || '';
			} catch (e) {
				console.warn('[App] parse SSO params from search failed:', e);
			}
		}
		if (ssoData) {
			// 标记 SSO 进行中，阻止入口页在 SSO 完成前跳转登录页
			this.globalData.ssoPending = true;
			this.globalData.handleSSO(ssoData, ssoHospID, options);
			return;
		}

		if(options && options.query.state) {
			this.globalData.pubAccCode = options.query.state
			const userData = Cache.get("userData")
			Cache.set("userData", {
				...userData,
				pubAccCode: options.query.state
			})
		}

		let userData = Cache.get("userData");
		console.log('userData === ', userData)
		// 统一用 openID（大写）判断，与 wechath5.authLogin 写入字段一致；
		// 刷新场景无 code，不再调用 authLogin，避免无意义请求和未捕获的 reject
		if (!userData || !userData.openID) {
			const code = options.query.code
			if (code) {
				const pubAccCode = userData?.pubAccCode || ''
				wechath5.authLogin(code, pubAccCode).then(res => {
					console.log('获取openID成功', res)
				}).catch(err => {
					console.warn('authLogin 失败:', err)
				})
			}
		}

		// 初始化微信 JSSDK，成功后立即验证录音权限（参考患者端 App.vue）
		wechath5.config().then(() => {
			console.log('微信 JSSDK 初始化成功==' + JSON.stringify(wechath5._recordApiReady))
			return wechath5.checkRecordApi()
		}).then((ready) => {
			wechath5._recordApiReady = ready
			console.log('微信 JSSDK 录音权限:', ready ? '✅已注册' : '❌未注册')
		}).catch((err) => {
			console.error('微信 JSSDK 初始化失败:', err)
			wechath5._recordApiReady = false
		});
		// #endif
    },
    //当应用程序进入前台显示状态时触发
    onShow() {
        if (typeof uni.showShareMenu === 'function') {
            uni.showShareMenu();
        }
    },
    //当应用程序进入后台状态时触发
    onHide() {
        console.log('ApponHide');
    }
};
</script>
<style>

.container {
    height: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: space-between;
    box-sizing: border-box;
    background: #fff;
    font-family: Arial, Helvetica, sans-serif;
}

/* 全局设置所有页面属性 */
page {
    width: 100%;
    min-height: 100%;
    box-sizing: border-box;
    background-color: #f5f4f4;
    color: #333;
    font-size: 28rpx;
    overflow-x: hidden;
}

html,
body,
#app,
uni-page,
uni-page-body {
    width: 100%;
    min-height: 100%;
    margin: 0;
    box-sizing: border-box;
}

view,
scroll-view,
swiper,
button,
input,
textarea {
    box-sizing: border-box;
}

/**
全局样式 栅格布局 页面全等分12份
如：
<view class="row">
    <view class="col">
        <view class="col-3"></view>
        <view class="col-9"></view>
    </view>
</view>
**/
/*  清除浮动 */
.clearn:after {
    content: '';
    height: 0;
    line-height: 0;
    display: block;
    visibility: hidden;
    clear: both;
}

.row {
    display: block;
    margin: 0px;
}

.col {
    font-family: -apple-system-font, 'Helvetica Neue', sans-serif;
    font-size: 17px;
}

.col > .col-1,
.col-1,
.col-2,
.col-3,
.col-4,
.col-5,
.col-6,
.col-7,
.col-8,
.col-9,
.col-10,
.col-11,
.col-12 {
    float: left;
    position: relative;
}

.col-1 {
    width: 8.33333333333333%;
}

.col-2 {
    width: 16.6666666666666%;
}

.col-3 {
    width: 25%;
}

.col-4 {
    width: 33.3333333333333%;
}

.col-5 {
    width: 41.6666666666666%;
}

.col-6 {
    width: 50%;
}

.col-7 {
    width: 58.333333333333333%;
}

.col-8 {
    width: 66.66666666666666%;
}

.col-9 {
    width: 75%;
}

.col-10 {
    width: 83.33333333333333%;
}

.col-11 {
    width: 91.66666666666666%;
}

.col-12 {
    width: 100%;
}

/* picker整行点击样式 */
.pickerAbs {
    position: absolute;
    left: 0;
    top: 0;
    text-align: right;
    width: 100%;
}

.pickerView {
    position: absolute;
    left: 0;
    top: 0;
    text-align: right;
    width: 100%;
    padding: 10px 0;
}

/* 不可选样式 */
.dis {
    background: #eee;
}

/* 必填样式 */
.required:before {
    display: inline-block;
    margin-right: 0.106667rem;
    color: #ff4d4f;
    font-family: SimSun, sans-serif;
    line-height: 1;
    content: '*';
}

/* 公共基础样式 */

.floatR {
    float: right;
}

.floatL {
    float: left;
}

.textCenter {
    text-align: center;
}

.textLeft {
    text-align: left;
}

.textRight {
    text-align: right;
}

.ml10 {
    margin-left: 10rpx;
}

.ml20 {
    margin-left: 20rpx;
}

.mr20 {
    margin-right: 20rpx;
}

.mb20 {
    margin-bottom: 20rpx;
}

.mt20 {
    margin-top: 20rpx;
}

.plr20 {
    padding: 0 20rpx;
}

.fontS25 {
    font-size: 25rpx;
}

.fontS30 {
    font-size: 30rpx;
}

.fontWeight {
    font-weight: bold;
}

.borderB2 {
    border-bottom: 2rpx solid #eee;
}
</style>
