#compdef cdcd

typeset -A opt_args

_cdcd_tracks ()
{
    print ${${${(f)"$(cdcd info)"}[3]}/Total tracks: #(#b)([0-9]##)*/$match[1]}
}

_cdcd_track_list ()
{
    print ${1..$(_cdcd_tracks)}
}

_cdcd_track_list_verbose ()
{
    print ${${(M)${(f)"$(cdcd tracks)"}:#(#s) #[0-9]##:*}/(#s) #(#b)([0-9]##):[ >]#? #[^ ]# #(*) ##/$match[1]:${(qqq)match[2]}}
}

_cdcd_commands ()
{
    _arguments \
	':cdcd command:((
	play\:"play a track"
	stop\:"stop plating"
	open\:"eject the CD-ROM tray"
	eject\:"eject the CD-ROM tray"
	close\:"close the CD-ROM tray"
	pause\:"pause playing"
	resume\:"resume playing"
	ff\:"fast forward"
	rew\:"rewind"
	next\:"advance one track"
	prev\:"return to previous track"
	getvol\:"get current volume settings"
	setvol\:"set volume settings"
	status\:"get numerical data regarding the CD status"
	info\:"short information about the CD"
	tracks\:"list all tracks on the CD"
	rndplay\:"play a random track"
	list\:"list all CDs in a CD-ROM changer"
	slot\:"changes the current CD in the CD-ROM changer"
	edit\:"edit information about the disc"
	ext\:"Extended information about the disc"
	refresh\:"refresh the information about the CD from a CDDB server"
	device\:"change the CD-ROM device cdcd will use"
	verbose\:"toggle verbosity"
	sites\:"edit the server list"
	access\:"configure cddb access method"
	help\:"display a help message"
	))'
}

if (( CURRENT == 2 )); then
    _cdcd_commands
else
    shift words
    (( --CURRENT ))
    case "$words[1]" in
	# sub-commands with no args
	stop|open|eject|close|pause|resume|next|prev|getvol)
	    ;;
	status|info|tracks|rndplay|list|slot|refresh)
	    ;;
	# sub-commands with args that cannot be completed
	ff|rew|setvol)
	    ;;
	# sub-commands that do not work as expected
	access|edit|sites)
	    ;;
	# completeable sub-commands
	verbose)
	    _arguments \
		':verbose subcommand:((
		on\:"turn verbosity on"
		off\:"turn verbosity off"))'
	    ;;
	ext)
	    _arguments \
		":ext subcommand:((
		disc\:\"extra information about the disc\"
		$(_cdcd_track_list)))"
	    ;;
	device)
	    compadd "$expl[@]" /dev/cd* /dev/cd*/*
	    ;;
	play)
	    if (( CURRENT == 2 )); then
		_arguments ":play subcommand:((
		$(_cdcd_track_list_verbose)))"
	    else
		shift words
		(( --CURRENT ))
		_arguments ":play subcommand2:((
		$(_cdcd_track_list_verbose)))"
	    fi
	    ;;
	help)
	    _cdcd_commands;;
    esac
fi
