import memoize from 'nano-memoize';
import {MessageDescriptor} from './message-descriptor';

// this will get memoized by enclosing function (<Trans> or useTrans)
export function handlePluralMessage(
  localeCode: string,
  {message, values}: MessageDescriptor
): string {
  // find plural config e.g. [one 1 item|other {count} items]
  const match = message.match(/\[(.+?)]/);
  const count = values?.count;
  if (match && match[1] && !Number.isNaN(count)) {
    // get config without brackets and split by pipe e.g. [one 1 item, other {count} items]
    const [pluralPlaceholder, pluralConfig] = match;
    const choices = pluralConfig.split('|');
    if (!choices.length) return message;

    // use Intl.PluralRules to determine which choice to use, based on special "count" value
    const rules = getRules(localeCode);
    const choiceName = rules.select(count as number);

    // find the correct choice from config, or use first one
    let choiceConfig = choices.find(c => {
      return c.startsWith(choiceName);
    });
    if (!choiceConfig) {
      choiceConfig = choices[0];
    }

    // get rid of plural prefix e.g. one 1 item => 1 item
    const choice = choiceConfig.substring(choiceConfig.indexOf(' ') + 1);

    return message.replace(pluralPlaceholder, choice);
  }
  return message;
}

const getRules = memoize((localeCode: string) => {
  return new Intl.PluralRules(localeCode);
});
