#!/usr/bin/env ruby

$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])

require 'rubygems'
require 'rake'
require 'getoptlong'

raketask =  'spec'
showtasks = false

opts = GetoptLong.new(
  ["--scenario",     "-s", GetoptLong::REQUIRED_ARGUMENT],
  ["--specroot",     "-r", GetoptLong::REQUIRED_ARGUMENT],
  ["--ssh_options",  "-o", GetoptLong::REQUIRED_ARGUMENT],
  ["--explain",      "-e", GetoptLong::REQUIRED_ARGUMENT],
  ["--tableformat",  "-t", GetoptLong::REQUIRED_ARGUMENT],
  ["--parallel",     "-p", GetoptLong::REQUIRED_ARGUMENT],
  ["--help",         "-h", GetoptLong::NO_ARGUMENT],
  ["--raketask",     "-1", GetoptLong::REQUIRED_ARGUMENT],
  ["--tmpdir",       "-2", GetoptLong::REQUIRED_ARGUMENT],
  ["--tasks",        "-T", GetoptLong::NO_ARGUMENT]
)

opts.each do |opt, arg|
  case opt
  when '--scenario'
    ENV['scenario'] = arg
  when '--specroot'
    ENV['specroot'] = arg
  when '--ssh_options'
    ENV['ssh_options'] = arg
  when '--explain'
    ENV['explain'] = arg
  when '--tableformat'
    ENV['tableformat'] = arg
  when '--parallel'
    ENV['parallels'] = arg
  when '--tmpdir'
    ENV['tmpdir'] = arg
  when '--raketask'
    raketask = arg
  when '--tasks'
    showtasks = true
  else
    puts "Usage: serverspec-runner (options)"
    puts "-s, --scenario     SCENARIO_FILE        path to scenario yml file"
    puts "-r, --specroot     SPEC_ROOT            path to spec tests root dir"
    puts "-o, --ssh_options  SSH_OPTIONS_FILE     path to ssh options yml file"
    puts "-e, --explain      (short|long)         specify result explain length(default: short)"
    puts "-t, --tableformat  (aa|mkd|csv|bool)    specify result table type(default: aa)"
    puts "-T, --tasks                             display the tasks with descriptions(exec rake -T)"
    puts "-p, --parallel                          execute tasks in parallel"
    puts "-1, --raketask     RAKE_TASK_NAME       execute specified rake task only(ex: spec:test::anyhost-01)"
    puts "-h, --help                              show help"
    exit 0
  end
end

Rake::TaskManager.record_task_metadata = showtasks
load "#{File.dirname(__FILE__)}/../Rakefile"

if showtasks
  mLen = (Rake.application.tasks.max_by { |t| t.name_with_args.size }).name_with_args.size
  Rake.application.tasks.reject{|t| ['spec:all', 'spec:stdout'].include?(t.name_with_args)}.each do |t|
    printf("%-#{mLen + 2}s  # %s\n",
      t.name_with_args,
      t.comment)
  end
  exit(0)
end

Rake::Task[raketask.to_sym].invoke
