// 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.

var inherits = require('inherits');

var util = require('../util');

/**
 * @summary
 * Provides utility methods to create different rowranges.
 * @namespace
 * @name rowrange
 * @memberof module:syncbase.nosql
 */
module.exports = {
  range: range,
  singleRow: singleRow,
  prefix: prefix
};

/**
 * Creates a range for the given start and limit.
 * RowRange represents all rows with keys in [start, limit). If limit is "", all
 * rows with keys >= start are included.
 * @param {string} start Start of the range.
 * @param {string} limit Range limit.
 * @return {module:syncbase.nosql~RowRange} A RowRange object.
 */
function range(start, limit) {
  var startBytes = util.stringToUTF8Bytes(start);
  var limitBytes = util.stringToUTF8Bytes(limit);

  return new RowRange(startBytes, limitBytes);
}

/**
 * Creates a range that only matches items of the given prefix.
 * @param {string} prefix Prefix.
 * @return {module:syncbase.nosql~PrefixRange} A PrefixRange object. PrefixRange
 * inherits from {@link module:syncbase.nosql~RowRange}
 */
function prefix(p) {
  return new PrefixRange(p);
}

var ASCII_NULL = '\x00';
/**
 * Creates a range that only matches a single row of the given key.
 * @param {string} row Row key.
 * @return {module:syncbase.nosql~RowRange} A RowRange object.
 */
function singleRow(row) {
  var startBytes = util.stringToUTF8Bytes(row);
  var limitBytes = util.stringToUTF8Bytes(row + ASCII_NULL);
  return new RowRange(startBytes, limitBytes);
}

/*
 * @summary
 * Represents a range of row values.
 * Private constructor. Use one of the utility methods such as
 * {@link module:syncbase.nosql.rowrange#rowrange},
 * {@link module:syncbase.nosql.rowrange#prefix},
 * {@link module:syncbase.nosql.rowrange#singleRow}
 * to create instances.
 * @inner
 * @constructor
 * @memberof {module:syncbase.nosql.rowrange}
 */
function RowRange(start, limit) {
  if (!(this instanceof RowRange)) {
    return new RowRange(start, limit);
  }

  /**
   * Start of range as byte[]
   * @type {Uint8Array}
   */
  Object.defineProperty(this, 'start', {
    value: start,
    writable: false,
    enumerable: true
  });

  /**
   * Limit of range as byte[]
   * @type {Uint8Array}
   */
  Object.defineProperty(this, 'limit', {
    value: limit,
    writable: false,
    enumerable: true
  });
}

/*
 * @summary
 * PrefixRange is a sub type of {@link module:syncbase.nosql.rowrange~RowRange}
 * that indicates all ranges matching a prefix.
 * Private constructor, use {@link module:syncbase.nosql.rowrange#prefix} to
 * create an instance.
 * @inherits module:syncbase.nosql.rowrange~RowRange
 * @inner
 * @constructor
 * @memberof {module:syncbase.nosql.rowrange}
 */
function PrefixRange(prefix) {
  if (!(this instanceof PrefixRange)) {
    return new PrefixRange(prefix);
  }

  var startBytes = util.stringToUTF8Bytes(prefix);
  var limitBytes = util.stringToUTF8Bytes(prefix);
  util.prefixRangeLimit(limitBytes);

  /**
   * Prefix
   * @type {string}
   */
  Object.defineProperty(this, 'prefix', {
    value: prefix,
    writable: false,
    enumerable: true
  });

  RowRange.call(this, startBytes, limitBytes);
}
inherits(PrefixRange, RowRange);
