<template>
	<view class="page-web">
		<web-view ref='webview' :webview-styles="webviewStyles" @message="handleMessage" :src="src"></web-view>
	</view>
</template>

<script>
import { loadLocation } from './tools'
import { CheckContactPermission, SelectContact, CheckUniFace } from './authPermission'
import { UploadFile } from './utils/uploads'
import Permission from '@/js_sdk/wa-permission/permission' //权限工具类
import config from '@/config/api'
const LF = uni.requireNativePlugin('AThree-LFv2')
let reloadTimeOut = null
let token = uni.getStorageSync('token')


export default {
	name: "WEB",
	data() {
		return {
			src: config['h5'],
			wv: null,
			isLogin: token,
			canBack: false,
			webviewStyles: {
				progress: {
					color: '#5688E8'
				}
			},
			deviceStatus: '',
			typePage: false,
		};
	},
	onBackPress(e) {
		if (this.wv && this.canBack) {
			this.wv.back()
			return true
		}
		return false
	},
	onReady() {
		const _that = this
		// #ifdef APP-PLUS
		//此对象相当于html5plus里的plus.webview.currentWebview()。在uni-app里vue页面直接使用plus.webview.currentWebview()无效
		let currentWebview = _that.$scope.$getAppWebview();
		setTimeout(() => {
			this.wv = currentWebview.children()[0]
			// 物理按键返回
			_that.wv.addEventListener(
				'loaded',
				() => {
					_that.wv.canBack((e) => {
						_that.canBack = e.canBack
					})

					const subNvue = uni.getSubNVueById('loadingSubnvue'); //通过id获取nvue子窗体
					subNvue.hide();
				},
				false
			)
		}, 1000) //如果是页面初始化调用时,需要延时一下
		// #endif
	},
	onTabItemTap(e) {
		try {
			console.log('tabItemTap')
			const config = JSON.parse(uni.getStorageSync('APP-SETTING'));
			const that = this;
			const timestamp = new Date().getTime()
			setTimeout(() => {
				const token = uni.getStorageSync('tokenFinance')
				const mobile = uni.getStorageSync('l-mobile')
				const $src = config['h5Url'] + `?token=${token}&mobile=${mobile}&timestamp=${timestamp}`
				console.log($src,'刷新的地址')
				that.src = $src
			}, 100);
		} catch (err) {
			console.log(err)
		}
		// this.wv && this.wv.evalJS(`callback({ 'action': 'OnShow' })`)
	},
	async onLoad(option) {
		try {
			console.log(option,'入参')

			this.subnvue_open();
			const that = this;
			const config = JSON.parse(uni.getStorageSync('APP-SETTING'));
			const timestamp = new Date().getTime()
			setTimeout(() => {
				const token = uni.getStorageSync('tokenFinance')
				const mobile = uni.getStorageSync('l-mobile')
				const $src = config['h5Url'] + `?token=${token}&mobile=${mobile}&timestamp=${timestamp}`
				
				console.log($src,'首次加载的地址')
				
				that.src = $src
			}, 100);

			uni.getStorage({
				key: 'm-device-info',
				success: function (res) {
					const { device } = JSON.parse(res.data)
					that.deviceStatus = device
				}
			})
		} catch (err) {
			console.log(err, 'onLoad执行报错')
		}


	},
	onHide() {
		const user_info_obj = uni.getStorageSync('user_info_obj') ? JSON.parse(uni.getStorageSync('user_info_obj')) : {}
		uni.setStorageSync('user_info_obj', JSON.stringify(user_info_obj));
	},
	onShow() {

		if (uni.getStorageSync('canRefreshWeb')) {
			uni.removeStorageSync('canRefreshWeb')
			if (this.wv) {
				// 为OCR做的刷新
				const needReload = uni.getStorageSync('reloadFlag')			
				if (!needReload) {
					if (reloadTimeOut) clearTimeout(reloadTimeOut)
					reloadTimeOut = setTimeout(() => {
						console.log('页面刷新了1')
						this.wv.reload()
					}, 1000)
				}
			}
		}
		

		
		// const canRefresh = uni.getStorageSync('canRefresh');
		// console.log(canRefresh, '是否需要刷新-这里为做的刷新')
		// if (canRefresh) {
		// 	uni.removeStorageSync('canRefresh')
		// 	if (reloadTimeOut) clearTimeout(reloadTimeOut)
		// 	reloadTimeOut = setTimeout(() => {
		// 		console.log('页面刷新了2')
		// 		this.wv && this.wv.reload()
		// 	}, 400)
		// }

	},
	onUnload() {
		uni.$off('loadingSubnvue'); //移除监听配置的原生子窗体
	},
	methods: {

		subnvue_open() {
			this.subNVue = uni.getSubNVueById('loadingSubnvue'); //通过id获取nvue子窗体
			this.subNVue.show();
		},

		handleMessage(e) {
			const data = e.detail.data;
			if (!data || data.lenght === 0) {
				this.toast('调用APP方法报错');
				return;
			}
			const {
				name,
				params
			} = data[0];
			if (!name) {
				this.toast('缺少方法名', 'error')
				return
			}
			if (this.isLogin) {
				if (params) {
					this[name](params)
				} else {
					this[name]()
				}
			}
		},
		UserToken(token) {
			uni.setStorage({
				key: 'm-token',
				data: token,
				success: () => {
					console.log('m-token存储成功');
				}
			})
		},
		// 删除localtabbar
		removeRefreshStorage() {
			uni.removeStorageSync('hasRefresh')
			console.log('删除了hasRefresh')
		},
		// 隐藏tabbar
		hideLoading() {
			// console.log('调用了APP的hideLoading方法')
			uni.hideLoading()
		},
		// 隐藏tabbar
		hideTabBar() {
			uni.hideTabBar()
		},
		// 显示tabbar
		showTabBar() {
			uni.showTabBar()
		},
		// 获取当前WebView实例
		GetWebView() {
			const currentWebview = this.$scope.$getAppWebview();
			let wv = currentWebview.children()[0];
			return wv;
		},
		// 获取状态栏高度
		GetStatusBarHei() {
			try {
				const windowInfo = uni.getWindowInfo()
				const {
					statusBarHeight
				} = windowInfo;
				this.GetWebView().evalJS("receiveStatusBarHei('" + statusBarHeight + "')")
			} catch (err) {
				console.log(err, '什么错')
				this.toast('获取状态栏高度报错')
			}
		},
		// 获取用户手机号
		GetUserMobile() {
			const self = this
			try {
				uni.getStorage({
					key: 'l-mobile',
					success: function (res) {
						console.log(res, '结果')
						const mobile = res.data;
						self.GetWebView().evalJS("receiveUserMobile('" + mobile + "')")
					},
					fail: function (err) {
						console.log(err, '报错了')
					}
				})

				// const mobileCell = uni.getStorageSync('d-mobile')
				// this.GetWebView().evalJS(`receiveUserMobile('${mobileCell}')`)
			} catch (err) {
				console.log(err, '什么错')
				self.toast('获取用户手机号报错')
			}
		},
		// 拨打电话
		MakeCall(num) {
			try {
				uni.makePhoneCall({
					phoneNumber: num
				});
			} catch (err) {
				this.toast('拨打电话报错')
			}
		},
		// Toast提示框
		toast(title, type) {
			uni.showToast({
				icon: type ? type : "none",
				title
			})
		},
		//返回方法
		GoBack(num) {
			console.log('wori')
			try {
				const self = this
				uni.navigateBack({
					delta: num,
					success(res) {
						console.log(res, '9877')

						self.typePage = true
						console.log(self.typePage, 'resss')
					}
				})
			} catch (err) {
				this.toast('返回失败')
				console.log(err, 'err')
			}

		},
		// 设置缓存
		SetLocalStore(config) {
			try {
				if (!config) return
				const { key, val } = config
				uni.setStorageSync(key, val)
			} catch (err) {
				console.log(err, '设置本地存储报错')
			}
		},
		// Toast 提示框
		Toast(config) {
			try {
				uni.showToast({
					...config
				})
			} catch (err) {
				this.toast('提示框报错')
			}
		},
		// 实名认证正面
		Camera_OCR_Front(config) {
			console.log('实名认证前面', config)
			// 检查相机权限
			// if (!this.CheckCamera()) return;
			console.log('哈哈哈')
			const that = this;
			try {
				console.log(LF, '忍忍')
				LF.Camera_UP({
					...config
				}, async (res) => {
					console.log(res, 'res-front1')
					if (res.code == 1 && res.info) {
						let chacheImg = res.standardImage.replace(/\n/g, '')
						if (res.info && res.info.rectifiedImage) delete res.info.rectifiedImage;
						const result = {
							info: res.info
						}
						UploadFile(config, `data:image/png;base64,${chacheImg}`).then(file => {
							result.fileUrl = file.fileUrl
							if (file.statusCode === 200) {
								that.wv.evalJS(`receiveOcrFront('${JSON.stringify(result)}')`)
								uni.showToast({
									icon: "success",
									title: "图片上传成功"
								})
							} else {
								uni.showToast({
									icon: "success",
									title: "图片上传失败"
								})
							}
						}).catch(err => {
							console.log(err)
							uni.showToast({
								icon: 'error',
								title: "图片上传失败"
							})
						})

					} else if (res.code == 10) {
						uni.showToast({
							icon: "none",
							title: "请重拍一张照片试一试"
						})
					} else {
						uni.showToast({
							icon: "none",
							title: "请重拍一张照片试一试"
						})
					}
				})
			} catch (err) {
				console.log(err, 'OCR识别错误')
			}
		},

		// 实名认证反面
		Camera_OCR_Back(config) {
			// 检查相机权限
			// if (!this.CheckCamera()) return;
			const that = this;
			try {
				LF.Camera_UP({
					...config
				}, (res) => {
					if (res.code == 1 && res.info) {
						let chacheImg = res.standardImage.replace(/\n/g, '')
						if (res.info && res.info.rectifiedImage) delete res.info.rectifiedImage;
						const result = {
							info: res.info
						}
						UploadFile(config, `data:image/png;base64,${chacheImg}`).then(file => {
							result.fileUrl = file.fileUrl
							if (file.statusCode === 200) {
								that.wv.evalJS(`receiveOcrBack('${JSON.stringify(result)}')`)
								uni.showToast({
									icon: "success",
									title: "图片上传成功"
								})
							} else {
								uni.showToast({
									icon: "success",
									title: "图片上传失败"
								})
							}
						}).catch(err => {
							console.log(err)
							uni.showToast({
								icon: 'error',
								title: "图片上传失败"
							})
						})



					} else if (res.code == 10) {
						uni.showToast({
							icon: "none",
							title: "请重拍一张照片试一试"
						})
					} else {
						uni.showToast({
							icon: "none",
							title: "请重拍一张照片试一试"
						})
					}
				})
			} catch (err) {
				console.log(err, 'OCR识别错误')
			}
		},

		// 专门为OCR页面做的
		SetReloadFlag(flag) {
			if (flag === 'NO') {
				uni.setStorageSync('reloadFlag', 'true')
			} else {
				if (uni.getStorageSync('reloadFlag')) uni.removeStorageSync('reloadFlag')
			}
		},


		// 隐藏导航了
		HideNavBar() {
			try {
				let pages = getCurrentPages();
				let page = pages[pages.length - 1];
				let currentWebView = page.$getAppWebview();
				let titleNView = currentWebView.getStyle().titleNView;
				console.log(titleNView, 'titleNView的值')
				currentWebView.setStyle({
					titleNView: false
				})
			} catch (err) {
				this.toast('隐藏导航报错')
			}
		},
		// 显示导航了
		ShowNavBar() {
			try {
				let pages = getCurrentPages();
				let page = pages[pages.length - 1];
				let currentWebView = page.$getAppWebview();
				let titleNView = currentWebView.getStyle().titleNView;
				console.log(titleNView, 'titleNView的值')
				currentWebView.setStyle({
					titleNView: {}
				})
			} catch (err) {
				this.toast('显示导航报错')
			}
		},

		// 活体认证    
		async Camera_Live(config) {
			// 检查相机权限
			// if (!this.CheckCamera()) return;
			const that = this;
			try {
				LF.Face_UP({
					...config
				}, (res) => {
					if (res.code === 1000) {
						const {
							image
						} = res;
						const faceImage = image.replace(/\n/g, '')
						const result = `data:image/png;base64,${faceImage}`;

						UploadFile(config, result).then(file => {
							if (file.statusCode === 200) {
								const faceImgUrl = file.fileUrl;
								// 提交活体检测
								that.GetWebView().evalJS(
									`receiveLiveBack(${JSON.stringify({ fileUrl: faceImgUrl })})`
								)
							} else {
								uni.showToast({
									icon: "success",
									title: "认证失败"
								})
							}
						}).catch(err => {
							uni.showToast({
								icon: 'error',
								title: "认证失败"
							})
						})
					}
				})
			} catch (err) {
				console.log(err, 'LIVE活体识别错误')
			}
		},
		// 活体认证
		async uniFace(config) {
			console.log(config, 'config')
			uni.setStorageSync('userFData', config)
			// 检查相机权限
			// if (!this.CheckCamera()) return;
			const that = this;
			try {
				CheckUniFace((data) => {
					that.GetWebView().evalJS(`receiveUniFace('${JSON.stringify(data)}')`)
				})
			} catch (err) {
				console.log(err, '获取人脸失败')
			}

		},
		// 获取设备信息
		async GetDeviceInfo() {
			try {
				const res = await loadLocation();
				this.GetWebView().evalJS(`receiveGetDeviceInfo('${JSON.stringify(res)}')`)
			} catch (err) {
				console.log(err, '设备信息报错')
				this.GetWebView().evalJS(`receiveGetDeviceInfo('${JSON.stringify(err)}')`)
			}
		},

		// 获取全部通讯录
		GetContacts() {
			const that = this;
			try {
				CheckContactPermission((data) => {

					that.GetWebView().evalJS(`receiveContactsBack('${JSON.stringify(data)}')`)
				})
			} catch (err) {
				console.log(err, '获取全部用户通讯录错误')
			}
		},

		// 通讯录选择
		PickContact() {
			const that = this;
			try {
				CheckContactPermission((data) => {
					SelectContact((contact) => {
						that.GetWebView().evalJS(`receivePickContactsBack('${JSON.stringify(contact)}')`)
					})
				})
			} catch (err) {
				console.log(err, '选择用户通讯录错误')
			}
		},

		// 图片选择上传
		PickImage(config) {
			console.log(config, '参数')
			const that = this;
			try {
				uni.chooseImage({
					count: 1,
					sourceType: ["album", "camera"],
					success: (res) => {
						if (res.tempFiles) {
							const file = res.tempFiles[0];
							UploadFile(config, file, true).then(file => {
								if (file.statusCode === 200) {
									const faceImgUrl = file.fileUrl;
									console.log(faceImgUrl, '上传成功后的地址')
									// 提交活体检测
									that.GetWebView().evalJS(`receiveImage(${JSON.stringify({ fileUrl: file.fileUrl })})`
									)
								} else {
									uni.showToast({
										icon: "success",
										title: "上传图片失败"
									})
								}
							}).catch(err => {
								uni.showToast({
									icon: 'error',
									title: "上传图片报错"
								})
							})
						}


					},
					fail: () => {
						console.log('选择图片报错')
					},
				});
			} catch (err) {
				console.log(err, 'H5调用PickImage方法报错')
			}
		},

		// 检查文件和相机权限
		async CheckFileAndCamera() {
			const that = this;
			if (plus.os.name == "iOS") {
				const iosFirstCamera = uni.getStorageSync("iosFirstCamera"); // 是不是第一次开启相机
				if (iosFirstCamera !== "false") {
					uni.setStorageSync("iosFirstCamera", "false"); // 设为false就代表不是第一次开启相机
				} else {
					if (!Permission.judgeIosPermission('camera') || Permission.judgeIosPermission('photoLibrary')) {
						that.GetWebView().evalJS(`receiveCheckFileAndCamera(${JSON.stringify({ flag: "false" })})`);
						return false
					}
				}
			} else {
				const cameraFlag = await Permission.requestAndroidPermission('android.permission.CAMERA');
				const fileFlag = await Permission.requestAndroidPermission('android.permission.READ_EXTERNAL_STORAGE');
				if (cameraFlag != 1 || fileFlag != 1) {
					that.GetWebView().evalJS(`receiveCheckFileAndCamera(${JSON.stringify({ flag: "false" })})`)
					return false
				}
			}
			that.GetWebView().evalJS(`receiveCheckFileAndCamera(${JSON.stringify({ flag: "true" })})`)
			return true;
		},

		// 检测相机权限
		async CheckCamera() {
			const that = this;
			if (plus.os.name == "iOS") {
				const iosFirstCamera = uni.getStorageSync("iosFirstCamera"); // 是不是第一次开启相机
				if (iosFirstCamera !== "false") {
					uni.setStorageSync("iosFirstCamera", "false"); // 设为false就代表不是第一次开启相机
				} else {
					if (!Permission.judgeIosPermission('camera')) {
						that.GetWebView().evalJS(`receiveCheckCamera(${JSON.stringify({ flag: "false" })})`);
						uni.showModal({
							title: "提示",
							content: "您已经关闭相机权限,去设置",
							success: function (res) {
								if (res.confirm) {
									Permission.gotoAppPermissionSetting();
								}
							},
						});
						return false
					}
				}
			} else {
				const result = await Permission.requestAndroidPermission('android.permission.CAMERA');
				if (result != 1) {
					uni.showModal({
						title: "提示",
						content: "您已经关闭相机权限,去设置",
						success: function (res) {
							if (res.confirm) {
								Permission.gotoAppPermissionSetting();
							}
						}
					})
					that.GetWebView().evalJS(`receiveCheckCamera(${JSON.stringify({ flag: "false" })})`)
					return false
				}
			}
			that.GetWebView().evalJS(`receiveCheckCamera(${JSON.stringify({ flag: "true" })})`)
			return true;
		}
	}
}
</script>

<style lang="less" scoped>
.page-web {
	width: 100vw;
	height: 100vh;

	web-view {
		width: 100%;
		height: 100%;
	}
}
</style>