'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var _rollupPluginBabelHelpers = require('../../../_virtual/_rollupPluginBabelHelpers.js');

var getSortedValues = function getSortedValues(values) {
  return values.sort(function (start, end) {
    if (!start || !end) {
      return -1;
    }
    return start.getTime() - end.getTime();
  });
};
var isDateInRange = function isDateInRange(year, monthIndex, currentDay, values) {
  var _getSortedValues = getSortedValues(values),
    _getSortedValues2 = _rollupPluginBabelHelpers.slicedToArray(_getSortedValues, 2),
    startValue = _getSortedValues2[0],
    endValue = _getSortedValues2[1];
  if (!endValue || !startValue) {
    return false;
  }
  var day = new Date(year, monthIndex, currentDay);
  return startValue < day && day <= endValue;
};
var isSameDay = function isSameDay(firstDate, secondDate) {
  return secondDate && firstDate.day === secondDate.day && firstDate.monthIndex === secondDate.monthIndex && firstDate.year === secondDate.year;
};
var isValueUpdate = function isValueUpdate(value, prevValue) {
  if (!Array.isArray(value) && !Array.isArray(prevValue)) {
    return (prevValue === null || prevValue === void 0 ? void 0 : prevValue.getTime()) !== (value === null || value === void 0 ? void 0 : value.getTime());
  }
  if (Array.isArray(value) && Array.isArray(prevValue)) {
    var _prevValue$, _value$, _prevValue$2, _value$2;
    return ((_prevValue$ = prevValue[0]) === null || _prevValue$ === void 0 ? void 0 : _prevValue$.getTime()) !== ((_value$ = value[0]) === null || _value$ === void 0 ? void 0 : _value$.getTime()) || ((_prevValue$2 = prevValue[1]) === null || _prevValue$2 === void 0 ? void 0 : _prevValue$2.getTime()) !== ((_value$2 = value[1]) === null || _value$2 === void 0 ? void 0 : _value$2.getTime());
  }
  return false;
};

/**
 * Метод проверяет, находится ли календарь в режиме выбора второго значения.
 */
var isSelectProcess = function isSelectProcess(array) {
  return Array.isArray(array) && !array[1];
};

/**
 * Метод возвращает сторону, когда выбор второго значения диапазона завершён.
 */
var getSideForSelected = function getSideForSelected(date, startValue, endValue) {
  var currentDateTime = new Date(date.year, date.monthIndex, date.day).getTime();
  var startValueTime = startValue.getTime();
  var endValueTime = endValue.getTime();
  if (currentDateTime === startValueTime) {
    return 'right';
  }
  if (currentDateTime === endValueTime) {
    return 'left';
  }
  return undefined;
};

/**
 * Метод возвращает сторону, во время выбора второго значения диапазона.
 */
var getSideForHovered = function getSideForHovered(date, hoveredDay, startValue, isSelected) {
  var dateHover = new Date(hoveredDay.year, hoveredDay.monthIndex, hoveredDay.day);
  var isHovered = isSameDay(date, hoveredDay);
  if (isSelected && startValue > dateHover || isHovered && startValue < dateHover) {
    return 'left';
  }
  if (isSelected && startValue < dateHover || isHovered && startValue > dateHover) {
    return 'right';
  }
  return undefined;
};

/**
 * Метод возвращает сторону, с которой нужно отрисовать направление полоски диапазона.
 */
var getSideInRange = function getSideInRange(value, date, hoveredDay, isSelected) {
  if (!Array.isArray(value)) {
    return undefined;
  }
  var _value = _rollupPluginBabelHelpers.slicedToArray(value, 2),
    startValue = _value[0],
    endValue = _value[1];
  if (startValue && isSelected && endValue) {
    return getSideForSelected(date, startValue, endValue);
  }
  if (startValue && hoveredDay) {
    return getSideForHovered(date, hoveredDay, startValue, isSelected);
  }
  return undefined;
};

/**
 * Метод проверяет, находится ли выбранный день в диапазоне.
 */
var getInRange = function getInRange(value, date, hoveredDay, inRange) {
  if (!isSelectProcess(value) || !hoveredDay) {
    return inRange;
  }
  var dateSelected = value[0];
  var dateHover = new Date(hoveredDay.year, hoveredDay.monthIndex, hoveredDay.day);
  var dateCurrent = new Date(date.year, date.monthIndex, date.day);
  if (dateSelected < dateCurrent && dateCurrent < dateHover || dateSelected > dateCurrent && dateCurrent > dateHover) {
    return true;
  }
  return inRange;
};

exports.getInRange = getInRange;
exports.getSideForHovered = getSideForHovered;
exports.getSideForSelected = getSideForSelected;
exports.getSideInRange = getSideInRange;
exports.getSortedValues = getSortedValues;
exports.isDateInRange = isDateInRange;
exports.isSameDay = isSameDay;
exports.isSelectProcess = isSelectProcess;
exports.isValueUpdate = isValueUpdate;
