import {
	getGXconfig,
	miniapp
} from "@/api/uniMP.js";
import {
	ENV
} from '@/config/app';
const mp = uni.requireNativePlugin('uniMP');
import store from "@/store/modules/app.js"

let appid = ''; // 应用id
let wgtFile = ''; // 应用文件地址
let timer = null; // 加载计时器

// 比较版本号大小
function compareVersions(version1, version2) {
	const arr1 = version1.split('.').map(Number);
	const arr2 = version2.split('.').map(Number);
	for (let i = 0; i < Math.max(arr1.length, arr2.length); i++) {
		const num1 = i < arr1.length ? arr1[i] : 0;
		const num2 = i < arr2.length ? arr2[i] : 0;
		if (num1 > num2) {
			return 1;
		} else if (num1 < num2) {
			return -1;
		}
	}
	return 0;
}

// 加载供销小程序
const loadMP = async (id) => {
	appid = id;
	let info = await getGXconfig();
	console.log('最新版本', info.data);
	// return ;
	uni.$emit('showLoading', true, '初始化中');
	mp.getUniMPVersion(id, (ret) => {
		console.log('当前版本', ret);
		let flag;
		if (ENV == 'prod') {
			flag = false
		} else {
			flag = true
		}
		if (0 != ret.code || compareVersions(info.data.version, ret.versionInfo.name) == 1 || flag ==
			true) {
			let count = 0;
			timer = setInterval(() => {
				if (count < 100 && count > 0) uni.$emit('showLoading', true, `初始化中... ${count}%`)
				else uni.$emit('showLoading', true, `初始化中... 99%`)
			}, 200)
			let downloadTask = uni.downloadFile({
				url: info.data.version_info?.dow_url,
				success(res) {
					wgtFile = res.tempFilePath;
					console.log('初始化完成', wgtFile);
					setTimeout(()=>{
					  installMP();
					  clearInterval(timer);
					  timer = null;
					}, 700)
				},
				fail(res) {
					clearInterval(timer);
					timer = null;
					uni.hideLoading();
				}
			});
			downloadTask.onProgressUpdate((res) => {
				// console.log('初始化进度' + res.progress);
				if (res.progress > count) count += 10;
				if (count >= 90) {
					clearInterval(timer);
					timer = null;
				}
			});
		} else {
			open()
		}
	});
};

//加载商城小程序
const loadMPx = async (id) => {
	
	appid = id;
	let info = await miniapp();
	console.log('最新版本', info.data);
	console.log(mp, uni);
	// return ;
	uni.$emit('showLoading', true, `初始化中...`)
	mp.getUniMPVersion(id, (ret) => {
		console.log('当前版本', ret);
		let flag;
		if (ENV == 'prod') {
			flag = false
		} else {
			flag = true
		}
		if (0 != ret.code || compareVersions(info.data.appInfo.version, ret.versionInfo.name) == 1 ||
			flag ==
			true) {
			let count = 0;
			timer = setInterval(() => {
				if (count < 100 && count > 0) uni.$emit('showLoading', true, `初始化中... ${count}%`)
				else uni.$emit('showLoading', true, `初始化中... 99%`)
			}, 200)

			let downloadTask = uni.downloadFile({
				url: info.data.appInfo.dow_url,
				success(res) {
					wgtFile = res.tempFilePath;
					console.log('初始化完成', wgtFile);
					setTimeout(()=>{
					  installMP();
					  clearInterval(timer);
					  timer = null;
					}, 700)
				},
				fail(res) {
					clearInterval(timer);
					timer = null;
					uni.hideLoading();
				}
			});
			downloadTask.onProgressUpdate((res) => {
				// console.log('初始化进度' + res.progress);
				if (res.progress > count) count += 10;
				if (count >= 90) {
					clearInterval(timer);
					timer = null;
				}
			});
		} else {
			open()
		}
	});
};

// 按信息接口加载小程序
const loadMPurl = async (e) => {
	appid = e.id;
  let FURL = e.url;
	uni.$emit('showLoading', true, `初始化中...`)
  uni.request({
    url: FURL,
    method: 'GET',
    success: (fileInfo) => {
      mp.getUniMPVersion(appid, (ret) => {
      	console.log('当前版本', ret);
      	let flag;
      	if (ENV == 'prod') {
      		flag = false
      	} else {
      		flag = true
      	}
      	if (0 != ret.code || compareVersions(fileInfo.data?.data?.version, ret.versionInfo.name) == 1 || flag ==
      		true) {
      		let count = 0;
      		timer = setInterval(() => {
      			if (count < 100 && count > 0) uni.$emit('showLoading', true, `初始化中... ${count}%`)
      			else uni.$emit('showLoading', true, `初始化中... 99%`)
      		}, 200)
      		let downloadTask = uni.downloadFile({
      			url: fileInfo.data?.data?.down_url,
      			success(res) {
      				wgtFile = res.tempFilePath;
      				console.log('初始化完成', wgtFile);
              setTimeout(()=>{
                installMP();
                clearInterval(timer);
                timer = null;
              }, 700)
      			},
      		  fail(res) {
      		    clearInterval(timer);
      		    timer = null;
      		    uni.hideLoading();
      		  }
      		});
      		downloadTask.onProgressUpdate((res) => {
      			// console.log('初始化进度' + res.progress);
      			if (res.progress > count) count += 10;
      			if (count >= 90) {
      				clearInterval(timer);
      				timer = null;
      			}
      		});
      	} else {
      		open()
      	}
      });
      
    },
    fail:(err)=> {
      console.log('错误:', err);
    }
  })
	
};

