import format from 'date-fns/format'
import formatDistanceToNow from 'date-fns/formatDistanceToNow'
import deLocale from 'date-fns/locale/de'
import enLocale from 'date-fns/locale/en-GB'
import esLocale from 'date-fns/locale/es'
import frLocale from 'date-fns/locale/fr'
import itLocale from 'date-fns/locale/it'
import ruLocale from 'date-fns/locale/ru'
import viLocale from 'date-fns/locale/vi'

import { DEFAULT_LANG } from '.'

let currentLocale

const getDateFnsLocale = lang => {
  switch (lang) {
    case 'en':
      return enLocale
    case 'fr':
      return frLocale
    case 'es':
      return esLocale
    case 'de':
      return deLocale
    case 'it':
      return itLocale
    case 'ru':
      return ruLocale
    case 'vi':
      return viLocale
    default:
      throw new Error('Locale not found')
  }
}

const getWarningMessage = lang =>
  `The "${lang}" locale isn't supported by date-fns or has not been included in the build. Check if you have configured a ContextReplacementPlugin that is too restrictive.`

export const provideDateFnsLocale = (userLang, defaultLang = DEFAULT_LANG) => {
  try {
    const userLocale = getDateFnsLocale(userLang)
    currentLocale = userLocale
    return userLocale
  } catch (_e) {
    // eslint-disable-next-line no-console
    console.warn(getWarningMessage(userLang))
  }

  try {
    const defaultLocale = getDateFnsLocale(defaultLang)
    currentLocale = defaultLocale
    return defaultLocale
  } catch (_err) {
    // eslint-disable-next-line no-console
    console.warn(getWarningMessage(defaultLang))
  }
}

export const initFormat =
  (userLang, defaultLang = DEFAULT_LANG) =>
  (date, formatStr, opts = {}) => {
    const locale = provideDateFnsLocale(userLang, defaultLang)
    const ensureDate = date && typeof date === 'string' ? new Date(date) : date

    try {
      return format(ensureDate, formatStr, { locale, ...opts })
    } catch (error) {
      // eslint-disable-next-line no-console
      console.error('Error in initFormat', error)
    }
  }

export const formatLocallyDistanceToNow = date => {
  return formatDistanceToNow(date, { locale: currentLocale })
}
