#compdef sv

_sv_commands() {
  local -a sv_ary
  sv_ary=(
    'status':'get status of service (and log service if available)'
    'up':'start if service is running. If service stops, restart'
    'down':'send SIGTERM and SIGCONT if service is running. After it stops, do not restart'
    'once':'start if service is not running. Do not restart if it stops'
    'pause':'send SIGSTOP if service is running'
    'cont':'send SIGCONT if service is running'
    'hup':'send SIGHUP if service is running'
    'alarm':'send SIGALRM if service is running'
    'interrupt':'send SIGINT if service is running'
    'quit':'send SIGQUIT if service is running'
    '1':'send SIGUSR1 if service is running'
    '2':'send SIGUSR2 if service is running'
    'term':'send SIGTERM if service is running'
    'kill':'send SIGKILL if service is running'
    'exit':'send SIGTERM and SIGCONT if service is running. Do not restart service.'
  )
  _describe -t commands "sv commands" sv_ary -V sv_commands
}

_sv_lsb() {
  local -a sv_lsb_ary
  sv_lsb_ary=(
    'start':'up with check/timeout'
    'stop':'down with check/timeout'
    'reload':'hup with check'
    'restart':'down and up with check'
    'shutdown':'exit with check/timeout'
    'force-stop':'stop with kill on timeout'
    'force-reload':'reload with kill on timeout'
    'force-restart':'restart with kill on timeout'
    'force-shutdown':'shutdown with kill on timeout'
    'try-restart':'restart if service is already running'
  )

  _describe -t lsb-commands "sv LSM init compat" sv_lsb_ary -V sv_init_compat
}

_sv_additional() {
  _describe -t additional-commands "sv additional commands" '("check:check status of service")' -V sv_addl_comm
}

local curcontext="$curcontext" state line
_arguments -C \
  '-v[verbose]' \
  '-w[wait time]:time (seconds)' \
  '1: :->command' \
  '*:: :->options'

case $state in
  (command)
    _alternative \
      _sv_commands \
      _sv_lsb \
      _sv_additional
  ;;

  (options)
    local -a sv_services
    local svdir=${SVDIR:-/etc/service}
    sv_services=(
      $svdir/*(N)
      $svdir/*/log(N)
    )

    sv_services=( ${sv_services#$svdir/} )
    _describe -t services "sv services" sv_services
  ;;
esac
