import { get, set } from './get-set';

import { setMonth } from '../units/month';

import { createDuration } from '../duration/create';

import { deprecateSimple } from '../utils/deprecate';

import { hooks } from '../utils/hooks';

import absRound from '../utils/abs-round';





// 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;

        }



        val = typeof val === 'string' ? +val : val;

        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');

export var subtract = createAdder(-1, 'subtract');



