require 'bundler/setup'
require 'bundler/gem_tasks'
require 'rspec/core/rake_task'
require 'rubocop/rake_task'
require 'yard'

# rubocop:disable LineLength

def run_acceptance_tests(provider = 'virtualbox')
  puts '=================================================================='
  puts "Running acceptance tests against '#{provider}' provider..."
  puts '=================================================================='

  Dir.chdir("test/acceptance/#{provider}") do
    system('vagrant destroy -f')
    system("vagrant up --provider=#{provider}")
    system('vagrant destroy -f')
  end
end

YARD::Rake::YardocTask.new

namespace :style do
  require 'rubocop/rake_task'
  desc 'Run Ruby style checks'
  Rubocop::RakeTask.new(:ruby) do |task|
    task.patterns = [
      '**/*.rb',
      '**/Vagrantfile',
      '*.gemspec',
      'Gemfile',
      'Rakefile'
    ]
  end
end

namespace :test do

  RSpec::Core::RakeTask.new(:unit) do |t|
    t.pattern = 'test/unit/**/*_spec.rb'
  end

  namespace :acceptance do
    desc 'Run acceptance tests with AWS provider'
    task :aws do
      unless system("vagrant box list | grep 'dummy\s*(aws)' &>/dev/null")
        system('vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box')
      end
      run_acceptance_tests('aws')
    end

    desc 'Run acceptance tests with Digital Ocean provider'
    task 'digital_ocean' do
      unless system("vagrant box list | grep 'digital_ocean' &>/dev/null")
        system('vagrant box add digital_ocean https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box')
      end
    end

    desc 'Run acceptance tests with Rackspace provider'
    task :rackspace do
      unless system("vagrant box list | grep 'dummy\s*(rackspace)' &>/dev/null")
        system('vagrant box add dummy https://github.com/mitchellh/vagrant-rackspace/raw/master/dummy.box')
      end
      run_acceptance_tests('aws')
    end

    desc 'Run acceptance tests with VirtualBox provider'
    task :virtualbox do
      run_acceptance_tests('virtualbox')
    end
  end
end

# We cannot run Test Kitchen on Travis CI yet...
namespace :travis do
  desc 'Run tests on Travis'
  task ci: ['style:ruby', 'test:unit']
end

# The default rake task should just run it all
task default: ['style:ruby', 'test:unit', 'test:acceptance:virtualbox']