// moon-humanize: MoonBit port of python-humanize.
// See docs/specs/port-to-moonbit.md for the plan.
// Root package re-exports the humanize module.

pub fn clamp(
  value : Double,
  floor~ : Double? = None,
  ceil~ : Double? = None,
  floor_token~ : String = "<",
  ceil_token~ : String = ">",
  format~ : (Double) -> String = @humanize.default_clamp_fmt,
) -> String {
  @humanize.clamp(value, floor~, ceil~, floor_token~, ceil_token~, format~)
}

pub fn metric(value : Double, unit~ : String = "", precision~ : Int = 3) -> String {
  @humanize.metric(value, unit~, precision~)
}

pub fn intcomma(value : String, ndigits~ : Int? = None) -> String {
  @humanize.intcomma(value, ndigits~)
}

pub fn intword(value : String, format~ : String = "%.1f") -> String {
  @humanize.intword(value, format~)
}

pub fn apnumber(value : String) -> String {
  @humanize.apnumber(value)
}

pub fn fractional(value : String) -> String {
  @humanize.fractional(value)
}

pub fn scientific(value : String, precision~ : Int = 2) -> String {
  @humanize.scientific(value, precision~)
}

pub fn ordinal(value : String) -> String {
  @humanize.ordinal(value)
}

// Library version. Must stay in sync with moon.mod `version` and
// src/humanize/wasm.mbt `wasm_version()` (see spec §5.3).
pub let __version__ : String = "0.1.2"

// —— time ——
pub fn naturalday(
  value : @humanize.Date,
  when~ : @humanize.Date = @humanize.Date::today(),
  format~ : String = "%b %d",
) -> String {
  @humanize.naturalday(value, when~, format~)
}

pub fn naturaldate(
  value : @humanize.Date,
  when~ : @humanize.Date = @humanize.Date::today(),
) -> String {
  @humanize.naturaldate(value, when~)
}

pub fn naturaldelta(
  value : @humanize.TimeInput,
  months~ : Bool = true,
  minimum_unit~ : @humanize.TimeUnit = @humanize.TimeUnit::seconds(),
) -> String {
  @humanize.naturaldelta(value, months~, minimum_unit~)
}

pub fn naturaltime(
  value : @humanize.TimeInput,
  future~ : Bool = false,
  months~ : Bool = true,
  minimum_unit~ : @humanize.TimeUnit = @humanize.TimeUnit::seconds(),
  when~ : @humanize.DateTime? = None,
) -> String {
  @humanize.naturaltime(value, future~, months~, minimum_unit~, when~)
}

pub fn precisedelta(
  value : @humanize.TimeInput,
  minimum_unit~ : @humanize.TimeUnit = @humanize.TimeUnit::seconds(),
  format~ : String = "%0.2f",
  suppress~ : Array[@humanize.TimeUnit] = [],
) -> String {
  @humanize.precisedelta(value, minimum_unit~, format~, suppress~)
}

// —— filesize ——
pub fn naturalsize(
  value : Double,
  binary~ : Bool = false,
  gnu~ : Bool = false,
  format~ : String = "%.1f",
) -> String {
  @humanize.naturalsize(value, binary~, gnu~, format~)
}

// —— lists ——
pub fn natural_list(
  value : ArrayView[String],
  style~ : String = "standard",
  cx~ : String = ", ",
  ox~ : String = " ",
) -> String {
  @humanize.natural_list(value, style~, cx~, ox~)
}

// —— i18n ——
pub fn activate(locale : String) -> Option[@humanize.Locale] {
  @humanize.activate(locale)
}

pub fn deactivate() -> Unit {
  @humanize.deactivate()
}

pub fn decimal_separator() -> String {
  @humanize.decimal_separator()
}

pub fn thousands_separator() -> String {
  @humanize.thousands_separator()
}