#compdef finger

local curcontext="$curcontext" state line match
typeset -A opt_args

if (( ! $+_finger_args )); then
  local help="$(_call_program options finger -\? 2>&1)"
  local -A optionmap

## `finger -\?':

# SunOS 5.7:
# finger: illegal option -- ?
# Usage: finger [-bfhilmpqsw] [-t l|h|l,h] [name1 [name2 ...] ]

# SunOS 4.1.4:
# Usage: finger [-bfhilmpqsw] [login1 [login2 ...] ]

# IRIX 6.3:
# Usage: finger [-bfhilmpqsw] [login1 [login2 ...] ]

# NetBSD 1.4.1:
# finger: illegal option -- ?
# usage: finger [-lmpsho] [login ...]

# FreeBSD 2.2.8
# finger: illegal option -- ?
# usage: finger [-lmpshoT] [login ...]

# BSD/OS 3.0:
# finger: illegal option -- ?
# usage: finger [-lmps] [login ...]

# 4.4BSD Lite:
# usage: finger [-lmps] [login ...]

# Debian GNU/Linux (potato) (netstd 3.07-10):
# finger: invalid option -- ?
# usage: finger [-lmps] [login ...]

  if [[ "$help" = *\[-(#b)(lmps[a-zA-Z]#)* ]]; then
    # BSD style
    optionmap=(
      '*m*' '-m[match to login name]'
      '*l*' '(-s -o)-l[force long format]'
      '*s*' '(-l -p)-s[force short format]'
      '*p*' '(-s -o)-p[suppress .forward, .plan and .project]'
      '*o*' '(-l -p)-o[print office information]'
      '*T*' '-T[disable T/TCP]'
    )
    _finger_args=($optionmap[(K)$match[1]])
  elif [[ "$help" = *\[-(#b)(bfhilmpqsw[a-zA-Z]#)* ]]; then
    # System V style
    optionmap=(
      '*m*' '-m[match to login name]'
      '*l*' '(   -i -q -s -f       -w)-l[force long format]'
      '*i*' '(-l    -q -s -b -h -p -w)-i[force idle format]'
      '*q*' '(-l -i    -s -b -h -p -w)-q[force quick format]'
      '*s*' '(-l -i -q    -b -h -p)-s[force short format]'
      '*b*' '(-i -q -s)-b[suppress home and shell]'
      '*f*' '(-l)-f[suppress header]'
      '*h*' '(-i -q -s)-h[suppress .project]'
      '*p*' '(-i -q -s)-p[suppress .plan]'
      '*w*' '(-i -q -l)-w[suppress full name]'
    )
    _finger_args=($optionmap[(K)$match[1]])
  else
    _finger_args=()
  fi
fi

_arguments -C -s $_finger_args '*:finger targets:->finger-targets' && return 0

case "$state" in
finger-targets)
  _user_at_host -t other-accounts "$@"
  ;;
esac
