export const isToday = (date) => {
  const today = new Date();

  return (
    /* eslint-disable operator-linebreak */
    date.getDate() === today.getDate() &&
    date.getMonth() === today.getMonth() &&
    date.getFullYear() === today.getFullYear()
    /* eslint-enable */
  );
};

export const avatarText = (value) => {
  if (!value) return "";
  const nameArray = value.split(" ");

  return nameArray.map((word) => word.charAt(0).toUpperCase()).join("");
};
// TODO: Try to implement this: https://twitter.com/fireship_dev/status/1565424801216311297
export const kFormatter = (num) => {
  const regex = /\B(?=(\d{3})+(?!\d))/g;

  return Math.abs(num) > 9999
    ? `${Math.sign(num) * +(Math.abs(num) / 1000).toFixed(1)}k`
    : Math.abs(num).toFixed(0).replace(regex, ",");
};

/**
 * Format and return date in Humanize format
 * Intl docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/format
 * Intl Constructor: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat
 * @param {String} value date to format
 * @param {Intl.DateTimeFormatOptions} formatting Intl object to format with
 */
export const formatDate = (
  value,
  formatting = { month: "short", day: "numeric", year: "numeric" }
) => {
  if (!value) return value;

  return new Intl.DateTimeFormat("en-US", formatting).format(new Date(value));
};

/**
 * Return short human friendly month representation of date
 * Can also convert date to only time if date is of today (Better UX)
 * @param {String} value date to format
 * @param {Boolean} toTimeForCurrentDay Shall convert to time if day is today/current
 */
export const formatDateToMonthShort = (value, toTimeForCurrentDay = true) => {
  const date = new Date(value);
  let formatting = { month: "short", day: "numeric" };

  if (toTimeForCurrentDay && isToday(date))
    formatting = { hour: "numeric", minute: "numeric" };

  return new Intl.DateTimeFormat("en-US", formatting).format(new Date(value));
};
/**
 * Return short human friendly Time in 12 Hour representation
 * @param {String} value timestamp to format
 */
export const formatTimestampTo12HTime = (value) => {
  const date = new Date(value);

  const timeFormatter = new Intl.DateTimeFormat("en-US", {
    hour: "numeric",
    minute: "numeric",
    hour12: true,
  });

  const formattedTime = timeFormatter.format(date);

  return formattedTime;
};

export const formatDateTime = (value) => {
  const datetime = new Date(value); // current datetime

  const options = {
    year: "numeric",
    month: "long",
    day: "numeric",
    hour: "numeric",
    minute: "numeric",
    hour12: true,
  };
  return datetime.toLocaleString("en-US", options);
};
export const formateToDate = (value) => {
  const datetime = new Date(value); // current datetime

  const year = datetime.getFullYear();
  const month = String(datetime.getMonth() + 1).padStart(2, "0");
  const day = String(datetime.getDate()).padStart(2, "0");
  return `${year}-${month}-${day}`;
};
export const formatToYearMonth = (value) => {
  const datetime = new Date(value); // current datetime

  const options = {
    year: "numeric",
    month: "long",
  };
  return datetime.toLocaleString("en-US", options);
};
