/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

var htrace = htrace || {};

htrace.checkStringIsPositiveWholeNumber = function(val) {
  if (!val.match(/^[0-9]([0-9]*)$/)) {
    if (!val.match(/[^\s]/)) {
      throw "You entered an empty string into a numeric field.";
    }
    throw "Non-numeric characters found.";
  }
};

htrace.checkStringIsNotEmpty = function(val) {
  if (!val.match(/[^\s]/)) {
    throw "You entered an empty string into a text field.";
  }
};

// Predicate type
htrace.PType = Backbone.Model.extend({
  initialize: function(options) {
    this.name = options.name;
    this.field = options.field;
    this.op = options.op;
  },

  // Try to normalize a value of this type into something htraced can accept.
  // Returns a string containing the normalized value on success.  Throws a
  // string explaining the parse error otherwise.
  // Dates are represented by milliseconds since the epoch; span ids don't start
  // with 0x.
  normalize: function(val) {
    switch (this.field) {
    case "begin":
      return htrace.parseDate(val).valueOf().toString();
    case "end":
      return htrace.parseDate(val).valueOf().toString();
    case "description":
      htrace.checkStringIsNotEmpty(val);
      return val;
    case "duration":
      htrace.checkStringIsPositiveWholeNumber(val);
      return val;
    case "spanid":
      return htrace.normalizeSpanId(val);
    default:
      return "Normalization not implemented for field '" + this.field + "'";
    }
  },

  getDefaultValue: function() {
    switch (this.field) {
    case "begin":
      return htrace.dateToString(moment());
    case "end":
      return htrace.dateToString(moment());
    case "description":
      return "";
    case "duration":
      return "0";
    case "spanid":
      return "";
    default:
      return "(unknown)";
    }
  }
});

htrace.parsePType = function(name) {
  switch (name) {
    case "Began after":
      return new htrace.PType({name: name, field:"begin", op:"gt"});
    case "Began at or before":
      return new htrace.PType({name: name, field:"begin", op:"le"});
    case "Ended after":
      return new htrace.PType({name: name, field:"end", op:"gt"});
    case "Ended at or before":
      return new htrace.PType({name: name, field:"end", op:"le"});
    case "Description contains":
      return new htrace.PType({name: name, field:"description", op:"cn"});
    case "Description is exactly":
      return new htrace.PType({name: name, field:"description", op:"eq"});
    case "Duration is longer than":
      return new htrace.PType({name: name, field:"duration", op:"gt"});
    case "Duration is at most":
      return new htrace.PType({name: name, field:"duration", op:"le"});
    case "Span ID is":
      return new htrace.PType({name: name, field:"spanid", op:"eq"});
    default:
      return null
  }
};

htrace.Predicate = function(options) {
  this.op = options.ptype.op;
  this.field = options.ptype.field;
  this.val = options.val;
  return this;
};
