require 'rails/generators/rails/app/app_generator'

module Gaku
  class DummyGenerator < Rails::Generators::Base
    desc 'Creates blank Rails application, installs Gaku and all sample data'

    class_option :lib_name, default: ''

    def self.source_paths
      paths = superclass.source_paths
      paths << File.expand_path('../templates', __FILE__)
      paths.flatten
    end

    def clean_up
      remove_directory_if_exists(dummy_path)
    end

    PASSTHROUGH_OPTIONS = [
      :skip_active_record, :skip_javascript, :javascript, :quiet, :pretend, :force, :skip
    ]

    def generate_test_dummy
      opts = (options || {}).slice(*PASSTHROUGH_OPTIONS)
      opts[:force] = true
      opts[:skip_bundle] = true
      opts[:old_style_hash] = true
      puts 'Generating dummy Rails application...'
      invoke Rails::Generators::AppGenerator, [File.expand_path(dummy_path, destination_root)], opts
    end

    def test_dummy_config
      @lib_name = options[:lib_name]

      template 'rails/database.yml', "#{dummy_path}/config/database.yml", force: true
      template 'rails/boot.rb', "#{dummy_path}/config/boot.rb", force: true
      template 'rails/application.rb', "#{dummy_path}/config/application.rb", force: true
      template 'rails/routes.rb', "#{dummy_path}/config/routes.rb", force: true
      template 'rails/script/rails', "#{dummy_path}/spec/dummy/script/rails", force: true
    end

    def test_dummy_clean
      inside dummy_path do
        remove_file '.gitignore'
        remove_file 'doc'
        remove_file 'Gemfile'
        remove_file 'lib/tasks'
        remove_file 'app/assets/images/rails.png'
        remove_file 'app/assets/javascripts/application.js'
        remove_file 'public/index.html'
        remove_file 'public/robots.txt'
        remove_file 'README'
        remove_file 'test'
        remove_file 'vendor'
        remove_file 'spec'
      end
    end

    attr_reader :lib_name

    protected

    def dummy_path
      ENV['DUMMY_PATH'] || 'spec/dummy'
    end

    def module_name
      'Dummy'
    end

    def application_definition
      @application_definition ||= begin

        dummy_application_path = File.expand_path("#{dummy_path}/config/application.rb", destination_root)
        unless options[:pretend] || !File.exist?(dummy_application_path)
          contents = File.read(dummy_application_path)
          contents[(contents.index("module #{module_name}"))..-1]
        end
      end
    end

    alias_method :store_application_definition!, :application_definition

    def camelized
      @camelized ||= name.gsub(/\W/, '_').squeeze('_').camelize
    end

    def remove_directory_if_exists(path)
      remove_dir(path) if File.directory?(path)
    end

    def gemfile_path
      version_file = File.expand_path('../../Versionfile', Dir.pwd)
      if File.exist?(version_file)
        '../../../../Gemfile'
      else
        '../../../../../Gemfile'
      end
    end

  end
end
