/**
 * 跳判断相关脚本代码
 */

function Event() {
	this.events = {};
}
Event.prototype.addEventListener = function(type, listener) {
	this.events[type] = this.events[type] || [];
	this.events[type].push(listener);
};
Event.prototype.trigger = function() {
	for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
		args[_key] = arguments[_key];
	}

	var type = args[0];
	var params = args.slice(1);
	if (!!this.events[type]) {
		// console.log("type:",type);
		this.events[type].forEach(function(listener) {
			try {
				listener.apply(null, params);
			} catch (e) {
				console.error(e);
			}
		});
	}
};
var jumpOpts = {
	//是否上升的标志位
	isDirectionUp: false,
	//持续上升次数
	continueUpCount: 0,
	//上一点的持续上升的次数，为了记录波峰的上升次数
	continueUpFormerCount: 0,

	continueDownCount: 0,
	continueDownFormerCount: 0,

	//上一点的状态，上升还是下降
	lastStatus: false,
	//波峰值
	peakOfWave: 0,
	//波谷值
	valleyOfWave: 0,
	//检测到极快的波动的次数
	timeOfPeakCount: 0,
	//开始添加
	bUpdateTimeOfPeakCount: false,
	//开始更新的次数
	startCount: 0,
	//停止跳
	bStopJump: false,
	//上次传感器的值
	gravityOld: 0,

	bUpState: false,

	//开始时间
	startTime: 0,
	endTime: 0
}
var ActionJump = function ActionJump() {

	this.jumpOpts = jumpOpts;
	this.peakOfWaveMaxValue = 0;
	this.valleyOfWaveMinValue = 0;
	this.highestCount = 0;
	//陀螺仪
	this.oriGyroYArray = [];
	this.event = new Event();
	this.frameCapacity = 6;
	this.frame = [];
	this.frameLength = 5;
	this.frameOffset = 0;
	for (var i = 0; i < this.frameCapacity; ++i) {
		var o = new Object();
		o.maxValue = 0;
		o.gyroValue = 0;
		o.resultant = 0;
		this.frame.push(o);
	}
}
ActionJump.prototype.addEventListener = function(type, listener) {
	this.event.addEventListener(type, listener);
};

/**
 * 更新数据
 */
ActionJump.prototype.updateJump = function() {
	let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
	//使用三个轴的数据，计算重力轴的加速度。最后减去重力的加速度值
	//********加速计********
	let {
		lAccX,
		lAccY,
		lAccZ
	} = data.linearAcc;
	let {
		oAccX,
		oAccY,
		oAccZ
	} = data.oriAcc;
	let {
		oGyroX,
		oGyroY,
		oGyroZ
	} = data.oriGyro;
	let {
		bYAxis
	} = data;
	//oGyroX 在用的过程中方向相反，所以添加负号
	let _tempAxisData = bYAxis ? oGyroY : -oGyroX;
	this.detectorNewStep(data.resultant, lAccX, lAccY, lAccZ, oAccX, oAccY, oAccZ, data.runIndex, _tempAxisData);
};



/*
 *计算跳逻辑
 */
