import absFloor from '../utils/abs-floor'; var abs = Math.abs;

export function toISOString() {

// for ISO strings we do not use the normal bubbling rules:
//  * milliseconds bubble up until they become hours
//  * days do not bubble at all
//  * months bubble up until they become years
// This is because there is no context-free conversion between hours and days
// (think of clock changes)
// and also not between days and months (28-31 days per month)
if (!this.isValid()) {
    return this.localeData().invalidDate();
}

var seconds = abs(this._milliseconds) / 1000;
var days         = abs(this._days);
var months       = abs(this._months);
var minutes, hours, years;

// 3600 seconds -> 60 minutes -> 1 hour
minutes           = absFloor(seconds / 60);
hours             = absFloor(minutes / 60);
seconds %= 60;
minutes %= 60;

// 12 months -> 1 year
years  = absFloor(months / 12);
months %= 12;

// inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
var Y = years;
var M = months;
var D = days;
var h = hours;
var m = minutes;
var s = seconds;
var total = this.asSeconds();

if (!total) {
    // this is the same as C#'s (Noda) and python (isodate)...
    // but not other JS (goog.date)
    return 'P0D';
}

return (total < 0 ? '-' : '') +
    'P' +
    (Y ? Y + 'Y' : '') +
    (M ? M + 'M' : '') +
    (D ? D + 'D' : '') +
    ((h || m || s) ? 'T' : '') +
    (h ? h + 'H' : '') +
    (m ? m + 'M' : '') +
    (s ? s + 'S' : '');

}