# Bootstrap
#-----------------------------------------------------------------------------#

task :bootstrap do
  if system('which bundle')
    sh 'bundle install'
  else
    $stderr.puts "\033[0;31m" \
      "[!] Please install the bundler gem manually:\n" \
      '    $ [sudo] gem install bundler' \
      "\e[0m"
    exit 1
  end
end

begin

  require 'bundler/gem_tasks'

  task :default => 'spec'

  # Spec
  #-----------------------------------------------------------------------------#

  desc 'Runs all the specs'
  task :spec do
    start_time = Time.now
    sh "bundle exec bacon #{specs('**')}"
    duration = Time.now - start_time
    puts "Tests completed in #{duration}s"
    Rake::Task['rubocop'].invoke

    # This is not used in this library
    # Rake::Task['validate_json'].invoke
  end

  def specs(dir)
    FileList["spec/#{dir}/*_spec.rb"].shuffle.join(' ')
  end

  # Rubocop
  #-----------------------------------------------------------------------------#

  desc 'Checks code style'
  task :rubocop do
    require 'rubocop'
    cli = RuboCop::CLI.new
    result = cli.run(FileList['{spec,lib}/**/*.rb'])
    abort('RuboCop failed!') unless result == 0
  end

  # plugins.json
  #----------------------------------------------------------------------------#

  desc 'Validates plugins.json'
  task :validate_json do
    require 'json'
    require 'pathname'

    puts 'Validating plugins.json'

    json_file = Pathname(__FILE__).parent + 'plugins.json'
    json = json_file.read
    plugins = JSON.load(json)
    abort('Invalid JSON in plugins.json') unless plugins
    keys = %w(gem name author social_media_url url description)
    optional_keys = %w(social_media_url)
    errors = plugins['plugins'].reduce([]) do |errors, plugin|
      extra_keys = plugin.keys - keys
      unless extra_keys.empty?
        errors << "plugin `#{plugin['name']}` has extra keys #{extra_keys}"
      end
      (keys - optional_keys).each do |key|
        unless plugin[key]
          errors << "plugin `#{plugin['name']}` is missing key `#{key}`"
        end
      end
      errors
    end
    unless errors.empty?
      abort("Invalid plugins.json:\n\n#{errors.join("\n")}")
    end
  end

rescue LoadError
  $stderr.puts "\033[0;31m" \
    '[!] Some Rake tasks haven been disabled because the environment' \
    ' couldn’t be loaded. Be sure to run `rake bootstrap` first.' \
    "\e[0m"
end
