function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
var _excluded = ["calculateDate", "intervalSize", "scale", "hoursBlockSize"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
import { addDays, addMonths, addWeeks, addYears, differenceInDays } from 'date-fns';
import { find } from 'lodash';
import { TIMELINE_BLOCK_SIZE } from '../constants';
var DEFAULT_INTERVAL_SIZE = 1;
var HOURS_IN_DAY = 24;
function getDefaultScaleConfigOption(startDate, endDate, monthIntervalSize) {
  if (endDate) {
    return {
      calculateDate: addDays,
      intervalSize: differenceInDays(endDate, startDate) + 1,
      isDefault: true
    };
  }
  return {
    calculateDate: addMonths,
    intervalSize: monthIntervalSize || 1,
    isDefault: true
  };
}
function getScaleConfig(startDate, endDate, monthIntervalSize) {
  return {
    hour: {
      calculateDate: addDays,
      hoursBlockSize: TIMELINE_BLOCK_SIZE.SINGLE_HOUR,
      intervalSize: 1
    },
    quarter_day: {
      calculateDate: addDays,
      intervalSize: 3
    },
    day: {
      calculateDate: addDays,
      intervalSize: 5
    },
    week: {
      calculateDate: addWeeks,
      intervalSize: DEFAULT_INTERVAL_SIZE
    },
    month: getDefaultScaleConfigOption(startDate, endDate, monthIntervalSize),
    year: {
      calculateDate: addYears,
      intervalSize: DEFAULT_INTERVAL_SIZE
    },
    five_year: {
      calculateDate: addYears,
      intervalSize: 5
    }
  };
}
function mapScaleOption(startDate, maxWidth, hoursBlockSize) {
  return function (_ref) {
    var calculateDate = _ref.calculateDate,
      intervalSize = _ref.intervalSize,
      scale = _ref.scale,
      configHoursBlockSize = _ref.hoursBlockSize,
      rest = _objectWithoutProperties(_ref, _excluded);
    var to = addDays(calculateDate(startDate, intervalSize), -1);
    var numberOfHours = (differenceInDays(to, startDate) + 1) * HOURS_IN_DAY;
    var optionHoursBlockSize = configHoursBlockSize || hoursBlockSize || TIMELINE_BLOCK_SIZE.QUARTER_DAY;
    var hourWidth = maxWidth / numberOfHours * (scale || 1);
    return _objectSpread({
      calculateDate: calculateDate,
      intervalSize: intervalSize,
      to: to,
      from: startDate,
      hoursBlockSize: optionHoursBlockSize,
      widths: {
        hour: hourWidth * optionHoursBlockSize,
        day: hourWidth * HOURS_IN_DAY
      }
    }, rest);
  };
}
function getMaxWidth(timelineWidth, unitWidth, numberOfDays) {
  var unitWidthTotal = unitWidth * numberOfDays;
  if (timelineWidth && timelineWidth > unitWidthTotal) {
    return timelineWidth;
  }
  return unitWidthTotal;
}
function buildScaleOptions(_ref2, timelineWidth) {
  var endDate = _ref2.endDate,
    hoursBlockSize = _ref2.hoursBlockSize,
    range = _ref2.range,
    startDate = _ref2.startDate,
    unitWidth = _ref2.unitWidth;
  var scaleConfig = getScaleConfig(startDate, endDate, range);
  var defaultConfig = find(scaleConfig, {
    isDefault: true
  });
  if (!defaultConfig) {
    throw new Error('Failed to find default Timeline scale configuration');
  }
  var numberOfDays = endDate ? defaultConfig.intervalSize : differenceInDays(defaultConfig.calculateDate(startDate, defaultConfig.intervalSize), startDate);
  var maxWidth = getMaxWidth(timelineWidth, unitWidth, numberOfDays);
  return Object.keys(scaleConfig).map(function (scaleConfigKey) {
    return mapScaleOption(startDate, maxWidth, hoursBlockSize)(scaleConfig[scaleConfigKey]);
  });
}
export { buildScaleOptions };