require 'rails/generators'

module Stitches
  class ApiGenerator < Rails::Generators::Base
    include Rails::Generators::Migration

    source_root(File.expand_path(File.join(File.dirname(__FILE__), "generator_files")))

    def self.next_migration_number(path)
      Time.now.utc.strftime("%Y%m%d%H%M%S")
    end

    desc "Bootstraps your API service with a basic ping controller and spec to ensure everything is setup properly"
    def bootstrap_api
      gem_group :development, :test do
        gem "rspec"
        gem "rspec-rails"
        gem "rspec_api_documentation"
      end

      Bundler.with_clean_env do
        run "bundle install"
      end
      generate "rspec:install"

      inject_into_file "config/routes.rb", before: /^end/ do<<-ROUTES
namespace :api do
  scope module: :v1, constraints: Stitches::ApiVersionConstraint.new(1) do
    resource 'ping', only: [ :create ]
    # Add your V1 resources here
  end
  scope module: :v2, constraints: Stitches::ApiVersionConstraint.new(2) do
    resource 'ping', only: [ :create ]
    # This is here simply to validate that versioning is working
    # as well as for your client to be able to validate this as well.
  end
end
      ROUTES
      end

      copy_file "app/controllers/api.rb"
      copy_file "app/controllers/api/api_controller.rb"
      copy_file "app/controllers/api/v1.rb"
      copy_file "app/controllers/api/v2.rb"
      copy_file "app/controllers/api/v1/pings_controller.rb"
      copy_file "app/controllers/api/v2/pings_controller.rb"
      copy_file "app/models/api_client.rb"
      copy_file "config/initializers/stitches.rb"
      copy_file "lib/tasks/generate_api_key.rake"
      template "spec/features/api_spec.rb.erb", "spec/features/api_spec.rb"
      copy_file "spec/acceptance/ping_v1_spec.rb", "spec/acceptance/ping_v1_spec.rb"

      migration_template "db/migrate/enable_uuid_ossp_extension.rb", "db/migrate/enable_uuid_ossp_extension.rb"
      sleep 1 # allow clock to tick so we get different numbers
      migration_template "db/migrate/create_api_clients.rb", "db/migrate/create_api_clients.rb"

      inject_into_file 'spec/rails_helper.rb', %q{
config.include RSpec::Rails::RequestExampleGroup, type: :feature
}, before: /^end/

      inject_into_file 'spec/rails_helper.rb', before: /^RSpec.configure/ do<<-REQUIRE
require 'stitches/spec'
      REQUIRE
      end

      append_to_file 'spec/rails_helper.rb' do<<-RSPEC_API
require 'rspec_api_documentation'

RspecApiDocumentation.configure do |config|
  config.format = [:json, :html]
  config.request_headers_to_include = %w(
    Accept
    Content-Type
    Authorization
    If-Modified-Since
  )
  config.response_headers_to_include = %w(
    Last-Modified
    ETag
  )
  config.api_name = "YOUR SERVICE NAME HERE"
end
RSPEC_API
      end
    end
  end
end