const URL_TOKEN_PREFIX = '__SMS_URL_';

function stripEmojis(value: string) {
  return value
    .replace(/[\uD83C-\uDBFF\uDC00-\uDFFF]+/g, '')
    .replace(/[\u2600-\u27BF]/g, '');
}

export function sanitizeSmsText(message: string) {
  const urls: string[] = [];
  let text = String(message || '');

  text = text.replace(/https?:\/\/[^\s]+/g, (url) => {
    urls.push(url);
    return `${URL_TOKEN_PREFIX}${urls.length - 1}__`;
  });

  text = stripEmojis(text)
    .replace(/\u2014/g, '-')
    .replace(/\u2013/g, '-')
    .replace(/\u2212/g, '-')
    .replace(/[\u00B7\u2022\u2023\u2043\u2219]/g, '.')
    .replace(/[\u2018\u2019]/g, "'")
    .replace(/[\u201C\u201D]/g, '"')
    .replace(/\u2026/g, '...')
    .replace(/[\u00A0\u202F]/g, ' ')
    .replace(/[^\S\r\n]+/g, ' ')
    .replace(/[^\x09\x0A\x0D\x20-\x7E]/g, '');

  urls.forEach((url, index) => {
    text = text.replace(`${URL_TOKEN_PREFIX}${index}__`, url);
  });

  return text
    .replace(/[ \t]+\n/g, '\n')
    .replace(/\n{3,}/g, '\n\n')
    .trim();
}

export function formatSmsMoney(amount: number) {
  const value = Number(amount || 0);
  const fixed = value.toFixed(2);
  const [whole, fraction] = fixed.split('.');
  const withCommas = whole.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  return `GHS ${withCommas}.${fraction}`;
}
