#!/usr/bin/env ruby

require 'optparse'
require 'dependency_checker'
require 'json'

options = {}
OptionParser.new { |opts|
  opts.on('-o module,version', '--override module,version', Array, 'Forge name of module and semantic version to override') do |override|
    options[:override] = override
  end

  opts.on('-c', '--current', 'Extract override version from metadata.json inside current working directory') do |current_override|
    options[:current_override] = current_override
  end

  opts.on('-v', '--[no-]verbose', 'Run verbosely') do |verbose|
    options[:verbose] = verbose
  end

  opts.on('-h', '--help', 'Display help') do
    puts opts
    exit
  end
}.parse!

# Determine which modules to pass on to runner
managed_modules = nil
unless ARGV.empty?
  # If length == 1, only pass first argument, else pass the array of metadata.json files
  managed_modules = ((ARGV.length == 1) ? ARGV[0] : ARGV)
end

# Raise error if both :override and :current_override are specified
if options[:override] && options[:current_override]
  raise OptionParser::InvalidOption, 'You can not select both override and current override options'
end

# If :current_override is specified, retrieve name and version of module in current working directory
if options[:current_override]
  metadata_json = JSON.parse(File.read('metadata.json'))
  module_name = metadata_json['name'].sub('-', '/')
  module_version = metadata_json['version']

  override_check = metadata_json.is_a?(Hash) && !metadata_json.empty?
  options[:override] = [module_name, module_version] if override_check
  raise OptionParser::InvalidOption, 'Unable to find local metadata.json in current working directory' unless override_check
end

# Default :verbose to false
options[:verbose] ||= false

DependencyChecker::Runner.run_with_args(managed_modules, options[:override], options[:verbose])
