# -*- encoding : utf-8 -*-
require 'rails/generators'

class Rails::Generators::NamedBase
  private

    def destroy(what, *args)
      log :destroy, what
      argument = args.map(&:to_s).flatten.join(' ')

      in_root do
        run_ruby_script("bin/rails destroy #{what} #{argument}", verbose: true)
      end
    end
end

class CurationConcerns::WorkGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('../templates', __FILE__)

  argument :attributes, type: :array, default: [], banner: 'field:type field:type'

  # Why all of these antics with defining individual methods?
  # Because I want the output of CurationConcerns::WorkGenerator to include all the processed files.
  def create_model_spec
    return unless rspec_installed?
    template 'model_spec.rb.erb', "spec/models/#{file_name}_spec.rb"
  end

  def create_model
    template('model.rb.erb', "app/models/#{file_name}.rb")
  end

  def create_controller_spec
    return unless rspec_installed?
    template('controller_spec.rb.erb', "spec/controllers/curation_concerns/#{plural_file_name}_controller_spec.rb")
  end

  def create_actor_spec
    return unless rspec_installed?
    template('actor_spec.rb.erb', "spec/actors/curation_concerns/actors/#{file_name}_actor_spec.rb")
  end

  def create_form_spec
    return unless rspec_installed?
    template('form_spec.rb.erb', "spec/forms/curation_concerns/#{file_name}_form_spec.rb")
  end

  def create_feature_spec
    return unless rspec_installed?
    template('feature_spec.rb.erb', "spec/features/create_#{file_name}_spec.rb")
  end

  def create_controller
    template('controller.rb.erb', "app/controllers/curation_concerns/#{plural_file_name}_controller.rb")
  end

  def create_actor
    template('actor.rb.erb', "app/actors/curation_concerns/actors/#{file_name}_actor.rb")
  end

  def create_form
    template('form.rb.erb', "app/forms/curation_concerns/#{file_name}_form.rb")
  end

  def register_work
    inject_into_file 'config/initializers/curation_concerns.rb', after: "CurationConcerns.configure do |config|\n" do
      "  # Injected via `rails g curation_concerns:work #{class_name}`\n" \
      "  config.register_curation_concern :#{file_name}\n"
    end
  end

  def create_views
    create_file "app/views/curation_concerns/#{plural_file_name}/_#{file_name}.html.erb" do
      "<%# This is a search result view %>\n" \
      "<%= render 'catalog/document', document: #{file_name}, document_counter: #{file_name}_counter  %>\n"
    end
  end

  def create_readme
    readme 'README'
  end

  private

    def rspec_installed?
      defined?(RSpec) && defined?(RSpec::Rails)
    end
end
