#! /usr/bin/env tclsh

lappend auto_path [file join [file dirname [info script]] lib]
lappend auto_path [file join [file dirname [info script]] test-lib]
lappend auto_path [file join [file dirname [info script]] ..]
package require tsmf

proc maxlen {list} {
	set maxlen 0
	foreach item $list {
		set len [string length $item]
		if {$len > $maxlen} {
			set maxlen $len
		}
	}
	return $maxlen
}

proc relTime {time} {
	set now [clock seconds]
	set delta [expr {$now - $time}]

	set future " "
	if {$delta < 0} {
		set future "+"
		set delta [expr {abs($delta)}]
	}

	set fmt1 "%b_%d"
	set fmt2 "%H:%M:%S"
	set now_fmt1 [clock format $now -format $fmt1]
	set time_fmt [clock format $time -format $fmt1]

	if {$now_fmt1 eq $time_fmt} {
		set time_fmt [clock format $time -format $fmt2]
	}

	return ${future}$time_fmt
}

namespace eval ::cmd {}
proc ::cmd::list {args} {
	set info [::tsmf::client::list_svcs]

	set statelen [expr {[maxlen {starting started stopping stopped}] + 1}]

	set fmt "%-${statelen}s  %10s  %s"

	puts [format $fmt "STATE" "STIME" "SVC"]
	foreach {name svcInfo} $info {
		set state [dict get $svcInfo state]
		set desired_state [dict get $svcInfo desired_state]
		set changed_time [dict get $svcInfo changed_time]
		if {$state ne $desired_state} {
			set state "${state}*"
		}

		puts [format $fmt $state [relTime $changed_time] $name]
	}
}

proc ::cmd::start name {
	::tsmf::client::start $name
}

proc ::cmd::stop name {
	::tsmf::client::stop $name
}

proc ::cmd::info name {
	set info [::tsmf::client::status $name]
	puts $info
}


set mode "list"

if {[llength $argv] > 0} {
	set mode [lindex $argv 0]
	set argv [lrange $argv 1 end]
}

::cmd::$mode $argv
