import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

let lifeData = {}

try {
	// 尝试获取本地是否存在lifeData变量,第一次启动APP时是不存在的
	lifeData = uni.getStorageSync('lifeData')
} catch (e) {

}

// 需要永久存储,且下次APP启动需要取出的,在state中的变量名
let saveStateKeys = [
	'vuex_user',
	'vuex_token',
	'vuex_userData',
	'vuex_authOrgs',
	'vuex_isRemember',
	'vuex_isUsrAuthYs',
	'vuex_versionInfo',
];

// 保存变量到本地存储中
const saveLifeData = function(key, value) {
	// 判断变量名是否在需要存储的数组中
	if (saveStateKeys.indexOf(key) != -1) {
		// 获取本地存储的lifeData对象,将变量添加到对象中
		let tmp = uni.getStorageSync('lifeData');
		// 第一次打开APP,不存在lifeData变量,故放一个{}空对象
		tmp = tmp ? tmp : {};
		tmp[key] = value;
		// 执行这一步后,所有需要存储的变量,都挂载在本地的lifeData对象中
		uni.setStorageSync('lifeData', tmp);
	}
}

// websocket 连接
const SocketInit = function($store,state,wsUrl){
	// 开始连接
	state.vuex_socket = uni.connectSocket({
	    url: wsUrl, // ws 请求地址
	    complete: ()=> {
			console.log('连接complete回调!')
		}
	});
	// 打开连接
	state.vuex_socket.onOpen(function(e){
		console.log('连接成功!')
	})
	// 连接关闭
	state.vuex_socket.onClose(function(e){
		console.log('ws关闭!')
	})
	// 连接错误
	state.vuex_socket.onError(function(e){
		console.log('ws错误!', JSON.stringify(e))
	})
	// 接受消息
	state.vuex_socket.onMessage(function(e){
		if (e.data != 'pong'){
		  let ret = JSON.parse(e.data)
		  console.log('ws接收!', ret)
		  state.vuex_wsMessageData = ret
		  // 新未读消息
		  if (ret.type == 'no_read_count'){
			state.vuex_messagUnReadCount = ret.data.no_read_count
		  }
		}
	})
	// 发送心跳包
	state.vuex_heartInterId = setInterval(function() {
		if (state.vuex_socket.readyState != 1) {
			 // 停止心跳
			 clearInterval(state.vuex_heartInterId)
			 SocketInit($store,state,wsUrl)
			 uni.$emit('wsMessage','reconnect')
		} else {
			$store.commit("$sendWebsocket", "ping")
		}
	}, 20000)
}

// store 对象
const store = new Vuex.Store({
	// 下面这些值仅为示例,使用过程中请删除
	state: {
		// 如果上面从本地获取的lifeData对象下有对应的属性,就赋值给state中对应的变量
		// 加上vuex_前缀,是防止变量名冲突,也让人一目了然
		vuex_token: lifeData.vuex_token ? lifeData.vuex_token : '',
		vuex_userData: lifeData.vuex_userData ? lifeData.vuex_userData : '',
		vuex_authOrgs: lifeData.vuex_authOrgs ? lifeData.vuex_authOrgs : '',
		vuex_user: lifeData.vuex_user ? lifeData.vuex_user : {account:'',password:''},
		vuex_isRemember: lifeData.vuex_isRemember ? lifeData.vuex_isRemember : true,
		vuex_isUsrAuthYs: lifeData.vuex_isUsrAuthYs ? lifeData.vuex_isUsrAuthYs : false,
		vuex_versionInfo: lifeData.vuex_versionInfo ? lifeData.vuex_versionInfo : {}, // 版本信息
		vuex_changeOrg: null, // 要切换的org
		vuex_socket: null, // 消息通知ws对象
		vuex_wsMessageData: null, // 消息对象
		vuex_heartInterId: null, // 心跳id
		vuex_reConnectId: null, // 重连id
		vuex_messagUnReadCount: 0, // 消息未读数
		vuex_messagLaster: [], // 最新消息
		vuex_OrderAddress: {}, // 地址
		vuex_allLookUp: [],  //  数据字典
		vuex_paymentTypeList: [], // 收款方式
		vuex_salesSourceList: [], // 销售单据来源
		vuex_onlineFlagList: [], // 产品上线状态
		vuex_storeAuthState: [], // 门店审核状态
		vuex_shelfSettleType: [], // 门店审核结算方式
		vuex_tempPrintList:[], // 临时打印数据
		vuex_tempData: null, // 临时数据
		vuex_shelfOrderState: null, // 货架订单状态
		vuex_shuntBackList:null,//调回单临时存储数据
		vuex_systemSetList:null//对账单系统参数设置临时存储数据
	},
	mutations: {
		setShuntBackList(state,val){
			state.vuex_shuntBackList = val
		},
		$uStore(state, payload) {
			// 判断是否多层级调用,state中为对象存在的情况,诸如user.info.score = 1
			let nameArr = payload.name.split('.')
			let saveKey = ''
			let len = nameArr.length
			if (nameArr.length >= 2) {
				let obj = state[nameArr[0]]
				for (let i = 1; i < len - 1; i++) {
					obj = obj[nameArr[i]]
				}
				obj[nameArr[len - 1]] = payload.value
				saveKey = nameArr[0]
			} else {
				// 单层级变量,在state就是一个普通变量的情况
				state[payload.name] = payload.value
				saveKey = payload.name
			}
			// 保存变量到本地,见顶部函数定义
			saveLifeData(saveKey, state[saveKey])
		},
		// 创建通知消息websocket
		$webSocket(state, params) {
			let _this = this
			let userInfo = state.vuex_userData
			let url = getApp().globalData.baseUrl
			let wsBaseUrl = url.indexOf("https:")>=0 ? url.replace("https:","wss:") : url.replace("http:","ws:")
			let wsUrl = wsBaseUrl + 'websocket/app/' + 's' + userInfo.parentOrgId + 'o' + userInfo.orgId + 'u' + userInfo.userid + 'eapp'
			SocketInit(_this,state,wsUrl)
		},
		// 关闭websocket
		$closeWebsocket(state){
			if(state.vuex_socket){
				state.vuex_socket.close({
					complete: function(e){
						console.log('关闭websocket完成', e)
						// 停止心跳
						clearInterval(state.vuex_heartInterId)
					}
				})
			}
		},
		// 发送消息
		$sendWebsocket(state, msg) {
		    state.vuex_socket.send({
				data: msg,
				complete: function(e){
					console.log('ws发送完成', e)
				}
			})
		},
	}
})

export default store