import crypto from 'crypto'

export default class StringUtils {
  /**
   * Normalise une chaine de caractères en retirant la casse et les caractères spéciaux, à des fins de recherche
   * par exemple
   * @param s
   */
  public static normalize(s: string): string {
    return s
      .toLowerCase()
      .replace(/[éèẽëêēĕėęě]/g, 'e')
      .replace(/[çćĉċč]/g, 'c')
      .replace(/[îïĩìíīĭ]/g, 'i')
      .replace(/[àãâåáäāăą]/g, 'a')
      .replace(/[ĝğġģ]/g, 'g')
      .replace(/[ħĥ]/g, 'h')
      .replace(/[öôõó]/g, 'o')
      .replace(/[ûüũùú]/g, 'u')
      .replace(/[š]/g, 's')
      .replace(/[ÿý]/g, 'y')
      .replace(/[ž]/g, 'z')
      .replace(/-/g, ' ')
      .trim()
  }

  /**
   * Convertit le paramètre d'entrée en entier
   * A la différence de parseInt, cette méthode accepte aussi les nombres.
   * @param s
   */
  public static parseInt(s: string | number) {
    return typeof s === 'number' ? s : parseInt(s)
  }

  /**
   * Hash une chaine de caractères avec l'algorithme demandé
   *
   * @param input
   * @param algorithm
   */
  public static async hash(input: string, algorithm: string = 'SHA-256') {
    const textAsBuffer = new TextEncoder().encode(input)

    const isNode =
      typeof process !== 'undefined' &&
      process.versions != null &&
      process.versions.node != null

    const cryptoLib = isNode ? crypto : window.crypto

    const hashBuffer = await cryptoLib.subtle.digest(algorithm, textAsBuffer)

    const hashArray = Array.from(new Uint8Array(hashBuffer))
    return hashArray.map((item) => item.toString(16).padStart(2, '0')).join('')
  }
}
