module Inch
  module CLI
    module Command
      module Options
        class Suggest < BaseList
          include API::Options::Suggest::DefaultAttributeValues

          attribute :object_count, DEFAULT_OBJECT_COUNT
          attribute :file_count, DEFAULT_FILE_COUNT
          attribute :proper_grades, DEFAULT_PROPER_GRADES
          attribute :grades_to_display, DEFAULT_GRADES_TO_DISPLAY
          attribute :grade_weights, DEFAULT_GRADE_WEIGHTS
          attribute :object_min_priority, DEFAULT_OBJECT_MIN_PRIORITY
          attribute :object_max_score, DEFAULT_OBJECT_MAX_SCORE

          attribute :pedantic, false

          def set_options(opts)
            list_options(opts)
            suggest_options(opts)
            common_options(opts)

            yardopts_options(opts)
          end

          def descriptions
            [
              '',
              'Suggests objects and files that can be improved regarding ' \
                'their documentation.',
              '',
              'Example: ' +
                '$ inch suggest lib/**/*.rb --pedantic'.color(:cyan),
              '',
              description_hint_grades,
              description_hint_arrows
            ]
          end

          protected

          def suggest_options(opts)
            opts.separator ''
            opts.separator 'Suggest options:'

            opts.on('-n', '--objects [COUNT]', 'Show COUNT objects') do |count|
              @object_count = count.to_i
            end
            opts.on('--pedantic',
                    'Be excessively concerned with minor details and rules') do
              # all objects are considered a priority
              @object_min_priority = -99
              # only objects with the highest score are omitted from the list
              @object_max_score = object_max_score - 1
              # only A-listers are regarded as 'proper'
              @proper_grades = [:A]
              @grades_to_display = [:A, :B, :C, :U]
              @grade_weights = [0.3, 0.3, 0.2, 0.2]
              @object_count = 30
              @pedantic = true
            end
          end
        end
      end
    end
  end
end