import { formatDistance, formatDistanceStrict, isValid, parseISO, toDate } from "date-fns";
import moment from "moment";
import numeral from "numeral";

export namespace UIFormat {

  // Dates
  export function parseDate(dt: string | Date) {
    return typeof dt === "string" ? parseISO(dt) : dt;
  }

  export function date(dt: AnyObject, ft: string = "DD/MM/yyyy"): string {
    dt = parseDate(dt);
    return !dt || !isValid(dt)
      ? null
      : moment(dt).format(ft);
  }

  export function time(dt: AnyObject, ft: string = "HH:mm"): string {
    dt = parseDate(dt);
    return !dt || !isValid(dt)
      ? null
      : moment(dt).format(ft);
  }

  export function datetime(dt: AnyObject, ft: string = "DD MMM yyyy HH:mm"): string {
    dt = parseDate(dt);
    return !dt || !isValid(dt)
      ? null
      : moment(dt).format(ft);
  }

  export function utcDate(dt): string {
    dt = parseDate(dt);
    return !dt || !isValid(dt) ? null : toDate(dt).toISOString();
  }

  export function dateToISO(dt): string {
    dt = parseDate(dt);
    return !dt || !isValid(dt)
      ? null
      : moment(dt).format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
  }

  export function age(dt: AnyObject): string {
    dt = parseDate(dt);
    return !dt || !isValid(dt) ? "" : formatDistanceStrict(dt, new Date());
  }

  export function fromNow(dt: AnyObject): string {
    dt = parseDate(dt);
    return !dt || !isValid(dt) ? "" : formatDistance(dt, new Date(), { addSuffix: true });
  }

  // Numbers
  export function number(nm: AnyObject, fm: string = "0,0[.]00"): string {
    return nm === null || isNaN(nm) ? "" : numeral(nm).format(fm);
  }


  export function percent(nm: AnyObject): string {
    return nm === null || isNaN(nm) ? "" : numeral(nm > 1 ? nm / 100 : nm).format("0.00%");
  }

  //currencies
  export function euro(nm: AnyObject): string {
    if (nm === null || isNaN(nm)) return "";
    return (nm as Number).toLocaleString('fr-BE',{
      minimumFractionDigits: 2,
      maximumFractionDigits: 2
    }) + '€';    
  }
}
