#
# Project Directory Initialization and new stack creation stubs
#

require 'erb'

TEMPLATE_PATH="#{File.dirname(__FILE__)}/../../../templates/"

namespace :deployinator do

  desc "Initialize the project root for your deployinator instance"
  task :init, :company do |t, args|
    if args[:company].nil?
      puts "You need to specify a company name for your classes."
      puts "for example: rake deployinator:init[Etsy]"
      exit 1
    end

    company = args[:company]
    company[0] = company[0].capitalize
    mkdir_p("lib")
    mkdir_p("stacks")
    mkdir_p("config")
    mkdir_p("log")
    mkdir_p("run_logs")
    mkdir_p("helpers")
    mkdir_p("views")
    mkdir_p("templates")

    template("#{TEMPLATE_PATH}app.rb.erb", "lib/app.rb", binding)
    template("#{TEMPLATE_PATH}config.ru.erb", "config.ru", binding)
  end

  desc "Create a new stack. usage: rake deployinator:new_stack[stack_name]"
  task :new_stack, :stack do |t, args|
    require 'mustache/sinatra'
    if args[:stack].nil?
      puts "You need to specify at least a stack name"
      puts "for example: rake deployinator:init[user_facing_site]"
      exit 1
    end

    stack = args[:stack]
    # Enfore underscore and no camelcase
    stack = stack.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
       gsub(/([a-z\d])([A-Z])/,'\1_\2').
       tr("-", "_").
       downcase
    mustache_class = Mustache.classify(stack)
    user = args[:user]
    repo = args[:repository]

    if File.exists?("stacks/#{stack}.rb") then
      puts "Stack already exists!"
      exit 2
    end

    mkdir_p("stacks")
    mkdir_p("config")
    mkdir_p("log")
    mkdir_p("run_logs")
    mkdir_p("helpers")
    mkdir_p("views")
    mkdir_p("templates")

    template("#{TEMPLATE_PATH}stack.rb.erb", "stacks/#{stack}.rb", binding)
    template("#{TEMPLATE_PATH}helper.rb.erb", "helpers/#{stack}.rb", binding)
    template("#{TEMPLATE_PATH}view.rb.erb", "views/#{stack}.rb", binding)
    cp("#{TEMPLATE_PATH}template.mustache", "templates/#{stack}.mustache")
    touch("log/deployinator.log")
    touch("log/deployinator-timing.log")
    touch("log/development.log")
    touch("config/base.rb")
  end

  def template(source, target, scope)
    unless File.exist?(target) then
      erb = ERB.new(File.read(source))
      File.open(target, "w") do |f|
        f.puts erb.result(scope)
      end
    end
  end
end
