export function truncateText(input: string, length: number = 1000): string {
  return input.length > length ? input.substring(0, length) + '...' : input;
}

export function formatNumberToShortForm(number: number, locale: string = 'en-uS') {
  let suffix = '';
  let value = number;

  if (Math.abs(number) >= 1e9) {
    value = number / 1e9;
    suffix = 'b';
  } else if (Math.abs(number) >= 1e6) {
    value = number / 1e6;
    suffix = 'M';
  } else if (Math.abs(number) >= 1e3) {
    value = number / 1e3;
    suffix = 'k';
  }

  // Format the number to have up to 4 significant digits
  const formattedValue = new Intl.NumberFormat(locale, {
    maximumSignificantDigits: 4,
    minimumSignificantDigits: 3,
    minimumFractionDigits: 0,
    maximumFractionDigits: 2,
  }).format(value);

  return `${formattedValue}${suffix}`;
}

export function normalize(value: string) {
  return value
    .toString()
    .normalize('NFD')
    .replace(/[\u0300-\u036f]/g, '')
    .replace(/[^a-zA-Z\s\d]/g, '')
    .trim();
}

export function toTitleCase(value: string) {
  return value.replace(/\w\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase());
}

export function escapeMarkdown(text: string) {
  return text.replace(/([\\_*~`|])/g, '\\$1');
}

export function escapeCodeBlock(text: string) {
  return text.replace(/```/g, '`\u200b``');
}

export function escapeInlineCode(text: string) {
  return text.replace(/`/g, '\u200b`');
}

export function escapeSpoiler(text: string) {
  return text.replace(/\|\|/g, '|\u200b|');
}

export function escapeAll(text: string) {
  return escapeMarkdown(escapeCodeBlock(escapeInlineCode(escapeSpoiler(text))));
}
