import CryptoJS from "crypto-js";
import * as uuid from "uuid";
import {
	postJson
} from "@/utils/requests.js"
import pageData from "@/static/json/page.json"
import {
	jsonString
} from "../uni_modules/uv-ui-tools/libs/function/test";
import '@batiao/batiao-sdk-uniapp-unimp';
export default {
	install(app, options) {



		// 水印
		app.config.globalProperties.$watermark = () => {
			// if(app.config.globalProperties.$isChristmasPeriod()){
			// 	return "/static/lottie/christmas.json"
			// }else{
			return "/static/lottie/watermark.json"
			// }
		}

		app.config.globalProperties.$apiUserEvent = async (type, adminData, uniData) => {
			if (type != 'uni') {
				if (!adminData.prefix) {
					adminData.prefix = ".uni.alipay."
				}
				await postJson('a', 'api/user/event', {
					type: adminData.type,
					key: adminData.type + adminData.prefix + adminData.key,

					value: adminData.value,
					extra: JSON.stringify({
						uni_version: app.config.globalProperties.$version,
						...adminData.extra
					}),
				})
			}
		}

		app.config.globalProperties.$toFiexd = (num, index = 2) => { //保留小数
			return Number(num).toFixed(index)
		}

		// 跳转页面方法
		app.config.globalProperties.$goRechargePage = (type, source = 'uni_alipay_other') => { //保留小数
			let pages = getCurrentPages();
			let currentPage = pages[pages.length - 1];
			let currentUrl = currentPage.route;
			currentUrl = pageData[currentUrl]
			if (type) {
				// 点击水印
				app.config.globalProperties.$apiUserEvent('all', {
					type: "click",
					key: type,
					value: type != "watermark" ? "关闭水印" : "点击右下角水印图标",
					extra: {
						page: currentUrl
					}
				}, {
					type: 'click_' + type,
					data: {
						page: currentUrl
					}
				})
			}
			// 进入页面
			app.config.globalProperties.$apiUserEvent('all', {
				type: "event",
				key: "payment_onload",
				value: "进入充值页面",
				extra: {
					from: currentUrl
				}
			}, {
				type: 'payment_onload',
				data: {
					from: currentUrl
				}
			})
			uni.navigateTo({
				url: '/pages/common/recharge/index?source=' + source
			});
		}


		app.config.globalProperties.$isVip = () => {
			let user = uni.getStorageSync('userInfo')
			if (user.vip >= 2) {
				return false
			} else {
				return true
			}
		}



		//解密
		const deCode = (str) => {
			const key = CryptoJS.enc.Utf8.parse(uni.getStorageSync('decrypt'));
			const iv = key.clone();
			iv.sigBytes = 16;
			iv.clamp();
			let res = CryptoJS.AES.decrypt(str, key, {
				iv,
				mode: CryptoJS.mode.CBC,
				padding: CryptoJS.pad.Pkcs7,
			}).toString(CryptoJS.enc.Utf8);
			res = JSON.parse(res);
			return res;
		};
		// 加密签名
		const sign = (config) => {
			let key = uni.getStorageSync('encrypt')
			const method = config.method;
			if (!config.data) {
				config.data = {};
			}
			config.data.timestamp = Math.floor(new Date().getTime() / 1000);
			config.data.nonce = uuid.v4();
			if (
				method === "GET" ||
				method === "DELETE" ||
				method === "get" ||
				method === "delete"
			) {
				const keys = Object.keys(config.data);
				keys.sort();
				for (const i in keys) {
					keys[i] = keys[i] + "=" + encodeURIComponent(config.data[keys[i]]);
				}
				const temp = keys.join("&") + "&" + CryptoJS.MD5(key).toString();
				config.data.signature = CryptoJS.MD5(temp).toString();
			} else if (
				method === "POST" ||
				method === "PUT" ||
				method === "post" ||
				method === "put"
			) {
				if (!config.data) {
					config.data = {};
				}
				const keys = Object.keys(config.data);
				keys.sort();
				for (const i in keys) {
					keys[i] = keys[i] + "=" + encodeURIComponent(config.data[keys[i]]);
				}
				let temp = keys.join("&");
				temp += "&" + JSON.stringify(config.data);
				temp += "&" + CryptoJS.MD5(key).toString();
				config.data.signature = CryptoJS.MD5(temp).toString();
			}
			console.log("config:", config)
			return config
		};

		// 请求
		app.config.globalProperties.$requestPromise = async (data,isCode=true) => {
			let isTest = uni.getStorageSync('isTest')
			//头部header（浅拷贝，避免改到 storage 缓存对象）
			let header = { ...(uni.getStorageSync('header') || {}) }
			//请求地址
			let host
			// #ifdef H5
			host =  data.url
			// #endif
			// #ifndef H5
			host = uni.getStorageSync('host') + data.url
			// #endif
			// 签名
			if(isCode){
				if(isTest){
					data = sign(data)
				}
				
			}else{
				host="http://10.3.0.24:9209/"+ data.url
				header['x-token']="bdf87a98-eef0-47df-9faf-41d547b0457e"
			}
			// 排序
			const sortedKeys = Object.keys(data.data).sort();
			let str = ''
			for (const key of sortedKeys) {
				str += '&' + key + '=' + encodeURIComponent(
					data.data[key] == null ? '' : String(data.data[key])
				);
			}
			str = str.replace('&', '?')
			// 拼接URL
			if(isTest){
				host = host + str
			}
			// 鸿蒙 GET/DELETE 若再传 data 会二次拼进 query，导致参数异常；参数已在 URL 中
			let requestData = data.data
			// #ifdef APP-HARMONY
			const method = (data.method || 'GET').toUpperCase()
			if (method === 'GET' || method === 'DELETE') {
				requestData = {}
			}
			// #endif
			// 测试环境用 uni.request，正式环境用宿主 nativeRequest
			const api = isTest
				? uni.request
				: (uni.nativeRequest || uni.request)
			const response = await new Promise((resolve, reject) => {
				api({
					url: host,
					method: data.method,
					data: requestData,
					params: requestData,
					header,
					success: res => {
						try {
							if(isCode&&isTest){
									res.data = deCode(res.data.data)
							}
						} catch (err) {
		
						}
						resolve(res.data);
					},
					fail: e => {
						reject(e);
					}
				});
			});
			return response;
		};

		app.config.globalProperties.$getUserInfo = async () => {
			try {
				let user = await app.config.globalProperties.$requestPromise({
					url: 'api/user',
					method: "GET",
					data: {}
				})
				console.log("模拟请求：", JSON.stringify(user))
				if (user.code == 0) {
					uni.setStorageSync('AppUser', user.data)
					uni.setStorageSync('userInfo', user.data)
				}
			} catch (error) {
				//TODO handle the exception
			}
		}
		// 上传图片
		app.config.globalProperties.$uploadImage = async (filePath) => {
			//头部header
			let header = uni.getStorageSync('header')
			//请求地址
			let host = uni.getStorageSync('host') + 'api/image/segment'
			header['content-type'] = "multipart/form-data"

			// // 排序
			let data = {
				method: 'POST',
				data: {},
				url: 'api/image/segment'
			}
			data = sign(data)
			const sortedKeys = Object.keys(data.data).sort();
			let str = ''
			for (const key of sortedKeys) {
				str += '&' + key + '=' + encodeURIComponent(data.data[key]);
			}

			str = str.replace('&', '?')
			// 拼接URL
			host = host + str
			console.log(host);
			console.log(data);
			uni.uploadFile({
				url: host,  // 完整URL
				filePath: filePath,
				name: 'file',
				method: "POST",
				header: header,
				formData: {
					...data.data
				},
				success: (res) => {
					console.log('1.上传成功:', JSON.stringify(res));

				},
				fail: (err) => {
					console.error('2. 错误详情:', JSON.stringify(err));
				},
				complete: (res) => {
					console.log('3. 上传完成');
				}
			});
		};

		app.config.globalProperties.$imageUpload = async (imagePath) => {
			return new Promise((resolve, reject) => {
				postJson('a', 'api/image/segment/base64', {
					file: imagePath
				}).then(res => {
					resolve(res)
				}).catch(err => {
					reject(err)
				})
			})
		};
	}
};