/*
eventDelayLock使用方法:
  事件防快速点击处理已放到common.js/controller中, 可以通过$.controller.eventDelayLock访问.
  事件锁为全局模式, 一旦触发锁状态, 在解开前任何用户操作事件都会被阻止.
  解锁提供两种模式:
  1. 延时自动解锁: 延时一段时间后自动解锁, 默认1000ms, 可自定义. 在锁状态新事件的触发会重新设置定时器.
  使用方法: 在事件回调的头部加入以下方法调用即可, 如果在锁状态会直接退出停止执行回调.
      // 第一个参数指定是否起用自动模式, true自动模式, false手动模式
      // 自动模式下第二个参数用来指定延时时间(ms), 缺省1000ms
      if ($.controller.eventDelayLock.lock(true, 1000)) {
          return;
      }
      // 或这样写更简洁
      ($.controller.eventDelayLock.lock(true, 1000)) && return;
  2. 手动解锁: 锁设置后不会自动解锁
      // 设置锁
      if ($.controller.eventDelayLock.lock(false)) {
          return;
      }
      // 清空锁状态, 同时清空定时器
      $.controller.eventDelayLock.unLock();
*/

// 取设备系统: IOS, ANDROID
let _getPlatform = function () {
    let _platform = '';
    let _sysInfo = wx.getSystemInfoSync();
    if (_sysInfo && _sysInfo.system) {
        let _system = _sysInfo.system.toUpperCase();
        if (_system.indexOf('IOS') >= 0) {
            _platform = 'IOS';
        } else if (_system.indexOf('ANDROID') >= 0) {
            _platform = 'ANDROID';
        }
    }
    return _platform;
};

// 防止按钮快速重复点击
// 在按钮点下时设置一个全局延时锁, 在锁关闭前不响应用户操作, 在1000ms的时间后锁会自动复位。
let eventDelayLock = (function () {
    // 延时时间, ms
    let _defaultDelayTime = 1000;
    // 锁状态
    let _eventDelayLock = false;
    // 是否自动解锁
    let _autoUnlock = true;
    // 定时器
    let _lockTimer = 0;
    // 上锁的时间
    let _lockTime = 0;
    // 解锁时间
    let _unLockTime = 0;
    let _delayTime = 0;
    // 定时器类
    let _lock = {};

    // 不同平台特殊处理
    let _platform = _getPlatform();
    if (_platform == 'IOS') {
        _defaultDelayTime = 500;
    }
    // 是否锁状态: true是, false不是
    // _ifAutoUnlock: 是否自动解锁, 必须提供, 不自动解锁默认时间是10秒
    // _delay: 解锁延时ms, 缺省_defaultDelayTime
    _lock.lock = function (_ifAutoUnlock, _delay) {
        let _t = Date.now();
        let _curLockState = _eventDelayLock;
        // 时间超过预定解锁时间, 不论是否自动解锁都返回解锁状态
        // 如果事件触发的间隔非常短, 这种情况不可能是人为的, 可能是因为事件多层绑定重复触发的, 这种情况就不用上锁
        // 人手点击的最高记录是17, 50ms可以保证不可能是人触发的
        let _validT = 50;
        if (_t >= _unLockTime || _t < _lockTime + _validT) {
            _curLockState = false;
            _eventDelayLock = false;
        }
        // 不在锁状态, 新的设置请求才会起作用
        if (!_curLockState) {
            _eventDelayLock = true;
            _autoUnlock = _ifAutoUnlock;
            _lockTime = _t;
            // 不自动解锁的默认时间是10秒
            !_autoUnlock && (_delay = 10000);
            _delayTime = _delay || _defaultDelayTime;
            _unLockTime = _lockTime + _delayTime;
        }
        return _curLockState;
    };
    // 清空锁状态, 同时清空定时器
    // _force: 立即解锁
    _lock.unLock = function (_force) {
        if (_force) {
            _eventDelayLock = false;
            _lockTime = 0;
            _unLockTime = 0;
        } else {
            // 锁之后解锁的最短时间
            var _minTime = _delayTime;
            if (_minTime > 300) {
                _minTime = 300;
            }
            // 避免太快解锁
            let _dt = Date.now() - _lockTime;
            if (_dt >= _minTime) {
                _eventDelayLock = false;
                _lockTime = 0;
                _unLockTime = 0;
            } else {
                setTimeout(function () {
                    _eventDelayLock = false;
                    _lockTime = 0;
                    _unLockTime = 0;
                }, _minTime - _dt);
            }
        }
    };
    _lock.getState = function () {
        return _eventDelayLock;
    };
    return _lock;
})();

export default eventDelayLock;
