/*
 * 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 || {};

// Parse an ISO8601 date string into a moment.js object.
htrace.parseDate = function(val) {
  if (val.match(/^[0-9]([0-9]*)$/)) {
    // Treat an all-numeric field as UTC milliseconds since the epoch.
    return moment.utc(parseInt(val, 10));
  }
  // Look for approved date formats.
  var toTry = [
    "YYYY-MM-DDTHH:mm:ss,SSS",
    "YYYY-MM-DDTHH:mm:ss",
    "YYYY-MM-DDTHH:mm",
    "YYYY-MM-DD"
  ];
  for (var i = 0; i < toTry.length; i++) {
    var m = moment.utc(val, toTry[i], true);
    if (m.isValid()) {
      return m;
    }
  }
  throw "Please enter the date either as YYYY-MM-DDTHH:mm:ss,SSS " +
      "in UTC, or as the number of milliseconds since the epoch.";
};

// Convert a moment.js moment into an ISO8601-style date string.
htrace.dateToString = function(val) {
  return moment.utc(val).format("YYYY-MM-DDTHH:mm:ss,SSS");
};

// Normalize a span ID into the format the server expects to see
// (no leading 0x).
htrace.normalizeSpanId = function(str) {
  // Strip off the 0x prefix, if there is one.
  if (str.indexOf("0x") == 0) {
    str = str.substring(2);
  }
  if (str.length != 16) {
    throw "The length of '" + str + "' was " + str.length +
      ", but span IDs must be 16 characters long.";
  }
  if (str.search(/[^0-9a-fA-F]/) != -1) {
    throw "Span IDs must contain only hexadecimal digits, but '" + str +
      "' contained invalid characters.";
  }
  return str;
};
