var max = 200
var refreshHeight = 80
function touchstart(event, ins) {
	console.log('touchstart');
	var state = ins.getState()
	if ( state.refresh ) return
	var touch = event.touches[0] || event.changedTouches[0]
	state.startX = touch.pageX
	state.startY = touch.pageY
}
function touchmove(event, ins) {
	console.log('touchmove');
	var state = ins.getState()
	if ( state.refresh ) return
	if ( state.startY > 0) {
		var touch = event.touches[0] || event.changedTouches[0]
		if ((Math.abs(touch.pageY - state.startY) > Math.abs(touch.pageX - state.startX)) && Math.abs(touch.pageY - state.startY) > 20) {
			var pageY = touch.pageY
			var rate = max / (max + Math.abs(pageY - state.startY))
			state.threshold = rate * (pageY - state.startY)
			if ( state.threshold > 0 && !state.pulldownable ) return
			if ( state.threshold < 0 && !state.pullupable ) return
			if ( state.threshold > max ) {
				state.threshold = max
			}
			if ( state.threshold < -max ) {
				state.threshold = -max
			}
			ins.selectComponent('.yingbing-scroller-wrapper').setStyle({
				transform: 'translateY(' + state.threshold + 'px)',
				transition: ''
			})
			if ( state.threshold > 0 ) {
				ins.callMethod('pullingdown', state.threshold)
			} else {
				ins.callMethod('pullingup', Math.abs(state.threshold))
			}
		}
	}
}
function touchend(event, ins) {
	touchaction(event, ins)
}
function touchcancel(event, ins) {
	touchaction(event, ins)
}
function touchaction (event, ins) {
	var state = ins.getState()
	if ( state.refresh ) return
	if ( state.threshold > 0 && state.pulldownable ) {//下拉
		if ( state.threshold > refreshHeight ) {//满足下拉条件
			ins.selectComponent('.yingbing-scroller-wrapper').setStyle({
				transform: 'translateY(' + refreshHeight + 'px)',
				transition: 'transform .1s'
			})
			ins.callMethod('pulldown')
			state.refresh = true
		} else {//不满足下拉条件恢复样式
			stop(ins)
		}
	}
	if ( state.threshold < 0 && state.pullupable ) {//上拉
		if ( Math.abs(state.threshold) > refreshHeight ) {//满足上拉条件
			ins.selectComponent('.yingbing-scroller-wrapper').setStyle({
				transform: 'translateY(-' + refreshHeight + 'px)',
				transition: 'transform .1s'
			})
			ins.callMethod('pullup')
			state.refresh = true
		} else {//不满足上拉条件恢复样式
			stop(ins)
		}
	}
}
function stop (ins) {
	var state = ins.getState()
	ins.selectComponent('.yingbing-scroller-wrapper').setStyle({
		transform: 'translateY(0)',
		transition: 'transform .1s'
	})
	state.threshold = 0
	state.startY = 0
	state.refresh = false
}
function refreshStateWatcher (newVal, oldVal, ins) {
	if ( newVal == 'pulldown' ) {
		var state = ins.getState()
		state.threshold = refreshHeight + 1
		state.refresh = false
		touchaction(null, ins)
	}
	if ( newVal == 'pullup' ) {
		var state = ins.getState()
		state.threshold = -(refreshHeight + 1)
		state.refresh = false
		touchaction(null, ins)
	}
	if ( newVal == 'stop' ) stop(ins)
}
function pulldownableWatcher (newVal, oldVal, ins) {
	var state = ins.getState()
	if ( state ) state.pulldownable = newVal
}
function pullupableWatcher (newVal, oldVal, ins) {
	var state = ins.getState()
	if ( state ) state.pullupable = newVal
}
module.exports = {
	refreshStateWatcher: refreshStateWatcher,
	pulldownableWatcher: pulldownableWatcher,
	pullupableWatcher: pullupableWatcher,
	touchstart: touchstart,
	touchmove: touchmove,
	touchend: touchend,
	touchcancel: touchcancel
}