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

function sign(x) {
  return (x > 0) - (x < 0) || +x;
}

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,
      days = abs(this._days),
      months = abs(this._months),
      minutes,
      hours,
      years,
      s,
      total = this.asSeconds(),
      totalSign,
      ymSign,
      daysSign,
      hmsSign;

  if (!total) {
    // this is the same as C#'s (Noda) and python (isodate)...
    // but not other JS (goog.date)
    return 'P0D';
  } // 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

  s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
  totalSign = total < 0 ? '-' : '';
  ymSign = sign(this._months) !== sign(total) ? '-' : '';
  daysSign = sign(this._days) !== sign(total) ? '-' : '';
  hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';
  return totalSign + 'P' + (years ? ymSign + years + 'Y' : '') + (months ? ymSign + months + 'M' : '') + (days ? daysSign + days + 'D' : '') + (hours || minutes || seconds ? 'T' : '') + (hours ? hmsSign + hours + 'H' : '') + (minutes ? hmsSign + minutes + 'M' : '') + (seconds ? hmsSign + s + 'S' : '');
}