// Copyright 2011 Mark Cavage, Inc.  All rights reserved.

var assert = require('assert');
var util = require('util');

var LDAPResult = require('./result');
var Protocol = require('../protocol');


///--- API

function ExtendedResponse(options) {
  if (options) {
    if (typeof (options) !== 'object')
      throw new TypeError('options must be an object');
    if (options.responseName && typeof (options.responseName) !== 'string')
      throw new TypeError('options.responseName must be a string');
    if (options.responseValue && typeof (options.responseValue) !== 'string')
      throw new TypeError('options.responseValue must be a string');
  } else {
    options = {};
  }

  this.responseName = options.responseName || undefined;
  this.responseValue = options.responseValue || undefined;

  options.protocolOp = Protocol.LDAP_REP_EXTENSION;
  LDAPResult.call(this, options);

  this.__defineGetter__('name', function () {
    return this.responseName;
  });
  this.__defineGetter__('value', function () {
    return this.responseValue;
  });
  this.__defineSetter__('name', function (name) {
    if (typeof (name) !== 'string')
      throw new TypeError('name must be a string');

    this.responseName = name;
  });
  this.__defineSetter__('value', function (val) {
    if (typeof (val) !== 'string')
      throw new TypeError('value must be a string');

    this.responseValue = val;
  });
}
util.inherits(ExtendedResponse, LDAPResult);
module.exports = ExtendedResponse;


ExtendedResponse.prototype._parse = function (ber) {
  assert.ok(ber);

  if (!LDAPResult.prototype._parse.call(this, ber))
    return false;

  if (ber.peek() === 0x8a)
    this.responseName = ber.readString(0x8a);
  if (ber.peek() === 0x8b)
    this.responseValue = ber.readString(0x8b);

  return true;
};


ExtendedResponse.prototype._toBer = function (ber) {
  assert.ok(ber);

  if (!LDAPResult.prototype._toBer.call(this, ber))
    return false;

  if (this.responseName)
    ber.writeString(this.responseName, 0x8a);
  if (this.responseValue)
    ber.writeString(this.responseValue, 0x8b);

  return ber;
};


ExtendedResponse.prototype._json = function (j) {
  assert.ok(j);

  j = LDAPResult.prototype._json.call(this, j);

  j.responseName = this.responseName;
  j.responseValue = this.responseValue;

  return j;
};