/** 用戶位置信息 */
import {
	getUserRegion
} from '@/api/system'
// import store from '@/store'

/** 用戶手机定位 */
let mLocation = {
	lat: null,
	lng: null
}

/** 用户地址回调 */
let callFunction = null

export async function mGetPosition() {
	let getCurPages = getCurrentPages()
	let getRoute = getCurPages.length > 0 ? getCurPages[0].route : ''
	const client_hash = uni.getStorageSync('client_hash')

	if (mLocation.lat && mLocation.lng) {
		return mLocation
	}
	if (!client_hash && getRoute == 'pages/page/login/index') {
		return null
	}
	let getObj = await new Promise(resolve => {
		uni.getLocation({
			type: 'gcj02',
			success: res => resolve(res),
			fail: e => {
				console.log('获取位置失败！', e)
			}
		})
	})

	mLocation = getObj
	mLocation.lat = getObj.latitude
	mLocation.lng = getObj.longitude

	return mLocation
}

/** 腾讯地图定位 */
// 初始化或更新用户位置信息缓存
let positionType = null
let retryNum = 1

export function getPosition(callFn) {
	if (callFn) {
		callFunction = callFn
	}
	mGetPosition().then(res => {
		showPosition()
	})
}

function showPosition() {
	if (retryNum > 6) return false
	let userRegion = uni.getStorageSync('userRegion')
	let intervalTime = 30 * 60 * 1000 // 默认半小时过期
	// 判断是否已存在位置信息缓存
	if (userRegion) {
		userRegion = JSON.parse(userRegion)
		// 获取后台返回的有效时间间隔
		let timesTamp = new Date().getTime()
		if (userRegion.expire * 1000 > timesTamp) {
			intervalTime = userRegion.expire * 1000 - timesTamp
			retryNum = 1
		} else {
			intervalTime = 10000
			retryNum++
		}
	}

	if (mLocation.lat && mLocation.lng) {
		positionType = 'mobile'
		if (userRegion) {
			// 当前时间大于等于过期时间(超过有效时间间隔后)重新请求接口更新缓存
			if (callFunction) {
				callFunction(userRegion)
			}
			callFunction = null
			setTimeout(() => {
				fetchPosition(mLocation)
			}, intervalTime)
		} else {
			// 页面首次渲染请求接口设置缓存
			fetchPosition(mLocation)
		}
	}
}

// 根据用户经纬度请求用户位置信息
function fetchPosition(position) {
	if (!position.lat && !position.lng) {
		console.error('获取经纬度失败!')
		return false
	}

	uni.setStorageSync('miscPosition', JSON.stringify(position))
	let params = {
		lng_lat_type: positionType,
		lat: position.lat,
		lng: position.lng
	}
	getUserRegion(params).then(res => {
		if (res.status === 'success') {
			// 设置或更新用户位置信息缓存
			if (callFunction) {
				callFunction(res.data)
			}
			callFunction = null
			uni.setStorageSync('userRegion', JSON.stringify(res.data))
			// 提交用户位置信息状态
			// store.commit('FETCH_USER_REGION', res.data)
			showPosition()
		}
	})
}

export default {
	mLocation,
	mGetPosition,
	getPosition
}