// 商城配置的小程序
const loadAppletMP = async (data) => {
	appid = data.app_id;
	// return ;
	uni.$emit('showLoading', true, '初始化中');
	mp.getUniMPVersion(appid, (ret) => {
		let flag;
		if (ENV == 'prod') {
			flag = false
		} else {
			flag = true
		}
		if (0 != ret.code || compareVersions(data.version, ret.versionInfo.name) == 1 || flag ==
			true) {
			let count = 0;
			timer = setInterval(() => {
				if (count < 100 && count > 0) uni.$emit('showLoading', true, `初始化中... ${count}%`)
				else uni.$emit('showLoading', true, `初始化中... 99%`)
			}, 200)
			let downloadTask = uni.downloadFile({
				url: data.url,
				success(res) {
					wgtFile = res.tempFilePath;
					console.log('初始化完成', wgtFile);
					setTimeout(()=>{
					  installMP();
					  clearInterval(timer);
					  timer = null;
					}, 700)
				},
				fail(res) {
					clearInterval(timer);
					timer = null;
					uni.hideLoading();
				}
			});
			downloadTask.onProgressUpdate((res) => {
				// console.log('初始化进度' + res.progress);
				if (res.progress > count) count += 10;
				if (count >= 90) {
					clearInterval(timer);
					timer = null;
				}
			});
		} else {
			open()
		}
	});
};

// 按远程文件地址加载小程序
const loadMPdns = async (e) => {
	appid = e.id;
  let FURL = e.url;
	uni.$emit('showLoading', true, `初始化中...`)
  let count = 0;
  timer = setInterval(() => {
  	if (count < 100 && count > 0) uni.$emit('showLoading', true, `初始化中... ${count}%`)
  	else uni.$emit('showLoading', true, `初始化中... 99%`)
  }, 200)
  let downloadTask = uni.downloadFile({
  	url: FURL,
  	success(res) {
  		wgtFile = res.tempFilePath;
  		console.log('初始化完成', wgtFile);
  		setTimeout(()=>{
  		  installMP();
        clearInterval(timer);
        timer = null;
  		}, 700)
  	},
    fail(res) {
      clearInterval(timer);
      timer = null;
      uni.hideLoading();
    }
  });
  downloadTask.onProgressUpdate((res) => {
  	// console.log('初始化进度' + res.progress);
  	if (res.progress > count) count += 10;
  	if (count >= 90) {
  		clearInterval(timer);
  		timer = null;
  	}
  });
	
};

// 小程序版本信息
const getVersion = (id) => {
	appid = id;
	return new Promise((resolve, reject) => {
		mp.getUniMPVersion(appid, (ret) => {
			console.log('供销', ret);
		});
	})
}
// 初始化小程序
const installMP = () => {
	mp.getUniMPVersion(appid, (ret) => {
		doInstallMP();
		console.log('getUniMPVersion: ' + JSON.stringify(ret));
	});
};
const doInstallMP = () => {
	mp.installUniMP({
		appid: appid,
		wgtFile: wgtFile
	}, (r) => {
		if (0 == r.code) {
			open();
		} else {
			uni.hideLoading();
			clearInterval(timer);
			timer = null;
			uni.showModal({
				title: '初始化失败',
				content: JSON.stringify(r),
				showCancel: false
			});
		}
		console.log('初始化: ' + JSON.stringify(r));
	});
};

const open = (id = null) => {
  uni.$emit('showLoading', false);
	let token = uni.getStorageSync('LOGIN_STATUS_TOKEN');
	if (!token) return uni.showToast({
		icon: 'none',
		title: '请先登录'
	})
	let avatar = store?.state?.userInfo?.avatar;
	mp.openUniMP({
		appid: id || appid,
		extraData: {
			uniMP: true,
			token: token,
			avatar: avatar,
		},
    // path: '/pages/index/index?unimp=true'
	}, (ret) => {
		uni.hideLoading();
		if (0 != ret.code) {
			uni.showModal({
				title: '启动失败',
				content: JSON.stringify(ret),
				showCancel: false
			});
		}
		console.log('openUniMP: ' + JSON.stringify(ret));
	});
}

export default {
	loadMP,
	loadMPurl,
	loadMPx,
  loadMPdns,
	installMP,
  loadAppletMP,
	doInstallMP,
	getVersion,
	open
}