#autoload

local -a config_hosts
local config
integer ind

# If users-hosts matches, we shouldn't complete anything else.
if [[ "$IPREFIX" == *@ ]]; then
  _combination -s '[:@]' my-accounts users-hosts "users=${IPREFIX/@}" hosts "$@" && return
else
  _combination -s '[:@]' my-accounts users-hosts \
    ${opt_args[-l]:+"users=${opt_args[-l]:q}"} hosts "$@" && return
fi
if (( ind = ${words[(I)-F]} )); then
  config=${~words[ind+1]} 2>/dev/null
else
  config="$HOME/.ssh/config"
fi
if [[ -r $config ]]; then
  local key line host
  local -a lines=("${(@f)$(<"$config")}") 2>/dev/null
  local -a match_args
  while (($#lines)); do
    IFS=$'=\t ' read -r key line <<<"${lines[1]}"
    if [[ "$key" == ((#i)match) ]]; then
      match_args=(${(z)line})
      while [[ $#match_args -ge 2 ]]; do
	if [[ "${match_args[1]}" == (#i)(canonical|final|(|original)host) ]]; then
	  key="Host"
	  line="${match_args[2]//,/ }"
	  break
	fi
	shift 2 match_args
      done
    fi
    case "$key" in
    ((#i)include)
      lines[1]=("${(@f)$(cd $HOME/.ssh; cat ${(z)~line})}") 2>/dev/null;;
    ((#i)host(|name))
      for host in ${(z)line}; do
	case $host in
	(*[*?]*) ;;
	(*) config_hosts+=("$host") ;;
	esac
      done ;&
    (*) shift lines;;
    esac
  done
  if (( ${#config_hosts} )); then
    _wanted hosts expl 'remote host name' \
      compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts
  fi
fi
