var ble = require('../../services/ble')
var api = require('../../utils/api')
var app = getApp()

Page({
  data: {
    connected: false,
    deviceName: '',
    battery: 0,
    subscription: null,
    subRemaining: 0,
    modeState: '空闲',
    bleState: 'disconnected',
    hasDevice: false,
    deviceInfo: null,
    loading: true
  },

  onShow: function () {
    this.checkState()
    this._onStatus = this.onBleStatus.bind(this)
    this._onBattery = this.onBleBattery.bind(this)
    ble.on('status', this._onStatus)
    ble.on('battery', this._onBattery)
  },

  _cleanup: function () {
    if (this._onStatus) {
      ble.off('status', this._onStatus)
      this._onStatus = null
    }
    if (this._onBattery) {
      ble.off('battery', this._onBattery)
      this._onBattery = null
    }
  },

  onHide: function () {
    this._cleanup()
  },

  onUnload: function () {
    this._cleanup()
  },

  checkState: function () {
    var self = this
    var token = wx.getStorageSync('token')
    if (!token) {
      wx.reLaunch({ url: '/pages/login/login' })
      return
    }

    var isFirstLoad = self.data.loading
    self.setData({ connected: ble.isConnected() })

    var p1 = api.getDevices().then(function (data) {
      var devices = data.devices || []
      self.setData({ hasDevice: devices.length > 0 })
      if (devices.length > 0) {
        app.globalData.currentDevice = devices[0]
        self.setData({
          deviceName: devices[0].device_name || devices[0].device_id || '我的设备',
          deviceInfo: devices[0]
        })
      }
    }).catch(function (err) {
      console.error('getDevices failed', err)
    })

    var p2 = api.getSubscription().then(function (sub) {
      self.setData({
        subscription: sub,
        subRemaining: sub.remaining_days || 0
      })
    }).catch(function (err) {
      console.error('getSubscription failed', err)
    })

    Promise.all([p1, p2]).then(function () {
      if (isFirstLoad) self.setData({ loading: false })
    })
  },

  onBleStatus: function (status) {
    this.setData({
      battery: status.battery || 0,
      modeState: ble.getModeStateName(status.mode_state),
      connected: true,
      bleState: 'connected'
    })
  },

  onBleBattery: function (info) {
    this.setData({ battery: info.battery, connected: true })
  },

  onConnectBle: function () {
    var self = this
    self.setData({ bleState: 'scanning' })

    ble.startScan({
      onFound: function () {
        self.setData({ bleState: 'connecting' })
      },
      onConnected: function () {
        self.setData({ connected: true, bleState: 'connected' })
        ble.queryStatus().catch(function (err) {
          console.error('queryStatus failed', err)
        })
      },
      onError: function (err) {
        self.setData({ connected: false, bleState: 'error' })
        wx.showToast({ title: err.msg || '连接失败', icon: 'none' })
      }
    })
  },

  onAddDevice: function () {
    wx.navigateTo({ url: '/pages/scan/scan' })
  },

  onManageDevice: function () {
    var self = this
    wx.showActionSheet({
      itemList: ['解绑当前设备'],
      success: function (res) {
        if (res.tapIndex === 0) {
          wx.showModal({
            title: '确认解绑',
            content: '解绑后将无法使用该设备，确定要解绑吗？',
            success: function (modalRes) {
              if (modalRes.confirm) {
                self.doUnbind()
              }
            }
          })
        }
      }
    })
  },

  doUnbind: function () {
    var self = this
    wx.showLoading({ title: '解绑中...' })
    ble.disconnect()
    api.unbindDevice().then(function () {
      wx.hideLoading()
      self.setData({
        hasDevice: false,
        deviceName: '',
        deviceInfo: null,
        connected: false
      })
      wx.showToast({ title: '已解绑', icon: 'success' })
    }).catch(function (err) {
      wx.hideLoading()
      wx.showToast({ title: err.message || '解绑失败', icon: 'none' })
    })
  },

  onStartTreatment: function () {
    if (!this.data.subscription || this.data.subscription.status !== 'active') {
      wx.navigateTo({ url: '/pages/subscribe-prompt/subscribe-prompt' })
      return
    }
    wx.navigateTo({ url: '/pages/wear-check/wear-check' })
  },

  onViewSubscription: function () {
    wx.navigateTo({ url: '/pages/subscribe-plans/subscribe-plans' })
  }
})
