#!/usr/bin/env ruby

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

require 'rubygems'
require 'rake'
require 'getoptlong'
require 'serverspec-runner/version'

raketask =  'spec'
showtasks = false

opts = GetoptLong.new(
  ["--scenario",          "-s", GetoptLong::REQUIRED_ARGUMENT],
  ["--inventory",         "-i", 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],
  ["--pattern",           "-P", GetoptLong::REQUIRED_ARGUMENT],
  ["--exclude-pattern",   "-E", GetoptLong::REQUIRED_ARGUMENT],
  ["--ignore-error-exit", "-I", GetoptLong::NO_ARGUMENT],
  ["--activate-specroot", "-a", GetoptLong::NO_ARGUMENT],
  ["--version",           "-v", GetoptLong::NO_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 '--inventory'
    ENV['inventory'] = 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 '--pattern'
    ENV['pattern'] = arg
  when '--exclude-pattern'
    ENV['exclude_pattern'] = arg
  when '--ignore-error-exit'
    ENV['ignore_error_exit'] = 'true'
  when '--activate-specroot'
    ENV['activate_specroot'] = 'true'
  when '--tmpdir'
    ENV['tmpdir'] = arg
  when '--raketask'
    raketask = arg
  when '--tasks'
    showtasks = true
  when '--version'
    puts ServerspecRunner::VERSION
    exit 0
  else
    puts "Usage: serverspec-runner (options)"
    puts "-s, --scenario          SCENARIO_FILE          path to scenario yml file"
    puts "-i, --inventory         INVENTORY_FILE         path to ansible inventory 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|none) 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 "-P, --pattern                                  execute pattern in spec directory"
    puts "-I, --ignore-error-exit                        exit with 0 even on error"
    puts "-a, --activate-specroot                        activate existed spec root only(--specroot is required)"
    puts "-1, --raketask          RAKE_TASK_NAME         execute specified rake task only(ex: spec:test::anyhost-01)"
    puts "-v, --version                                  show version"
    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
