module.exports = function EnhanceDeviceServiceFactory($filter, AppState) {
  var service = {}

  function setState(data) {
    // For convenience, formulate an aggregate state property that covers
    // every possible state.
    data.state = 'absent'
    if (data.present) {
      data.state = 'present'
      switch (data.status) {
        case 1:
          data.state = 'offline'
          break
        case 2:
          data.state = 'unauthorized'
          break
        case 3:
          data.state = 'preparing'
          if (data.ready) {
            data.state = 'ready'
            if (data.using) {
              data.state = 'using'
            }
            else {
              if (data.owner) {
                data.state = 'busy'
              }
              else {
                data.state = 'available'
              }
            }
          }
          break
      }
    }
  }

  function enhanceDevice(device) {
    device.enhancedName = device.name || device.model || device.serial || 'Unknown'
    device.enhancedModel = device.model || 'Unknown'
    device.enhancedImage120 = '/static/app/devices/icon/x120/' + (device.image || '_default.jpg')
    device.enhancedImage24 = '/static/app/devices/icon/x24/' + (device.image || '_default.jpg')
    device.enhancedStateAction = $filter('statusNameAction')(device.state)
    device.enhancedStatePassive = $filter('statusNamePassive')(device.state)
  }

  function enhanceDeviceDetails(device) {
    if (device.battery) {
      device.enhancedBatteryPercentage = (device.battery.level / device.battery.scale * 100) + '%'
      device.enhancedBatteryHealth = $filter('batteryHealth')(device.battery.health)
      device.enhancedBatterySource = $filter('batterySource')(device.battery.source)
      device.enhancedBatteryStatus = $filter('batteryStatus')(device.battery.status)
      device.enhancedBatteryTemp = device.battery.temp + '°C'
    }

    if (device.owner) {
      device.enhancedUserProfileUrl = enhanceUserProfileUrl(device.owner.email)
      device.enhancedUserName = device.owner.name || "No name"
    }
  }

  function enhanceUserProfileUrl(email) {
    var url
    var userProfileUrl = (function () {
      if (AppState && AppState.config && AppState.config.userProfileUrl) {
        return AppState.config.userProfileUrl
      }
      return null
    })()

    if (userProfileUrl) {
      // Using RFC 6570 URI Template specification
      if (userProfileUrl && email) {
        url = userProfileUrl.indexOf('{user}') !== -1 ?
          userProfileUrl.replace('{user}', email) :
          userProfileUrl + email;
      }
    } else if (email.indexOf('@') !== -1) {
      url = 'mailto:' + email
    } else {
      url = '/!#/user/' + email
    }
    return url
  }

  service.enhance = function (device) {
    setState(device)
    enhanceDevice(device)
    enhanceDeviceDetails(device)
  }

  return service
}
