class RubyCritic::Cli::Options::Argv

rubocop:disable Metrics/ClassLength

def initialize(argv)

def initialize(argv)
  @argv = argv
  self.parser = OptionParser.new
end

def parse

rubocop:disable Metrics/MethodLength,Metrics/AbcSize
def parse
  parser.new do |opts|
    opts.banner = 'Usage: rubycritic [options] [paths]'
    opts.on('-p', '--path [PATH]', 'Set path where report will be saved (tmp/rubycritic by default)') do |path|
      @root = path
    end
    opts.on('-b', '--branch BRANCH', 'Set branch to compare') do |branch|
      self.base_branch = String(branch)
      set_current_branch
      self.mode = :compare_branches
    end
    opts.on(
      '-t',
      '--maximum-decrease [MAX_DECREASE]',
      'Set a threshold for score difference between two branches (works only with -b)'
    ) do |threshold_score|
      self.threshold_score = Integer(threshold_score)
    end
    formats = []
    self.formats = formats
    opts.on(
      '-f', '--format [FORMAT]',
      %i[html json console lint],
      'Report smells in the given format:',
      '  html (default; will open in a browser)',
      '  json',
      '  console',
      '  lint',
      'Multiple formats are supported.'
    ) do |format|
      formats << format
    end
    formatters = []
    self.formatters = formatters
    opts.on(
      '--custom-format [REQUIREPATH]:[CLASSNAME]|[CLASSNAME]',
      'Instantiate a given class as formatter and call report for reporting.',
      'Two ways are possible to load the formatter.',
      'If the class is not autorequired the REQUIREPATH can be given together',
      'with the CLASSNAME to be loaded separated by a :.',
      'Example: rubycritic/markdown/reporter.rb:RubyCritic::MarkDown::Reporter',
      'or if the file is already required the CLASSNAME is enough',
      'Example: RubyCritic::MarkDown::Reporter',
      'Multiple formatters are supported.'
    ) do |formatter|
      formatters << formatter
    end
    opts.on('-s', '--minimum-score [MIN_SCORE]', 'Set a minimum score') do |min_score|
      self.minimum_score = Float(min_score)
    end
    opts.on('--churn-after [DATE]', 'Only count churn from a certain date.',
            'The date is passed through to version control (currently git only).',
            'Example: 2017-01-01') do |churn_after|
      self.churn_after = churn_after
    end
    opts.on('-m', '--mode-ci [BASE_BRANCH]',
            'Use CI mode (faster, analyses diffs w.r.t base_branch (default: main))') do |branch|
      self.base_branch = branch || 'main'
      set_current_branch
      self.mode = :ci
    end
    opts.on('--deduplicate-symlinks', 'De-duplicate symlinks based on their final target') do
      self.deduplicate_symlinks = true
    end
    opts.on('--suppress-ratings', 'Suppress letter ratings') do
      self.suppress_ratings = true
    end
    opts.on('--no-browser', 'Do not open html report with browser') do
      self.no_browser = true
    end
    opts.on('--coverage-path [PATH]', 'SimpleCov coverage will be saved (./coverage by default)') do |path|
      @coverage_path = path
    end
    opts.on_tail('-v', '--version', "Show gem's version") do
      self.mode = :version
    end
    opts.on_tail('-h', '--help', 'Show this message') do
      self.mode = :help
    end
  end.parse!(@argv)
end

def paths

def paths
  @argv unless @argv.empty?
end

def set_current_branch

def set_current_branch
  self.feature_branch = SourceControlSystem::Git.current_branch
end

def to_h

def to_h
  {
    mode: mode,
    root: root,
    formats: formats,
    formatters: formatters,
    deduplicate_symlinks: deduplicate_symlinks,
    paths: paths,
    suppress_ratings: suppress_ratings,
    help_text: parser.help,
    minimum_score: minimum_score,
    churn_after: churn_after,
    no_browser: no_browser,
    base_branch: base_branch,
    feature_branch: feature_branch,
    threshold_score: threshold_score
  }
end