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

import constants from "./constants";
import utils from "./core/utils";
import d3 from "d3";
import moment from "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();
};

export default Helpers;
