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

/**
 * @fileoverview A context passed to the authorizer
 * @private
 */
var Blessings = require('./blessings.js');
module.exports = Call;

/**
 * @summary Call defines the state available for authorizing a principal.
 * @name SecurityCall
 * @property {string} method The method being invoked.
 * @property {string} suffix The object name suffix of the request.
 * @property {module:vanadium.security~Blessings} localBlessings The blessings
 * bound to the local end.
 * @property {string} localBlessingStrings The validated names for the local
 * end.
 * @property {module:vanadium.security~Blessings} remoteBlessings The blessings
 * bound to the remote end.
 * @property {string} remoteBlessingStrings The validated names for the remote
 * end.
 * @property {string} localEndpoint The endpoint string for the local end.
 * @property {string} remoteEndpoint The endpoint string for the remote end.
 * @inner
 * @memberof module:vanadium.security
 */
function Call(call, controller) {
  this.method = call.method;
  this.suffix = call.suffix;
  // TODO(bjornick): Use the enums.
  this.methodTags = call.methodTags;
  this.localBlessings = new Blessings(call.localBlessings.handle,
                                      call.localBlessings.publicKey,
                                      controller);
  this.remoteBlessings = new Blessings(call.remoteBlessings.handle,
                                       call.remoteBlessings.publicKey,
                                       controller);
  if (call.grantedBlessings) {
    this.grantedBlessings = new Blessings(call.grantedBlessings.handle,
                                          call.grantedBlessings.publicKey,
                                          controller);
  }
  this.localBlessingStrings = call.localBlessingStrings;
  this.remoteBlessingStrings = call.remoteBlessingStrings;
  // TODO(bjornick): Create endpoints.
  this.localEndpoint = call.localEndpoint;
  this.remoteEndpoint = call.remoteEndpoint;
}

Call.prototype.clone = function() {
  var res = Object.create(this.constructor.prototype);
  Object.defineProperty(res, 'constructor', { value: this.constructor });
  for (var key in this) {
    if (!this.hasOwnProperty(key)) {
      continue;
    }
    res[key] = this[key];
  }
  return res;
};
