import isObjectEmpty from "./is-object-empty.js";
import hasOwnProp from "./has-own-prop.js";
import isObject from "./is-object.js";
import isDate from "./is-date.js";
import isNumber from "./is-number.js";
import isString from "./is-string.js";
import { isMoment } from "../moment/constructor.js";
import isArray from "./is-array.js"; // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined

export function isMomentInput(input) {
  return isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === undefined;
}
export function isMomentInputObject(input) {
  var objectTest = isObject(input) && !isObjectEmpty(input),
      propertyTest = false,
      properties = ['years', 'year', 'y', 'months', 'month', 'M', 'days', 'day', 'd', 'dates', 'date', 'D', 'hours', 'hour', 'h', 'minutes', 'minute', 'm', 'seconds', 'second', 's', 'milliseconds', 'millisecond', 'ms'],
      i,
      property,
      propertyLen = properties.length;

  for (i = 0; i < propertyLen; i += 1) {
    property = properties[i];
    propertyTest = propertyTest || hasOwnProp(input, property);
  }

  return objectTest && propertyTest;
}

function isNumberOrStringArray(input) {
  var arrayTest = isArray(input),
      dataTypeTest = false;

  if (arrayTest) {
    dataTypeTest = input.filter(function (item) {
      return !isNumber(item) && isString(input);
    }).length === 0;
  }

  return arrayTest && dataTypeTest;
}