var wire = require('../../wire');
var net = require('net');
var logger = require('../../util/logger');
var log = logger.createLogger('layoutcaptureservice');

function LayoutCaptureService() {
  this.serialActions = {};
  this.serialProcessing = {};
}

LayoutCaptureService.prototype.enqueue = function(wireEvent, actionFn,
                                                  fetchView, serial) {
  if (!serial) {
    log.warn('No serial provided for wire event %s', wireEvent);
    return actionFn();
  }

  if (!this.serialActions[serial]) {
    this.serialActions[serial] = [];
  }

  this.serialActions[serial].push({
    wireEvent: wireEvent,
    actionFn: actionFn,
    fetchView: fetchView
  });
  this.checkStartCaptures(serial);
};

LayoutCaptureService.prototype.dequeue = function(serial) {
  if (!this.validSerialQueue(serial)) {
    return;
  }

  if (this.serialActions[serial].length > 0) {
    return this.serialActions[serial].shift();
  } else {
    return null;
  }
};

LayoutCaptureService.prototype.checkStartCaptures = function(serial) {
  if (!this.validSerialQueue(serial)) {
    return;
  }

  if (this.serialActions[serial].length > 0 && !this.serialProcessing[serial]) {
    this.serialProcessing[serial] = true;
    layoutCaptureService.processStr = '';
    var nextItem = function() {
      var eventActionObj = layoutCaptureService.dequeue(serial);
      if (eventActionObj) {
        layoutCaptureService.processStr += ' (' +
            eventActionObj.wireEvent.$code + ') ';
        if (eventActionObj.wireEvent === wire.GestureStartMessage) {
          eventActionObj.fetchView(function(err, layoutJSON) {
            if (err) {
              log.error('Fetch view failed for serial %s:', serial, err);
            } else {
              eventActionObj.actionFn(layoutJSON);
            }

            nextItem();
          });
        } else {
          eventActionObj.actionFn();
          nextItem();
        }
      } else {
        layoutCaptureService.serialProcessing[serial] = false;
      }
    };

    nextItem();
  }
};

LayoutCaptureService.prototype.validSerialQueue = function(serial) {
  if (serial) {
    if (this.serialActions[serial]) {
      return true;
    } else {
      log.error('Serial queue not found for serial: %s', serial);
      return false;
    }
  } else {
    log.error('Missing serial for dequeue action: %s');
    return false;
  }
};

LayoutCaptureService.prototype.resetSerial = function(serial) {
  if (serial) {
    this.serialActions[serial] = [];
  }
};

var layoutCaptureService = new LayoutCaptureService();
module.exports = layoutCaptureService;
