# frozen_string_literal: true

class ExtraLocalesController < ApplicationController
  layout :false

  skip_before_action :check_xhr,
                     :preload_json,
                     :redirect_to_login_if_required,
                     :verify_authenticity_token

  OVERRIDES_BUNDLE ||= "overrides"
  MD5_HASH_LENGTH ||= 32

  def show
    bundle = params[:bundle]
    raise Discourse::InvalidAccess.new if !valid_bundle?(bundle)

    version = params[:v]
    if version.present?
      if version.kind_of?(String) && version.length == MD5_HASH_LENGTH
        hash = ExtraLocalesController.bundle_js_hash(bundle)
        immutable_for(1.year) if hash == version
      else
        raise Discourse::InvalidParameters.new(:v)
      end
    end

    render plain: ExtraLocalesController.bundle_js(bundle), content_type: "application/javascript"
  end

  def self.bundle_js_hash(bundle)
    if bundle == OVERRIDES_BUNDLE
      site = RailsMultisite::ConnectionManagement.current_db

      @by_site ||= {}
      @by_site[site] ||= {}
      @by_site[site][I18n.locale] ||= begin
        js = bundle_js(bundle)
        js.present? ? Digest::MD5.hexdigest(js) : nil
      end
    else
      @bundle_js_hash ||= {}
      @bundle_js_hash["#{bundle}_#{I18n.locale}"] ||= Digest::MD5.hexdigest(bundle_js(bundle))
    end
  end

  def self.url(bundle)
    "#{Discourse.base_path}/extra-locales/#{bundle}?v=#{bundle_js_hash(bundle)}"
  end

  def self.client_overrides_exist?
    bundle_js_hash(OVERRIDES_BUNDLE).present?
  end

  def self.bundle_js(bundle)
    locale_str = I18n.locale.to_s
    bundle_str = "#{bundle}_js"

    if bundle == OVERRIDES_BUNDLE
      JsLocaleHelper.output_client_overrides(locale_str)
    else
      JsLocaleHelper.output_extra_locales(bundle_str, locale_str)
    end
  end

  def self.clear_cache!
    site = RailsMultisite::ConnectionManagement.current_db
    @by_site&.delete(site)
  end

  private

  def valid_bundle?(bundle)
    bundle == OVERRIDES_BUNDLE || (bundle =~ /\A(admin|wizard)\z/ && current_user&.staff?)
  end
end