import Vue from 'vue'

function vueTouch(el, binding, type) {
  var _this = this
  this.obj = el
  this.binding = binding
  this.touchType = type
  this.vueTouches = { x: 0, y: 0 }
  this.vueMoves = true
  this.vueLeave = true
  this.longTouch = true
  this.vueCallBack = typeof (binding.value) == 'object' ? binding.value.fn : binding.value
  this.obj.addEventListener('touchstart', function (e) {
    _this.start(e)
  }, false)
  this.obj.addEventListener('touchend', function (e) {
    _this.end(e)
  }, false)
  this.obj.addEventListener('touchmove', function (e) {
    _this.move(e)
  }, false)
}
vueTouch.prototype = {
  start: function (e) {
    this.vueMoves = true
    this.vueLeave = true
    this.longTouch = true
    this.vueTouches = { x: e.changedTouches[0].pageX, y: e.changedTouches[0].pageY }
    this.time = setTimeout(function () {
      if (this.vueLeave && this.vueMoves) {
        this.touchType == 'longtap' && this.vueCallBack(this.binding.value, e)
        this.longTouch = false
      }
    }.bind(this), 1000)
  },
  end: function (e) {
    var disX = e.changedTouches[0].pageX - this.vueTouches.x
    var disY = e.changedTouches[0].pageY - this.vueTouches.y
    clearTimeout(this.time)
    if (Math.abs(disX) > 10 || Math.abs(disY) > 100) {
      this.touchType == 'swipe' && this.vueCallBack(this.binding.value, e)
      if (Math.abs(disX) > Math.abs(disY)) {
        if (disX > 10) {
          this.touchType == 'swiperight' && this.vueCallBack(this.binding.value, e)
        }
        if (disX < -10) {
          this.touchType == 'swipeleft' && this.vueCallBack(this.binding.value, e)
        }
      } else {
        if (disY > 10) {
          this.touchType == 'swipedown' && this.vueCallBack(this.binding.value, e)
        }
        if (disY < -10) {
          this.touchType == 'swipeup' && this.vueCallBack(this.binding.value, e)
        }
      }
    } else {
      if (this.longTouch && this.vueMoves) {
        this.touchType == 'tap' && this.vueCallBack(this.binding.value, e)
        this.vueLeave = false
      }
    }
  },
  move: function (e) {
    this.vueMoves = false
  }
}
const tap = Vue.directive('tap', {
  bind: function (el, binding) {
    // eslint-disable-next-line no-new,new-cap
    new vueTouch(el, binding, 'tap')
  }
})
const swipe = Vue.directive('swipe', {
  bind: function (el, binding) {
    // eslint-disable-next-line no-new,new-cap
    new vueTouch(el, binding, 'swipe')
  }
})
const swipeleft = Vue.directive('swipeleft', {
  bind: function (el, binding) {
    // eslint-disable-next-line no-new,new-cap
    new vueTouch(el, binding, 'swipeleft')
  }
})
const swiperight = Vue.directive('swiperight', {
  bind: function (el, binding) {
    // eslint-disable-next-line no-new,new-cap
    new vueTouch(el, binding, 'swiperight')
  }
})
const swipedown = Vue.directive('swipedown', {
  bind: function (el, binding) {
    // eslint-disable-next-line no-new,new-cap
    new vueTouch(el, binding, 'swipedown')
  }
})
const swipeup = Vue.directive('swipeup', {
  bind: function (el, binding) {
    // eslint-disable-next-line no-new,new-cap
    new vueTouch(el, binding, 'swipeup')
  }
})
const longtap = Vue.directive('longtap', {
  bind: function (el, binding) {
    // eslint-disable-next-line no-new,new-cap
    new vueTouch(el, binding, 'longtap')
  }
})

export { longtap, swipeup, swipedown, swiperight, swipeleft, swipe, tap }
