module SiteTextClassMethods

  def text_types
    @types || []
  end

  def find_text_type(ct)
    SiteText.text_types.find {|t| t.text_type == ct.to_sym}
  end

  def add_text_type(text_type, opts=nil)
    opts ||= {}
    @types ||= []
    format = opts[:format] || :markdown
    @types << SiteTextType.new(text_type, format, opts)
  end

  def text_for_cache
    @text_for_cache ||= DistributedCache.new("text_for_cache")
  end

  def text_for(text_type, replacements=nil)
    text = nil
    text = text_for_cache[text_type] if replacements.blank?
    text ||= uncached_text_for(text_type, replacements)
  end

  def uncached_text_for(text_type, replacements=nil)
    store_cache = replacements.blank?

    replacements ||= {}
    replacements = {site_name: SiteSetting.title}.merge!(replacements)
    replacements = SiteSetting.settings_hash.merge!(replacements)

    site_text = SiteText.select(:value).find_by(text_type: text_type)

    result = ""
    if site_text.blank?
      ct = find_text_type(text_type)
      result = ct.default_text.dup if ct.present?
    else
      result = site_text.value.dup
    end

    result.gsub!(/\%\{[^}]+\}/) do |m|
      replacements[m[2..-2].to_sym] || m
    end

    if store_cache
      result.freeze
      text_for_cache[text_type] = result
    end

    result
  end

  def find_or_new(text_type)
    site_text = SiteText.find_by(text_type: text_type)
    return site_text if site_text.present?

    site_text = SiteText.new
    site_text.text_type = text_type
    site_text
  end

end