class Jcompiler
  @@codes = {}

  private

  attr_accessor :ids

  def b(brand, bind)
    bind.local_variable_set(:brand, brand)
    {
      id: 'brand.id',
      name: 'brand.name',
      description: 'brand.description',
      published_at: 'brand.published_at.utc.iso8601(3)',
      official_url: 'brand.blog_url',
      sex_group: 'brand.blog_sex_switch',
      image_medium: 'absolute_url(brand.image_file.url(:medium))',
      image_square: 'absolute_url(brand.image_file.url(:square))',
      url: 'brand_path(brand)',
      labels: 'brand.new_arrival? ? \'["NEW"]\' : \'[]\''
    }.map do |key, code|
      v = eval(code, bind)
      "\"#{key}\":#{v.is_a?(String) ? ActiveSupport::JSON.encode(v) : v ? v.to_s : 'null'}"
    end
  end

  def a(brands, bind)
    brands.map do |brand|
      "{#{b(brand, bind).join(',')}}"
    end
  end

  def self.code(id, source, bind)
    debugger
    1
  end
end

class JcompilerHandler
  cattr_accessor :default_format
  self.default_format = Mime::JSON

  @@jcompiler = Jcompiler.new

  def self.call(template)
    "Jcompiler.code(\"#{template.identifier}\", \"#{template.source}\", binding)"
  end
end

ActionView::Template.register_template_handler :jcompiler, JcompilerHandler