#compdef fmadm

_fm_modules() {
  compadd "$@" - ${${(f)"$(_call_program modules fmadm config)"}[2,-1]// */}
}

_fm_faulted_fmris() {
	compadd "$@" - $(fmadm faulty -r 2> /dev/null | awk '{print $1}')
}

_fm_faulted_uuids() {
	compadd "$@" - $(fmadm faulty -s 2> /dev/null | tail +4 | awk '{print $4}')
}

_fm_faulted_labels() {
	local line q='"'
	compadd "$@" - $(fmadm faulty -f 2> /dev/null | while read line; do
		if [[ $line == "----"* ]]; then
			read line
			if [[ $line == '"'* ]]; then
				print ${${line[(r)$q,(rn:2:)$q]}[2,-2]}
			fi
		fi
	done)
}

local curcontext="$curcontext" state line expl ret=1
local -A opt_args
local -a subcmds args

# TODO: lookup-alias and remove-alias need completion based on the
# output of list-alias, but I have no examples of that output.

subcmds=(
  faulty list acquit replaced repaired list-alert clear
  list-defect list-fault
  add-alias remove-alias lookup-alias list-alias sync-alias
  config load unload reset rotate flush
)

_arguments -C -A "-*" \
  '-q[quiet mode]' \
  '1:fmadm subcommand:compadd -M "r:|-=* r:|=*" -a subcmds' \
  '*::command:->subcmd' && ret=0

[[ -z $state ]] && return ret
service="$words[1]"
curcontext="${curcontext%:*}-$service:"

case $service in
  (faulty|list|list-alert|list-defect|list-fault)
    args+=(
      '-f[display faulty FRUs]'
      '-i[display persistent cache IDs]'
      '-p[page output]'
      '-r[display resources]'
      '-s[display one-line summaries]'
      '-u[only display fault with given uuid]:uuid:_fm_faulted_uuids'
      '-v[display full output]'
    )
  ;|

  (list|faulty)
    _arguments -A "-*" $args \
      '-a[display all faults]' \
      '-g[group faults]' \
      '-n[limit output to specified number of entries]:number'
  ;;

  (list-alert|list-defect|list-fault)
    _arguments -A "-*" $args \
      '-a[display all resources]'
  ;;

  (acquit)
    _alternative \
      'fmadm-acquit-label:label:_fm_faulted_labels' \
      'fmadm-acquit-uuid:uuid:_fm_faulted_uuids' \
      'fmadm-acquit-fmri:fmri:_fm_faulted_fmris' && ret=0
  ;;

  (repaired|replaced)
    _alternative \
      'fmadm-acquit-label:label:_fm_faulted_labels' \
      'fmadm-acquit-fmri:fmri:_fm_faulted_fmris' && ret=0
  ;;

  (add-alias)
    _arguments :chassis :alias-id :comment && ret=0
  ;;

  (remove-alias|lookup-alias)
    _message -e aliases 'chassis or alias-id'
  ;;

  (load)
    _directories && ret=0
  ;;

  (unload)
    _fm_modules && ret=0
  ;;

  (reset)
    _arguments -A "-*" \
      '-s[reset named SERD]:serd' \
      ':module:_fm_modules' && ret=0
  ;;

  (rotate)
    _values 'logfile' errlog fltlog infolog infolog_hival && ret=0
  ;;

  (flush)
    _fm_faulted_fmris && ret=0
  ;;

  (list-alias|config|sync-aliases) _message 'no more arguments' ;;

  (*) # fallback to defaults for any new or unhandled subcommand
    _default && ret=0
  ;;
esac

return ret
