#!/usr/bin/env ruby
require File.join(File.dirname(__FILE__), '..', 'config', 'boot')

$LOAD_PATH << File.join(File.dirname(__FILE__), '..')

require 'rubygems'
gem 'rails'

require 'ruby_version_check'
Signal.trap("INT") { puts; exit }

require 'lib/spree'
if ARGV.any? { |arg| %w(--version -v).any? { |flag| arg == flag } }
  puts "Spree #{Spree::Version}"
  exit 0
end

# configuration must be set or we get uninitialized class variable @@configuration (introduced w/rails 2.1)
require 'spree/initializer'
Rails.configuration = Spree::Configuration.new

#  Upddate will replace certain javascript, stylesheet assets, etc. but the replaced files are preserved with a ~ suffix.
require 'spree/file_utilz'
if ARGV.any? { |arg| %w(--update -u).any? { |flag| arg == flag } }
  puts "Updating to Spree #{Spree::Version} ..."
  APP_ROOT = Dir.pwd

  # remove defunct file
  sl = "#{APP_ROOT}/config/initializers/searchlogic.rb"; File.rename(sl, sl + '~') if File.exist?(sl)

  # move session_store to new place in site initializer
  site_extension_dir = "#{APP_ROOT}/vendor/extensions/site/"
  session_store_file = "config/initializers/session_store.rb"
  if File.exist?(site_extension_dir) && File.exist?("#{APP_ROOT}/#{session_store_file}")
    FileUtils.mkdir(site_extension_dir + "/config") rescue ''
    FileUtils.mkdir(site_extension_dir + "/config/initializers") rescue ''
    File.rename("#{APP_ROOT}/#{session_store_file}", "#{site_extension_dir}/#{session_store_file}")
  end

  # copy the "infrastructure" files 
  items = [ "/config/initializers", 
            "/config/environments", 
            "/config/environment.rb", 
            "/config/spree_permissions.yml", 
            "/config/boot.rb",
            "/db/seeds.rb" ]
  items.each do |item|
    Spree::FileUtilz.mirror_with_backup(SPREE_ROOT + item, APP_ROOT + item)
  end

  # discard copied session_store
  if File.exist?(site_extension_dir)
    FileUtils.rm("#{APP_ROOT}/#{session_store_file}")
  end

  puts "Finished."
  exit 0
end

app_path = ARGV.first

require 'rails_generator'
require 'rails_generator/scripts/generate'

class Rails::Generator::Base

  def self.use_application_sources!
    reset_sources
    sources << Rails::Generator::PathSource.new(:builtin, "#{File.dirname(__FILE__)}/../lib/generators")
  end

  def add_general_options!(opt)
    opt.separator ''
    opt.separator 'Spree Info:'
    opt.on('-v', '--version', 'Show the Spree version number and quit.')
    opt.on('-h', '--help', 'Show this help message and quit.') { |v| options[:help] = v }
    opt.on('-u', '--update', 'Update an existing Spree project to the newest gem version.')    

    opt.separator ''
    opt.separator 'General Options:'

    opt.on('-p', '--pretend', 'Run but do not make any changes.') { |v| options[:pretend] = v }
    opt.on('-f', '--force', 'Overwrite files that already exist.') { options[:collision] = :force }
    opt.on('-s', '--skip', 'Skip files that already exist.') { options[:collision] = :skip }
    opt.on('-q', '--quiet', 'Suppress normal output.') { |v| options[:quiet] = v }
    opt.on('-t', '--backtrace', 'Debugging: show backtrace on errors.') { |v| options[:backtrace] = v }
    opt.on('-m', '--demo', 'Creates special mongrel configuration needed for demo server (unlikely you will need this).') { |v| options[:demo] = v }
  end

end

Rails::Generator::Base.use_application_sources!
Rails::Generator::Scripts::Generate.new.run(ARGV, :generator => 'instance')
