#compdef pear
# ------------------------------------------------------------------------------
# Description
# -----------
#
#  Completion script for Pear (http://pear.php.net).
#
# ------------------------------------------------------------------------------
# Authors
# -------
#
#  * aki77 (https://github.com/aki77)
#
# ------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# ------------------------------------------------------------------------------


_pear () {
    local curcontext="$curcontext" state line expl ret=1

    _arguments \
        '1: :->subcmds' \
        '*:: :->args' && ret=0

    case $state in
        subcmds)
            _pear_commands
            ;;
        args)
            local cmd args

            cmd=$words[1]
            args=()

            case $cmd in
                channel-alias|channel-delete|channel-info|channel-update)
                    args+=(
                        ':channel:_pear_discovered_channels'
                    )
                    ;;
                uninstall|upgrade|run-scripts)
                    args+=(
                        ':package:_pear_installed_packages'
                    )
                    ;;
            esac

            _arguments "$args[@]" && ret=0
            return
            ;;
    esac
    return ret
}

_pear_commands () {
    local commands

    commands=(
        ${${(f)${"$(_call_program commands $service 2>&1)"#*Commands:}%Usage:*}/[[:blank:]]*[[:blank:]][[:blank:]]/:}
    )
    _describe -t commands 'Pear commands' commands
}

_pear_installed_packages () {
    local packages

    packages=(
        ${${(f)"$(pear list)"#*STATE}%%[[:blank:]]*}
    )
    _wanted package expl 'package' compadd -a packages
}

_pear_discovered_channels () {
    local channels

    channels=(
        ${${${(f)"$(_call_program commands pear list-channels)"#*SUMMARY}%__uri*}%%[[:blank:]]*}
    )
    _wanted channel expl 'channel' compadd -a channels
}

_pear "$@"