#compdef mpv

# mpv zsh completion

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

local rc=1

_arguments -C -S \

  '*:files:->mfiles' && rc=0

case $state in
  ao)
    local -a values
    values=(

    )

    _describe -t values 'audio outputs' values && rc=0
  ;;

  vo)
    local -a values
    values=(

    )

    _describe -t values 'video outputs' values && rc=0
  ;;

  af)
    local -a values
    values=(

    )

    _describe -t values 'audio filters' values && rc=0
  ;;

  vf)
    local -a values
    values=(

    )

    _describe -t values 'video filters' values && rc=0
  ;;

  profile|show-profile)
      local -a profiles
      local current
      for current in "${(@f)$($words[1] --profile=help)}"; do
        current=${current//\*/\\\*}
        current=${current//\:/\\\:}
        current=${current//\[/\\\[}
        current=${current//\]/\\\]}
        if [[ $current =~ $'\t'([^$'\t']*)$'\t'(.*) ]]; then
          if [[ -n $match[2] ]]; then
            current="$match[1][$match[2]]"
          else
            current="$match[1]"
          fi
          profiles=($profiles $current)
        fi
      done
      if [[ $state == show-profile ]]; then
        # For --show-profile, only one allowed
        if (( ${#profiles} > 0 )); then
          _values 'profile' $profiles && rc=0
        fi
      else
        # For --profile, multiple allowed
        profiles=($profiles 'help[list profiles]')
        _values -s , 'profile(s)' $profiles && rc=0
      fi
  ;;

  files)
    compset -P '*,'
    compset -S ',*'
    _files -r ',/ \t\n\-' && rc=0
  ;;

  mfiles)
    local expl
    _tags files urls
    while _tags; do
      _requested files expl 'media file' _files -g \
        "*.(#i)(asf|asx|avi|flac|flv|m1v|m2p|m2v|m4v|mjpg|mka|mkv|mov|mp3|mp4|mpe|mpeg|mpg|ogg|ogm|ogv|qt|rm|ts|vob|wav|webm|wma|wmv)(-.)" && rc=0
      if _requested urls; then
        while _next_label urls expl URL; do
          _urls "$expl[@]" && rc=0
          compadd -S '' "$expl[@]"  && rc=0
        done
      fi
      (( rc )) || return 0
    done
  ;;
esac

return rc
