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

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

var parents = require('ldap-filter');

var Filter = require('./filter');


///--- API

function SubstringFilter(options) {
  parents.SubstringFilter.call(this, options);
}
util.inherits(SubstringFilter, parents.SubstringFilter);
Filter.mixin(SubstringFilter);
module.exports = SubstringFilter;


SubstringFilter.prototype.parse = function (ber) {
  assert.ok(ber);

  this.attribute = ber.readString().toLowerCase();
  ber.readSequence();
  var end = ber.offset + ber.length;

  while (ber.offset < end) {
    var tag = ber.peek();
    switch (tag) {
    case 0x80: // Initial
      this.initial = ber.readString(tag);
      if (this.attribute === 'objectclass')
        this.initial = this.initial.toLowerCase();
      break;
    case 0x81: // Any
      var anyVal = ber.readString(tag);
      if (this.attribute === 'objectclass')
        anyVal = anyVal.toLowerCase();
      this.any.push(anyVal);
      break;
    case 0x82: // Final
      this.final = ber.readString(tag);
      if (this.attribute === 'objectclass')
        this.final = this.final.toLowerCase();
      break;
    default:
      throw new Error('Invalid substrings filter type: 0x' + tag.toString(16));
    }
  }

  return true;
};


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

  ber.writeString(this.attribute);
  ber.startSequence();

  if (this.initial)
    ber.writeString(this.initial, 0x80);

  if (this.any && this.any.length)
    this.any.forEach(function (s) {
      ber.writeString(s, 0x81);
    });

  if (this.final)
    ber.writeString(this.final, 0x82);

  ber.endSequence();

  return ber;
};
