#compdef mv gmv zf_mv

local args variant aopts=( -A '-*' )

_pick_variant -r variant -b zsh gnu='(GNU|uutils)' $OSTYPE --version
case $variant in
  gnu)
    aopts=()
    args=(
      '(-b --backup -n --no-clobber)--backup=[make a backup of each existing destination file]: : _values "backup type"
        {none,off}"[never make backups]"
        {numbered,t}"[make numbered backups]"
        {existing,nil}"[numbered backups, if they already exist]"
        {simple,never}"[always make simple backups]"'
      '(-b --backup -n --no-clobber)-b[make a backup of each existing destination file]'
      '(-v)--debug[explain how a file is copied]'
      '--exchange[exchange source and destination]'
      '(-f --force -i --interactive -n --no-clobber)'{-f,--force}"[don't prompt before overwriting]"
      '(-f --force -i --interactive -n --no-clobber)'{-i,--interactive}'[prompt before overwriting existing file]'
      '(-f --force -i --interactive -n --no-clobber)'{-n,--no-clobber}"[don't overwrite existing file]"
      "--no-copy[don't copy if renaming fails]"
      '--strip-trailing-slashes[remove any trailing slashes from each source argument]'
      '(-S --suffix)'{-S+,--suffix=}'[specify the backup suffix]:backup suffix [~]'
      '(-t --target-directory)'{-t+,--target-directory=}'[move all source arguments into specified directory]:directory:_directories'
      '(-T --no-target-directory)'{-T,--no-target-directory}'[treat final argument as a normal file]'
      '(-u)--update=-[move only when destination file is older or missing]::update files [older]:(all none none-fail older)'
      '(--update)-u[move only when destination file is older or missing]'
      '(-v --verbose)'{-v,--verbose}'[show file names after they are moved]'
      '(- *)--help[display usage information]'
      '(- *)--version[display version information]'
    )
    [[ $OSTYPE = linux* ]] && args+=(
      '(-Z --context)'{-Z,--context}'[set SELinux security context of destination file to default type]'
    )
    ;;
  *)
    args=(
      "(-i -n)-f[don't prompt before overwriting]"
      '(-f -n)-i[prompt before overwriting existing file]'
    )
    ;|
  darwin*|dragonfly*|freebsd*|netbsd*)
    args+=( "-h[if target is a symlink to a directory, don't follow it]" )
  ;|
  darwin*|dragonfly*|freebsd*)
    args+=( "(-f -i)-n[don't overwrite existing file]" )
    ;|
  darwin*|dragonfly*|*bsd*)
    args+=(
      '-v[show file names after they are moved]'
    )
    ;|
esac

_arguments -s -S $aopts $args \
  '*: :_files'
