#compdef pod
#autoload

# -----------------------------------------------------------------------------
#          FILE:  pod.plugin.zsh
#   DESCRIPTION:  Cocoapods autocomplete plugin for Oh-My-Zsh
#                 http://cocoapods.org
#        AUTHOR:  Alexandre Joly (alexandre.joly@mekanics.ch)
#        GITHUB:  https://github.com/mekanics
#       TWITTER:  @jolyAlexandre
#       VERSION:  0.0.1
#       LICENSE:  MIT
# -----------------------------------------------------------------------------

#------------------
# TODO:
#   - Parameters for
#       - install
#       - update
#       - outdated
#       - search
#       - list
#       - push
#       - podfile-info
#       - setup
#------------------

local -a _1st_arguments
_1st_arguments=(
    'help:Show help for the given command.'
    'install:Install project dependencies'
    'ipc:Inter-process communication'
    'list:List pods'
    'outdated:Show outdated project dependencies'
    'podfile-info:Shows information on installed Pods'
    'push:Push new specifications to a spec-repo'
    'repo:Manage spec-repositories'
    'search:Searches for pods'
    'setup:Setup the CocoaPods environment'
    'spec:Manage pod specs'
    'update:Update outdated project dependencies'
)

local -a _repo_arguments
_repo_arguments=(
    'add:Add a spec repo'
    'lint:Validates all specs in a repo'
    'update:Update a spec repo'
)

local -a _spec_arguments
_spec_arguments=(
    'cat:Prints a spec file'
    'create:Create spec file stub'
    'edit:Edit a spec file'
    'lint:Validates a spec file'
    'which:Prints the path of the given spec'
)

local -a _ipc_arguments
_ipc_arguments=(
    'list:Lists the specifications know to CocoaPods'
    'podfile:Converts a Podfile to YAML'
    'repl:The repl listens to commands on standard input'
    'spec:Converts a podspec to YAML'
    'update-search-index:Updates the search index'
)

local -a _list_arguments
_list_arguments=(
    'new:Lists pods introduced in the master spec-repo since the last check'
)

__first_command_list ()
{
    local expl
    declare -a tasks

    tasks=(install ipc list outdated podfile-info push repo search setup spec update)

    _wanted tasks expl 'help' compadd $tasks
}

__repo_list() {
    _wanted application expl 'command' compadd $(command ls -1 ~/.cocoapods 2>/dev/null | sed -e 's/ /\\ /g')
}

__pod-repo() {
    local curcontext="$curcontext" state line
    typeset -A opt_args

    _arguments -C \
        ':command:->command' \
        '*::options:->options'

   case $state in
       (command)
           _describe -t commands "gem subcommand" _repo_arguments
           return
       ;;

       (options)
           case $line[1] in
               (update|lint)
                   _arguments ':feature:__repo_list'
               ;;
           esac
       ;;
    esac
}

__pod-spec() {
    local curcontext="$curcontext" state line
    typeset -A opt_args

    _arguments -C \
        ':command:->command' \
        '*::options:->options'

   case $state in
        (command)
            _describe -t commands "gem subcommand" _spec_arguments
            return
        ;;

        (options)
            #todo
            return
        ;;
    esac
}

__pod-ipc() {
    local curcontext="$curcontext" state line
    typeset -A opt_args

    _arguments -C \
        ':command:->command' \
        '*::options:->options'

   case $state in
        (command)
            _describe -t commands "gem subcommand" _ipc_arguments
            return
        ;;

        (options)
            #todo
            return
        ;;
    esac
}

__pod-list() {
    local curcontext="$curcontext" state line
    typeset -A opt_args

    _arguments -C \
        ':command:->command' \
        '*::options:->options'

   case $state in
        (command)
            _describe -t commands "gem subcommand" _list_arguments
            return
        ;;

        (options)
            #todo
            return
        ;;
    esac
}



local expl
#local -a boxes installed_boxes

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

_arguments -C \
    ':command:->command' \
    '*::options:->options'

case $state in
  (command)
      _describe -t commands "gem subcommand" _1st_arguments
      return
  ;;

  (options)
    case $line[1] in
        (help)
            _arguments ':feature:__first_command_list'
        ;;

        (push)
            _arguments ':feature:__repo_list'
        ;;

        (repo)
            __pod-repo
        ;;

        (spec)
            __pod-spec
        ;;

        (ipc)
            __pod-ipc
        ;;

        (list)
            __pod-list
        ;;

        (install|outdated|podfile-info|search|setup|update)
            #_arguments ':feature:__repo_list'
    esac
  ;;
esac
