require 'rake'
require 'jsonapi-resources'

namespace :jsonapi do
  namespace :resources do
    desc 'Checks application for orphaned overrides'
    task :check_upgrade => :environment do
      Rails.application.eager_load!

      resource_klasses = ObjectSpace.each_object(Class).select { |klass| klass < JSONAPI::Resource}

      puts "Checking #{resource_klasses.count} resources"

      issues_found = 0

      klasses_with_deprecated = resource_klasses.select { |klass| klass.methods.include?(:find_records) }
      unless klasses_with_deprecated.empty?
        puts "  Found the following resources the still implement `find_records`:"
        klasses_with_deprecated.each { |klass| puts "    #{klass}"}
        puts "  The `find_records` method is no longer called by JR. Please review and ensure your functionality is ported over."

        issues_found = issues_found + klasses_with_deprecated.length
      end

      klasses_with_deprecated = resource_klasses.select { |klass| klass.methods.include?(:records_for) }
      unless klasses_with_deprecated.empty?
        puts "  Found the following resources the still implement `records_for`:"
        klasses_with_deprecated.each { |klass| puts "    #{klass}"}
        puts "  The `records_for` method is no longer called by JR. Please review and ensure your functionality is ported over."

        issues_found = issues_found + klasses_with_deprecated.length
      end

      klasses_with_deprecated = resource_klasses.select { |klass| klass.methods.include?(:apply_includes) }
      unless klasses_with_deprecated.empty?
        puts "  Found the following resources the still implement `apply_includes`:"
        klasses_with_deprecated.each { |klass| puts "    #{klass}"}
        puts "  The `apply_includes` method is no longer called by JR. Please review and ensure your functionality is ported over."

        issues_found = issues_found + klasses_with_deprecated.length
      end

      if issues_found > 0
        puts "Finished inspection. #{issues_found} issues found that may impact upgrading. Please address these issues. "
      else
        puts "Finished inspection with no issues found. Note this is only a cursory check for method overrides that will no \n" \
             "longer be called by JSONAPI::Resources. This check in no way assures your code will continue to function as \n" \
             "it did before the upgrade. Please do adequate testing before using in production."
      end
    end
  end
end
