#compdef copy_files

_copy_files() {
  local -a dirs
  local -a cp_hosts_default
  local -a used_hosts avail_hosts
  local _dotfiles="${DOTFILES:-$HOME/.dotfiles}"
  local i host_mode=0 host_arg_index=0

  cp_hosts_default=( $(_copy_files_ssh_hosts) )

  [[ -d "$_dotfiles" ]] || return 1
  dirs=(${(f)"$(print -rl -- $_dotfiles/*(/N:t))"})

  for (( i = 2; i < CURRENT; i++ )); do
    case "${words[i]}" in
      -h|--hosts)
        host_mode=1
        host_arg_index=$i
        ;;
      --)
        (( host_mode )) && host_mode=0
        ;;
    esac
  done

  if (( host_mode )); then
    used_hosts=()

    for (( i = host_arg_index + 1; i < CURRENT; i++ )); do
      [[ "${words[i]}" == "--" ]] && break
      used_hosts+=("${words[i]}")
    done

    avail_hosts=( "${(@)cp_hosts_default:|used_hosts}" )
    compadd -S '' -- "${avail_hosts[@]}" --
    return
  fi

  _describe -t dotfiles 'dotfiles subdirectory' dirs
  compadd -S '' -- -h --hosts
}

_copy_files_ssh_hosts() {
  local cfg="${HOME}/.ssh/config"
  [[ -r "$cfg" ]] || return 0

  awk '
    BEGIN {
      in_block = 0
      has_hostname = 0
      aliases = ""
    }

    /^[[:space:]]*#/ { next }
    /^[[:space:]]*$/ { next }

    tolower($1) == "host" {
      if (in_block && has_hostname && aliases != "") {
        print aliases
      }

      in_block = 1
      has_hostname = 0
      aliases = ""

      for (i = 2; i <= NF; i++) {
        if ($i ~ /[*?\[]/) {
          continue
        }
        aliases = aliases $i "\n"
      }
      next
    }

    in_block && tolower($1) == "hostname" {
      has_hostname = 1
      next
    }

    END {
      if (in_block && has_hostname && aliases != "") {
        print aliases
      }
    }
  ' "$cfg" | awk '!seen[$0]++'
}

_copy_files "$@"
