#!/usr/bin/env ruby

require 'rbbt-util'
require 'rbbt/util/simpleopt'

$0 = "rbbt #{$previous_commands*" "} #{ File.basename(__FILE__) }" if $previous_commands

options = SOPT.setup <<EOF

Run a workflow command

$ rbbt workflow cmd <workflow> <command> [<subcommands>] [<options>] [<arg> ...]

EOF
workflow = ARGV.shift

if workflow == '-h'
  if defined? rbbt_usage
    rbbt_usage 
  else
    puts SOPT.doc
  end
  exit 0
end

raise ParameterException, "No workflow specified" if workflow.nil?

require 'rbbt/workflow'

wf = Workflow.require_workflow workflow
dir = $command_dir = wf.libdir.share.rbbt_commands.find

def prev_dir(prev)
    rbbt_command_dir = $command_dir

    prev.each do |previous_command|
        rbbt_command_dir = rbbt_command_dir[previous_command]
    end

    rbbt_command_dir
end

def commands(prev)
    rbbt_command_dir = prev_dir(prev)

    command_file_dirs = rbbt_command_dir.find_all
    command_files = command_file_dirs.collect{|d| d.glob('*') }.flatten
    command_files.collect{|p| File.basename(p) }.uniq.reject{|p| p =~ /\.desc$/}.sort
end


prev = []

$previous_commands << 'cmd'
$previous_commands << workflow

begin
  while ARGV.any?
    command = ARGV.shift
    case
    when File.directory?(dir[command].find)
      prev << command
      $previous_commands << command
      dir = dir[command]
    when File.directory?(dir[command].find)
      prev << command
      dir = dir[command]
    when dir[command].exists?
      load dir[command].find
      exit 0
    else
      if command == 'bootstrap'
        Log.info "No bootstrap for #{ workflow }, running examples instead"
        puts `rbbt workflow example #{ workflow }`
        exit 0
      end

      puts "Error: Command not understood"
      puts
      break
    end
  end
end

puts SOPT.doc
puts
puts Log.color :magenta, "## COMMANDS"
puts
puts Log.color :magenta, "Command:"
puts 
puts " rbbt #{$previous_commands * " "} "
puts 
puts Log.color :magenta, "Subcommands:"
puts 

commands(prev).each do |command|
  directory = File.directory? dir[command].find
  if directory
    puts "  " << Log.color(:blue, command)
  else
    puts "  " << command
  end
end