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

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

var asn1 = require('asn1');

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


///--- Globals

var Ber = asn1.Ber;


///--- API

function Control(options) {
  assert.optionalObject(options);
  options = options || {};
  assert.optionalString(options.type);
  assert.optionalBool(options.criticality);
  if (options.value) {
    assert.buffer(options.value);
  }

  this.type = options.type || '';
  this.criticality = options.critical || options.criticality || false;
  this.value = options.value || null;
}
Object.defineProperties(Control.prototype, {
  json: {
    get: function getJson() {
      var obj = {
        controlType: this.type,
        criticality: this.criticality,
        controlValue: this.value
      };
      return (typeof (this._json) === 'function' ? this._json(obj) : obj);
    }
  }
});

Control.prototype.toBer = function toBer(ber) {
  assert.ok(ber);

  ber.startSequence();
  ber.writeString(this.type || '');
  ber.writeBoolean(this.criticality);
  if (typeof (this._toBer) === 'function') {
    this._toBer(ber);
  } else {
    if (this.value)
      ber.writeString(this.value);
  }

  ber.endSequence();
  return;
};

Control.prototype.toString = function toString() {
  return this.json;
};


///--- Exports
module.exports = Control;
