// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

define("mojo/public/js/lib/control_message_proxy", [
  "mojo/public/interfaces/bindings/interface_control_messages.mojom",
  "mojo/public/js/codec",
  "mojo/public/js/validator",
], function(controlMessages, codec, validator) {

  var Validator = validator.Validator;

  function constructRunOrClosePipeMessage(runOrClosePipeInput) {
    var runOrClosePipeMessageParams = new
        controlMessages.RunOrClosePipeMessageParams();
    runOrClosePipeMessageParams.input = runOrClosePipeInput;

    var messageName = controlMessages.kRunOrClosePipeMessageId;
    var payloadSize = controlMessages.RunOrClosePipeMessageParams.encodedSize;
    var builder = new codec.MessageV0Builder(messageName, payloadSize);
    builder.encodeStruct(controlMessages.RunOrClosePipeMessageParams,
                         runOrClosePipeMessageParams);
    var message = builder.finish();
    return message;
  }

  function validateControlResponse(message) {
    var messageValidator = new Validator(message);
    var error = messageValidator.validateMessageIsResponse();
    if (error != validator.validationError.NONE) {
      throw error;
    }

    if (message.getName() != controlMessages.kRunMessageId) {
      throw new Error("Control message name is not kRunMessageId");
    }

    // Validate payload.
    error = controlMessages.RunResponseMessageParams.validate(
        messageValidator, message.getHeaderNumBytes());
    if (error != validator.validationError.NONE) {
      throw error;
    }
  }

  function acceptRunResponse(message) {
    validateControlResponse(message);

    var reader = new codec.MessageReader(message);
    var runResponseMessageParams = reader.decodeStruct(
        controlMessages.RunResponseMessageParams);

    return Promise.resolve(runResponseMessageParams);
  }

 /**
  * Sends the given run message through the receiver.
  * Accepts the response message from the receiver and decodes the message
  * struct to RunResponseMessageParams.
  *
  * @param  {Router} receiver.
  * @param  {RunMessageParams} runMessageParams to be sent via a message.
  * @return {Promise} that resolves to a RunResponseMessageParams.
  */
  function sendRunMessage(receiver, runMessageParams) {
    var messageName = controlMessages.kRunMessageId;
    var payloadSize = controlMessages.RunMessageParams.encodedSize;
    // |requestID| is set to 0, but is later properly set by Router.
    var builder = new codec.MessageV1Builder(messageName,
        payloadSize, codec.kMessageExpectsResponse, 0);
    builder.encodeStruct(controlMessages.RunMessageParams, runMessageParams);
    var message = builder.finish();

    return receiver.acceptAndExpectResponse(message).then(acceptRunResponse);
  }

  function ControlMessageProxy(receiver) {
    this.receiver_ = receiver;
  }

  ControlMessageProxy.prototype.queryVersion = function() {
    var runMessageParams = new controlMessages.RunMessageParams();
    runMessageParams.input = new controlMessages.RunInput();
    runMessageParams.input.query_version = new controlMessages.QueryVersion();

    return sendRunMessage(this.receiver_, runMessageParams).then(function(
        runResponseMessageParams) {
      return runResponseMessageParams.output.query_version_result.version;
    });
  };

  ControlMessageProxy.prototype.requireVersion = function(version) {
    var runOrClosePipeInput = new controlMessages.RunOrClosePipeInput();
    runOrClosePipeInput.require_version = new controlMessages.RequireVersion({
        'version': version});
    var message = constructRunOrClosePipeMessage(runOrClosePipeInput);
    this.receiver_.accept(message);
  };

  var exports = {};
  exports.ControlMessageProxy = ControlMessageProxy;

  return exports;
});
