export const formatTimestamp = (
  timestamp?: number | string | Date,
  format: Intl.DateTimeFormatOptions = { hour12: false }
): string => {
  if (!timestamp) {
    return '';
  }

  // empty array gets the default one from the browser
  const date = new Date(timestamp);

  // invalid date
  if (Number.isNaN(date.getTime())) {
    return '';
  }

  // browser support
  const language = navigator.language || navigator.languages[0];
  return date.toLocaleString(language || [], format);
};

export const formatMilliseconds = (input = 0) => {
  const milliseconds = Math.max(input || 0, 0);

  const seconds = Math.floor(milliseconds / 1000);
  const minutes = Math.floor(seconds / 60);
  const hours = Math.floor(minutes / 60);

  if (hours > 0) {
    return `${hours}h ${minutes % 60}m`;
  }

  if (minutes > 0) {
    return `${minutes}m ${seconds % 60}s`;
  }

  if (seconds > 0) {
    return `${seconds}s`;
  }

  return `${milliseconds}ms`;
};

export const passedTime = (value: number) => (value < 10 ? `0${value}` : value);

export const calculateTimer = (startedAt: number) => {
  const nowDate = new Date();
  const now = nowDate.getTime();
  const newDate = now - startedAt;
  const minutes = nowDate.getMinutes();
  const second = nowDate.getSeconds();

  return newDate > 0 ? `${passedTime(minutes)}:${passedTime(second)}` : '00:00';
};
