import { hooks } from "../utils/hooks.js";
import isUndefined from "../utils/is-undefined.js";
import getParsingFlags from "../create/parsing-flags.js"; // Plugins that add properties should also add the key here (null value),
// so we can properly clone ourselves.

var momentProperties = hooks.momentProperties = [],
    updateInProgress = false;
export function copyConfig(to, from) {
  var i,
      prop,
      val,
      momentPropertiesLen = momentProperties.length;

  if (!isUndefined(from._isAMomentObject)) {
    to._isAMomentObject = from._isAMomentObject;
  }

  if (!isUndefined(from._i)) {
    to._i = from._i;
  }

  if (!isUndefined(from._f)) {
    to._f = from._f;
  }

  if (!isUndefined(from._l)) {
    to._l = from._l;
  }

  if (!isUndefined(from._strict)) {
    to._strict = from._strict;
  }

  if (!isUndefined(from._tzm)) {
    to._tzm = from._tzm;
  }

  if (!isUndefined(from._isUTC)) {
    to._isUTC = from._isUTC;
  }

  if (!isUndefined(from._offset)) {
    to._offset = from._offset;
  }

  if (!isUndefined(from._pf)) {
    to._pf = getParsingFlags(from);
  }

  if (!isUndefined(from._locale)) {
    to._locale = from._locale;
  }

  if (momentPropertiesLen > 0) {
    for (i = 0; i < momentPropertiesLen; i++) {
      prop = momentProperties[i];
      val = from[prop];

      if (!isUndefined(val)) {
        to[prop] = val;
      }
    }
  }

  return to;
} // Moment prototype object

export function Moment(config) {
  copyConfig(this, config);
  this._d = new Date(config._d != null ? config._d.getTime() : NaN);

  if (!this.isValid()) {
    this._d = new Date(NaN);
  } // Prevent infinite loop in case updateOffset creates new moment
  // objects.


  if (updateInProgress === false) {
    updateInProgress = true;
    hooks.updateOffset(this);
    updateInProgress = false;
  }
}
export function isMoment(obj) {
  return obj instanceof Moment || obj != null && obj._isAMomentObject != null;
}