text: var util = require('util')
  
  var syrup = require('stf-syrup')
  var EventEmitter = require('eventemitter3')
  
  var logger = require('../../../../util/logger')
  var streamutil = require('../../../../util/streamutil')
  
  module.exports = syrup.serial()
    .dependency(require('../../support/adb'))
    .dependency(require('../../resources/minicap'))
    .dependency(require('../service'))
    .dependency(require('../screen/options'))
    .define(function(options, adb, minicap, service, screenOptions) {
      var log = logger.createLogger('device:plugins:display')
  
      function Display(id, properties) {
        this.id = id
        this.properties = properties
      }
  
      util.inherits(Display, EventEmitter)
  
      Display.prototype.updateRotation = function(newRotation) {
        log.info('Rotation changed to %d', newRotation)
        this.properties.rotation = newRotation
        this.emit('rotationChange', newRotation)
      }
  
      function infoFromMinicap(id) {
        return minicap.run(util.format('-d %d -i', id))
          .then(streamutil.readAll)
          .then(function(out) {
            var match
            if ((match = /^ERROR: (.*)$/.exec(out))) {
              throw new Error(match[1])
            }
  
            try {
              return JSON.parse(out)
            }
            catch (e) {
              throw new Error(out.toString())
            }
          })
      }
  
      function infoFromService(id) {
        return service.getDisplay(id)
      }
  
      function readInfo(id) {
        log.info('Reading display info')
        return infoFromService(id)
          .catch(function() {
            return infoFromMinicap(id)
          })
          .then(function(properties) {
            properties.url = screenOptions.publicUrl
            return new Display(id, properties)
          })
      }
  
      return readInfo(0).then(function(display) {
        service.on('rotationChange', function(data) {
          display.updateRotation(data.rotation)
        })
  
        return display
      })
    })
  