module Concerns::Locale
  extend ActiveSupport::Concern

  included do
    before_action :set_locale
  end

  def explicitly_requested_language
    params[:locale]
  end

  def user_settings_language
    current_user&.locale
  end

  def session_language
    session[:locale]
  end

  def browser_language
    request.env['HTTP_ACCEPT_LANGUAGE'] ? request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first : nil
  end

  def default_language
    FoodsoftConfig[:default_locale] || ::I18n.default_locale
  end

  private

  def select_language_according_to_priority
    language = explicitly_requested_language || session_language || user_settings_language
    language ||= browser_language unless FoodsoftConfig[:ignore_browser_locale]
    language.presence&.to_sym unless language.blank?
  end

  def available_locales
    ::I18n.available_locales
  end

  def set_locale
    if available_locales.include?(select_language_according_to_priority)
      ::I18n.locale = select_language_according_to_priority
    else
      ::I18n.locale = default_language
    end

    locale = session[:locale] = ::I18n.locale
    logger.info("Set locale to #{locale}")
  end
end
