require "rake"
require "rspec/core/rake_task"
require "cucumber"
require "cucumber/rake/task"

begin
  require "rubocop/rake_task"
  RuboCop::RakeTask.new(:rubocop) do |t|
    t.fail_on_error = true
  end
  task pre: "rubocop:auto_correct"
rescue LoadError # rubocop:disable Lint/HandleExceptions
  # RuboCop is not a runtime dependency!
end

namespace :server do
  namespace :spec do
    targets = []
    Dir.glob("./spec/server/*").each do |dir|
      next unless File.directory?(dir)
      target = File.basename(dir)
      target = "_#{target}" if target == "default"
      targets << target
    end

    task all: targets

    targets.each do |target|
      original_target = target == "_default" ? target[1..-1] : target
      desc "Run serverspec tests to #{original_target}"
      RSpec::Core::RakeTask.new(target.to_sym) do |t|
        ENV["TARGET_HOST"] = original_target
        t.pattern = "spec/server/#{original_target}/*_spec.rb"
        t.rspec_opts = "--format documentation"
      end
    end
  end
end

RSpec::Core::RakeTask.new(:test_helper_code) do |t|
  t.pattern = "spec/features_support/**/*_spec.rb"
  t.rspec_opts = "--format progress"
end

desc "Clean temp files from the last build"
task :clean do
  rm_rf "build"
  mkdir_p "build"
end

file "Envfile" => "Envfile.example" do |task|
  cp task.prerequisites.first, task.name
end

Cucumber::Rake::Task.new(:features) do |t|
  t.cucumber_opts = "features --format pretty --no-source --color --format json --out build/cucumber.json"
end

task features: [:clean, "Envfile", :test_helper_code]

task test: ["server:spec:all", "features"]
task default: :test
