import get from 'lodash/get';
export interface LangRef {
  locales: string[];
  messages: {
    message: {
      [section: string]: {
        [translation: string]: string;
      };
    };
  };
}

export default class langHelper {
  private static locale = 'en';
  private static reference: LangRef[];

  static setLocale(lang: string): void {
    this.locale = lang;
  }

  static setReference(ref: LangRef[]): void {
    this.reference = ref;
  }

  static getBrowserLocales(options = {}): string[] {
    const defaultOptions = {
      languageCodeOnly: true,
      defaultLanguage: 'en',
    };

    const opt = {
      ...defaultOptions,
      ...options,
    };

    const browserLocales =
      navigator.languages === undefined
        ? [navigator.language]
        : navigator.languages;

    if (!browserLocales) {
      return [opt.defaultLanguage];
    }

    return browserLocales.map((locale) => {
      const trimmedLocale = locale.trim();

      return opt.languageCodeOnly
        ? trimmedLocale.split(/-|_/)[0]
        : trimmedLocale;
    });
  }

  static getPageLang(options = {}): string {
    const defaultOptions = {
      languageCodeOnly: true,
      availableLanguages: ['en'],
      defaultLanguage: 'en',
    };

    const opt = {
      ...defaultOptions,
      ...options,
    };

    const pageLang = document.documentElement.lang;
    let allLangs: string[] = [];
    if (pageLang) {
      allLangs = opt.languageCodeOnly ? [pageLang.split(/-|_/)[0]] : [pageLang];
    } else {
      const fOpts = {
        anguageCodeOnly: opt.languageCodeOnly,
        defaultLanguage: opt.defaultLanguage,
      };
      allLangs = this.getBrowserLocales(fOpts);
    }

    const detectedLocale = allLangs.find((x) =>
      opt.availableLanguages.includes(x)
    );

    return detectedLocale || opt.defaultLanguage;
  }

  static localTranslation(stringId: string, defaultString: string): string {
    const currentRef = this.reference?.find((ref) =>
      ref.locales.includes(this.locale)
    );
    const currentMessages = currentRef?.messages;
    return currentMessages
      ? get(currentMessages as unknown, stringId, defaultString)
      : defaultString;
  }
}
