var ble = require('../../services/ble')
var http = require('../../utils/request')
var app = getApp()
var SCAN_TIMEOUT = 15000

Page({
  data: {
    statusBarHeight: 44,
    deviceId: '',
    bindToken: '',
    state: 'scanning',
    error: '',
  },

  onBack: function () {
    wx.navigateBack({
      fail: function () {
        wx.reLaunch({ url: '/pages/index/index' })
      }
    })
  },

  onLoad: function (options) {
    this.setData({ statusBarHeight: app.globalData.statusBarHeight })
    this.setData({
      deviceId: decodeURIComponent(options.device_id || ''),
      bindToken: decodeURIComponent(options.bind_token || '')
    })
    this.startBleConnect()
  },

  onUnload: function () {
    clearTimeout(this._scanTimer)
    clearTimeout(this._retryTimer)
    ble.stopScan()
    if (this._onBindResult) {
      ble.off('bind_result', this._onBindResult)
      this._onBindResult = null
    }
    if (this.data.state !== 'done') {
      ble.disconnect()
    }
  },

  startBleConnect: function () {
    var self = this
    self.setData({ state: 'scanning', error: '' })

    self._scanTimer = setTimeout(function () {
      ble.stopScan()
      self.setData({ state: 'error', error: '搜索超时，请确认设备已开机并在附近' })
    }, SCAN_TIMEOUT)

    ble.startScan({
      targetDeviceId: self.data.deviceId,
      onFound: function (device) {
        clearTimeout(self._scanTimer)
        self.setData({ state: 'connecting' })
      },
      onConnected: function (device) {
        clearTimeout(self._scanTimer)
        self.setData({ state: 'binding' })
        self.doBind()
      },
      onError: function (err) {
        clearTimeout(self._scanTimer)
        self.setData({ state: 'error', error: err.msg || '连接失败' })
      }
    })
  },

  doBind: function () {
    var self = this
    var userId = app.globalData.userId || ''
    this._onBindResult = function (result) {
      if (result.success) {
        http.post('/api/v1/device/bind/confirm', {
          device_id: self.data.deviceId,
          bind_token: self.data.bindToken
        }).then(function () {
          self.setData({ state: 'done' })
          wx.redirectTo({
            url: '/pages/bind-success/bind-success?device_id=' + self.data.deviceId
          })
        }).catch(function (err) {
          self.setData({ state: 'error', error: err.message || '后台确认绑定失败' })
        })
      } else {
        self.setData({ state: 'error', error: '设备绑定失败' })
      }
    }
    ble.on('bind_result', this._onBindResult)

    ble.bindDevice(userId, self.data.bindToken).catch(function (err) {
      self.setData({ state: 'error', error: err.error_msg || '绑定命令失败' })
    })
  },

  onRetry: function () {
    var self = this
    if (self._onBindResult) {
      ble.off('bind_result', self._onBindResult)
      self._onBindResult = null
    }
    ble.disconnect()
    self._retryTimer = setTimeout(function () {
      self.startBleConnect()
    }, 1000)
  },

})
