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

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

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

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

  onUnload: function () {
    clearTimeout(this._scanTimer)
    ble.stopScan()
    if (this._onBindResult) ble.off('bind_result', this._onBindResult)
  },

  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({
      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 () {
    ble.disconnect()
    this.startBleConnect()
  },

  onMockConnect: function () {
    var self = this
    clearTimeout(this._scanTimer)
    ble.stopScan()
    self.setData({ state: 'binding' })
    http.post('/api/v1/device/mock-bind', {
      device_id: self.data.deviceId
    }).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 || '模拟绑定失败' })
    })
  },

  onMockBindSuccess: function () {
    this.onMockConnect()
  }
})
