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


// This file creates a set of helper functions that will be loaded for all html
// templates. These functions should be self contained and not rely on any
// external dependencies as they are loaded prior to the application. We may
// want to change this later, but for now this should be thought of as a
// "purely functional" helper system.

define([
  './constants',
  "./core/utils",
  "d3",
  'moment'
],

function (constants, utils, d3, moment) {

  var Helpers = {};

  Helpers.removeSpecialCharacters = utils.removeSpecialCharacters;

  Helpers.safeURL = utils.safeURLName;

  Helpers.imageUrl = function (path) {
    // TODO: add dynamic path for different deploy targets
    return path;
  };

  Helpers.getDocUrl = function (key) {
    return (_.has(constants.DOC_URLS, key)) ? constants.DOC_URLS[key] : '#';
  };

  // File size pretty printing, taken from futon.format.js
  Helpers.formatSize = function (size) {
      var jump = 512;
      if (size < jump) return size + " bytes";
      var units = ["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
      var i = 0;
      while (size >= jump && i < units.length) {
        i += 1;
        size /= 1024;
      }
      return size.toFixed(1) + ' ' + units[i - 1];
    };

  Helpers.formatDate = function (timestamp) {
    return moment(timestamp, 'X').format('MMM Do, h:mm:ss a');
  };
  Helpers.getDateFromNow = function (timestamp) {
    return moment(timestamp, 'X').fromNow();
  };

  return Helpers;
});
