class Parameter < ApplicationRecord
  def self.load(name)
    @cache ||= {}
    @cache[name.to_sym] ||= look_up(name)&.normalized_value
  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
    case value
    when 'true', 'on', 'yes', '1'
      true
    when 'false', 'off', 'no', '0'
      false
    when ''
      nil
    else
      JSON.parse(value) rescue value
    end
  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(/Settings\.([^)]+)/).try(:[], 1) }.compact
    parameter_name = whitelist_values.detect { |v| v == name }
    if parameter_name
      Parameter.create_with(value: eval("Settings.#{parameter_name}")).find_or_create_by(key: parameter_name)
    else
      raise ActiveRecord::RecordNotFound.new("Couldn't find key = '#{name}' for #{self.name}", self.name)
    end
  end
end
