// @ts-ignore
import EmojiConvertor from 'emoji-js';

const instance = new EmojiConvertor();
instance.init_unified();
instance.init_colons();
instance.img_sets.apple.path = 'node_modules/emoji-datasource-apple/img/apple/64/';
instance.include_title = true;
instance.replace_mode = 'img';
instance.supports_css = false; // needed to avoid spans with background-image

export type SizeClassType = '' | 'small' | 'medium' | 'large' | 'jumbo';

export function getRegex(): RegExp {
  return instance.rx_unified;
}

export function getTitle(value: string): string | undefined {
  return instance.data[value][3][0];
}

export function findImage(value: string, variation?: string) {
  return instance.find_image(value, variation);
}

function getCountOfAllMatches(str: string, regex: RegExp) {
  let match = regex.exec(str);
  let count = 0;

  if (!regex.global) {
    return match ? 1 : 0;
  }

  while (match) {
    count += 1;
    match = regex.exec(str);
  }

  return count;
}

function hasNormalCharacters(str: string) {
  const noEmoji = str.replace(instance.rx_unified, '').trim();

  return noEmoji.length > 0;
}

export function getSizeClass(str: string): SizeClassType {
  if (hasNormalCharacters(str)) {
    return '';
  }

  const emojiCount = getCountOfAllMatches(str, instance.rx_unified);
  if (emojiCount > 8) {
    return '';
  } else if (emojiCount > 6) {
    return 'small';
  } else if (emojiCount > 4) {
    return 'medium';
  } else if (emojiCount > 2) {
    return 'large';
  } else {
    return 'jumbo';
  }
}

const VARIATION_LOOKUP: { [index: string]: string } = {
  '\uD83C\uDFFB': '1f3fb',
  '\uD83C\uDFFC': '1f3fc',
  '\uD83C\uDFFD': '1f3fd',
  '\uD83C\uDFFE': '1f3fe',
  '\uD83C\uDFFF': '1f3ff',
};

// Taken from emoji-js/replace_unified
export function getReplacementData(
  m: string,
  p1: string | undefined,
  p2: string | undefined
): string | { value: string; variation?: string } {
  const unified = instance.map.unified[p1];
  if (unified) {
    const variation = VARIATION_LOOKUP[p2 || ''];
    if (variation) {
      return {
        value: unified,
        variation,
      };
    }

    return {
      value: unified,
    };
  }

  const unifiedVars = instance.map.unified_vars[p1];
  if (unifiedVars) {
    return {
      value: unifiedVars[0],
      variation: unifiedVars[1],
    };
  }

  return m;
}