import { formatMoment } from "../format/format.js";
import { hooks } from "../utils/hooks.js";
import isFunction from "../utils/is-function.js";
hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
export function toString() {
  return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
}
export function toISOString(keepOffset) {
  if (!this.isValid()) {
    return null;
  }

  var utc = keepOffset !== true,
      m = utc ? this.clone().utc() : this;

  if (m.year() < 0 || m.year() > 9999) {
    return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');
  }

  if (isFunction(Date.prototype.toISOString)) {
    // native implementation is ~50x faster, use it when we can
    if (utc) {
      return this.toDate().toISOString();
    } else {
      return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));
    }
  }

  return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');
}
/**
 * Return a human readable representation of a moment that can
 * also be evaluated to get a new moment which is the same
 *
 * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
 */

export function inspect() {
  if (!this.isValid()) {
    return 'moment.invalid(/* ' + this._i + ' */)';
  }

  var func = 'moment',
      zone = '',
      prefix,
      year,
      datetime,
      suffix;

  if (!this.isLocal()) {
    func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
    zone = 'Z';
  }

  prefix = '[' + func + '("]';
  year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
  datetime = '-MM-DD[T]HH:mm:ss.SSS';
  suffix = zone + '[")]';
  return this.format(prefix + year + datetime + suffix);
}
export function format(inputString) {
  if (!inputString) {
    inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
  }

  var output = formatMoment(this, inputString);
  return this.localeData().postformat(output);
}