class Locale < ApplicationRecord
  def self.load(name, opts = {})
    @cache ||= {}
    @cache[name.to_sym] ||= look_up(name)&.normalized_value
    locale = opts.delete(:locale) || I18n.locale
    @cache[name.to_sym][locale.to_sym].gsub(/%(?!{)/, '%%') % opts
  end

  def update(hash)
    if super(hash)
      self.class.refresh(key)
    else
      false
    end
  end

  def self.refresh(name)
    @cache ||= {}
    @cache[name.to_sym] = look_up(name)&.normalized_value
  end

  def normalized_value
    { en: text_en, fr: text_fr }
  end

  def self.look_up(name)
    find_by(key: name) || fallback_look_up(name)
  end

  private

  def self.fallback_look_up(name)
    whitelist_values = Rails.root.join('lib/tasks/parameters.rake').read.lines.map { |l| l.match(/I18n.t\(['"]([^'"]+)/).try(:[], 1) }.compact
    locale_name = whitelist_values.detect { |v| v == name }
    if locale_name
      Locale.create_with(text_en: I18n.t(locale_name, locale: :en), text_fr: I18n.t(locale_name, locale: :fr)).find_or_create_by(key: locale_name)
    else
      raise ActiveRecord::RecordNotFound.new("Couldn't find key = '#{name}' for #{self.name}", self.name)
    end
  end
end
