#!/usr/bin/env ruby
# environmentalize
# Author: John Trupiano

require 'fileutils'
include FileUtils

require 'yaml'

rails_root = ARGV[0] || '.'
puts "rails_root: #{rails_root}"
config_base = File.join(rails_root, 'config')
old_env_dir = File.join(config_base, 'environments')

%w(demo development production staging test).each do |env|
  dir = File.join(config_base, env)
	if !File.directory?(dir)
		puts "mkdir -p #{dir}"
		mkdir_p dir
	end
	old_env_file = File.join(old_env_dir, "#{env}.rb")
	if File.exists?(old_env_file)
	  new_env_file = File.join(dir, "environment.rb")
	  puts "mv #{old_env_file} #{new_env_file}"
	  mv(old_env_file, new_env_file)
	end
end

# Copy production for these guys if it wasn't already found
%w(demo staging).each do |env|
  new_env_file = File.join(config_base, env, "environment.rb")
  prod_env_file = File.join(config_base, "production", "environment.rb")
  if !File.exists?(new_env_file)
    puts "cp #{prod_env_file} #{new_env_file}"
    cp(prod_env_file, new_env_file)
  end
end

postboot = File.join(config_base, "postboot.rb")
if !File.exists?(postboot)
  gem_postboot = File.dirname(__FILE__) + '/../lib/conf/postboot.rb'
  puts "cp #{gem_postboot} #{postboot}"
  cp(gem_postboot, postboot)
end

preinitializer = File.join(config_base, "preinitializer.rb")
if !File.exists?(preinitializer)
  gem_preinitializer = File.join(File.dirname(__FILE__), '..', 'lib', 'conf', 'preinitializer.rb')
  puts "cp #{gem_preinitializer} #{preinitializer}"
  cp(gem_preinitializer, preinitializer)
end

boot_file = File.join(config_base, "boot.rb")
boot_contents = File.open(boot_file).read
if !boot_contents.include?("require File.join(File.dirname(__FILE__), 'postboot')")
  
  contents = <<-CONTENTS
# Load postboot file to change Rails paths
require File.join(File.dirname(__FILE__), 'postboot')
  CONTENTS
  
  boot_contents << contents
  File.open(boot_file, 'w') {|f| f.write(boot_contents) }
end

if File.directory?(old_env_dir)
  puts "Removing #{old_env_dir}"
  rm_rf(old_env_dir)
end

# Handle database.yml now
old_db_yml = File.join(config_base, 'database.yml')
if File.exists?(old_db_yml)
  y = YAML.load_file(old_db_yml)
  %w(demo development production staging test).each do |env|
    new_db_yml = File.join(config_base, env, 'database.yml')
    if !File.exists?(new_db_yml)
      if !y[env].nil?
        puts "Writing #{new_db_yml}"
        # remove all other keys
        y_dup = y.reject {|key, value| key != env}
        File.open(new_db_yml, 'w') {|f| f. write(y_dup.to_yaml) }
      end
    end
  end
  puts "Removing #{old_db_yml}"
  rm_f(old_db_yml)
end