require "erb"

class Merb < Generator
  cattr_accessor :merb_models
  self.merb_models = []

  module MerbModel
    def merb_symname
      '@' + self.s
    end
    
    def merb_plural_symname
      '@' + self.p
    end
    
    def merb_find_string
      "    #{self.merb_symname} = #{self.cs}.get(id)
    raise NotFound unless <%= self.merb_symname -%>"
    end

    def merb_make_new
      self.merb_symname + " #{self.cs}.new" 
    end
  end
  
  def app_name(opts = { })
    name = app.name
    name << "_merb" if opts[:prefix]
    name
  end

  def generate
    app.models.values.each do |m|
      merb_models  << merbify(m)
    end
    
    gen_app
    merb_models.each do |merb_model|
      gen_routes
      gen_migration(merb_model)
      gen_model(merb_model)
      gen_controller(merb_model)
      gen_view(merb_model)
    end
  end

  def merbify(model)
    model.class_eval( "extend MerbModel" )
    model
  end

  def Merb.db_value_name(str)
    #    { "string" => "String", "text"}[str]
    str.capitalize
  end
  
  # gonna get Foy to help with this.
  def gen_app # this is just heinous.  Maybe get rid of it?
    `#{gen_app_string}`
  end

  def gen_app_string
    "merb-gen app #{app.name}"
  end
  
  def gen_routes
    arr = app.routes
    insert_string = arr.map { |a| gen_route(a)}.join("\n") + "\n"
    File.open("#{app_name}/config/router.rb", "w") do |f|
      f.write gen_routes_string
    end
  end

  def gen_routes_string
    arr = app.routes
    insert_string = arr.map { |a| gen_route(a)}.join("\n") + "\n"
    'Merb.logger.info("Compiling routes...")
Merb::Router.prepare do' + "\n"  + 
      insert_string + 
      "end"
  end

  def gen_route(x, pad = "  ")
    if x.is_a? Symbol
      pad + "resources :#{x.to_s}"
    elsif x.is_a? Array
      pad + "resources :#{x.first.to_s} do\n" +
        x[1..-1].map { |y| gen_route(y, pad + "  ")}.join("\n") + "\n" +
        pad + "end"
    end
  end
  
  def gen_migration(model)
  end
  
  def gen_model(model)
    template_str = File.open("#{File.dirname(__FILE__)}/merb/model.rb.erb").read
    ERB.new(template_str).result(binding)
  end

  def gen_controller(model)
  end

  def gen_view(model)
  end
end