import { get, set } from "./get-set.js";
import { setMonth } from "../units/month.js";
import { createDuration } from "../duration/create.js";
import { deprecateSimple } from "../utils/deprecate.js";
import { hooks } from "../utils/hooks.js";
import absRound from "../utils/abs-round.js"; // TODO: remove 'name' arg after deprecation is removed

function createAdder(direction, name) {
  return function (val, period) {
    var dur, tmp; //invert the arguments, but complain about it

    if (period !== null && !isNaN(+period)) {
      deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
      tmp = val;
      val = period;
      period = tmp;
    }

    dur = createDuration(val, period);
    addSubtract(this, dur, direction);
    return this;
  };
}

export function addSubtract(mom, duration, isAdding, updateOffset) {
  var milliseconds = duration._milliseconds,
      days = absRound(duration._days),
      months = absRound(duration._months);

  if (!mom.isValid()) {
    // No op
    return;
  }

  updateOffset = updateOffset == null ? true : updateOffset;

  if (months) {
    setMonth(mom, get(mom, 'Month') + months * isAdding);
  }

  if (days) {
    set(mom, 'Date', get(mom, 'Date') + days * isAdding);
  }

  if (milliseconds) {
    mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
  }

  if (updateOffset) {
    hooks.updateOffset(mom, days || months);
  }
}
export var add = createAdder(1, 'add'),
    subtract = createAdder(-1, 'subtract');