#! /usr/bin/env ruby

require 'orocos'
require 'pp'
require 'utilrb/pkgconfig'
require 'optparse'

do_cleanup = false
parser = OptionParser.new do |opt|
    opt.on('--host=HOST', String, 'the CORBA name server') do |hostname|
        Orocos::CORBA.name_service.ip = hostname
    end
    opt.on('--cleanup', 'try to remove unreachable tasks from the name server') do
        do_cleanup = true
    end
end
remaining = parser.parse(ARGV)

if !remaining.empty? && (name_server = remaining.shift)
    Orocos::CORBA.name_service.ip = name_server
end

Orocos.initialize

all_tasks = []
sizes = [0, 0]
Orocos.name_service.names.each do |name|
    result = [name]
    begin
        task = Orocos.name_service.get(name)
        current_state = nil
        10.times do
            if current_state = task.state
                break
            end
            sleep 0.01
        end
        result << (current_state || '[unknown]').to_s
    rescue Orocos::NoModel => e
        result << "[cannot find model definition]"
    rescue Orocos::NotFound
        if do_cleanup
            Orocos.warn "#{name} is unreachable, deregistering it out of the name server"
            Orocos::CORBA.unregister(name)
            result << "[deregistered]"
        else
            result << "[defunct]"
        end

    end
    result.map(&:size).each_with_index do |size, i|
        sizes[i] = size if sizes[i] < size
    end
    all_tasks << result
end

state_ordering = {
    :RUNNING => 0,
    :PRE_OPERATIONAL => 1,
    :default => 2,
    :STOPPED => 3
}


all_tasks = all_tasks.sort_by do |name, state|
    order = state_ordering[state] || state_ordering[:default]
    [order, name]
end

format = sizes.map { |s| "% #{s}s" }.join(" ")
all_tasks.each do |content|
    puts format % content
end