ActionJump.prototype.detectorNewStep = function(resultant, linearX, linearY, linearZ, oriX, oriY, oriZ, _runIndex,
	_oGyroY) {
	let _judgmentValue = oriZ;
	//判断resultant 一个阀值
	let limitResultant = 20;
	if (!this.jumpOpts.bStopJump) {
		if (resultant > limitResultant && !this.jumpOpts.bUpState) {
			this.jumpOpts.bUpState = true;
			this.highestCount = 0;
			//陀螺仪部分
			// this.oriGyroYArray = [];
			//开始更新。加入时间判断
			this.jumpOpts.startTime = new Date().getTime();
			this.event.trigger('resultant', {
				type: "log",
				logType: 'normal',
				data: "开始时间:" + this.jumpOpts.startTime
			});
			for (let i = 0; i < this.frame.length; i++) {
				this.frame[i].maxValue = 0;
				this.frame[i].gyroValue = 0;
				this.frame[i].resultant = 0;
			}
		}
		if (this.jumpOpts.bUpState) {
			let currTime = new Date().getTime(); //当前时间
			let diffTime = currTime - this.jumpOpts.startTime; //当前时间减最初时间，得到当前时间差
			// if (diffTime > 500) {
			// 	//如果超时重置一下参数
			// 	this.jumpOpts.startTime = new Date().getTime();
			// 	for (let i = 0; i < this.frame.length; i++) {
			// 		this.frame[i].maxValue = 0;
			// 		this.frame[i].gyroValue = 0;
			// 		this.frame[i].resultant = 0;
			// 	}
			// };

			let newFrame = this.frame[(this.frameOffset + this.frameLength) % this.frameCapacity];

			if (_judgmentValue > 2) {
				newFrame.maxValue = _judgmentValue;
				if (_judgmentValue > this.peakOfWaveMaxValue)
					this.peakOfWaveMaxValue += _judgmentValue;
			} else if (_judgmentValue < -2) {
				newFrame.maxValue = _judgmentValue;
				if (_judgmentValue < this.valleyOfWaveMinValue)
					this.valleyOfWaveMinValue += _judgmentValue;
			}
			if (Math.abs(_oGyroY) > 5) {
				// this.oriGyroYArray.push(_oGyroY);
				newFrame.gyroValue = _oGyroY;
			}
			newFrame.resultant = resultant;

			//出现极值后
			// Math.abs(linearZ) < 7 &&
			if (Math.abs(resultant) < 7) {
				this.event.trigger('resultant', {
					type: "log",
					logType: 'normal',
					data: '出现极值后：' + resultant + ",时间:" + diffTime
				});
				// if (diffTime < 150){
				// this.jumpOpts.bUpState = false;
				// return;
				// };
				// this.event.trigger('resultant', {
				// 	type: "log",
				// 	logType:'normal',
				// 	data: "************触发成功************"
				// });

				this.highestCount++;
				if (this.highestCount >= 2) {
					//达到最高点，
					this.jumpOpts.bStopJump = true;
					this.jumpOpts.bUpdateTimeOfPeakCount = true;

					// let _currentMaxValue = 0;

					// if (Math.abs(this.peakOfWaveMaxValue) > Math.abs(this.valleyOfWaveMinValue)) {
					// 	_currentMaxValue = this.peakOfWaveMaxValue;
					// } else {
					// 	_currentMaxValue = this.valleyOfWaveMinValue;
					// }

					// let allOGyroValue = 0;
					// for (let i = 0; i < this.oriGyroYArray.length; i++) {
					// 	allOGyroValue += this.oriGyroYArray[i];
					// }
					// allOGyroValue /= this.oriGyroYArray.length;

					let _frameMaxValue = 0,
						_frameGyroValue = 0;
					for (let i = 0; i < this.frame.length; i++) {
						_frameMaxValue += this.frame[i].maxValue;
						_frameGyroValue += this.frame[i].gyroValue;
					}
					console.log("frame:" + _frameMaxValue + " == " + _frameGyroValue);

					//后面通用使用这个类型传输数据
					this.event.trigger('resultant', {
						type: "stateDataOfJump",
						currentMaxValue: _frameMaxValue,
						peakOfWaveMaxValue: this.peakOfWaveMaxValue,
						valleyOfWaveMinValue: this.valleyOfWaveMinValue,
						oGyroValue: _frameGyroValue / this.frame.length,
						resultant: resultant,
						name: "highestCountEnd"
					});
					// this.jumpOpts.bUpState = false;
					// this.jumpOpts.bStopJump = false;
					this.event.trigger('resultant', {
						type: "stop"
					});
					this.resetAll();
				}
			}
			if ((this.frameOffset += 1) >= this.frameCapacity) {
				this.frameOffset -= this.frameCapacity;
			}
		}
	} else if (this.jumpOpts.bUpdateTimeOfPeakCount) {
		// console.log("结束判断时候:" + resultant);
		this.jumpOpts.timeOfPeakCount++;
		//todo 如果直跳，可以调节更小的 limitTimeOfPeakCount 30
		let limitTimeOfPeakCount = 10;
		if (this.jumpOpts.timeOfPeakCount >= limitTimeOfPeakCount) {
			this.jumpOpts.timeOfPeakCount = 0;
			this.jumpOpts.bStopJump = false;
			this.jumpOpts.bUpState = false;
			// this.event.trigger('resultant', {
			// 	type: "stop"
			// });
			// this.resetAll();
			this.jumpOpts.bUpdateTimeOfPeakCount = false;
			// console.log("timeOfPeakCount >= " + limitTimeOfPeakCount);
		}
	}
}

ActionJump.prototype.setBUpState = function(value) {
	this.jumpOpts.bUpState = value;
}


//重置对应的参数
ActionJump.prototype.resetAll = function() {
	this.peakOfWaveMaxValue = 0;
	this.valleyOfWaveMinValue = 0;
	this.highestCount = 0;
}

if (typeof module === "object" && typeof module.exports === "object") {
	module.exports = ActionJump;
}
