_euca2ools_a() {
    echo $($1 -h | egrep -v "(--url)|(--access-key)|(--secret-key)|(--help)" | awk '$1 ~/^-.*,/{print $1;print $2}' | sed s/,//g)
}
_euca2ools_args() {
    COMPREPLY=( $(compgen -W "$(_euca2ools_a $1)" -- "${COMP_WORDS[COMP_CWORD]}") )
    return 0;
}
###########################################################################
# Addresses
###########################################################################
_euca2ools_disassociate_address() {
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=( $(compgen -W "$(euca-describe-addresses | awk '$3 ~/i-.*/{print $2;print $3}') $(_euca2ools_a $1)" -- ${cur}) )
    return 0
}
_euca2ools_associate_address() {
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    case "${prev}" in
      -i) COMPREPLY=( $(compgen -W "$(euca-describe-instances | awk '/INSTANCE/ {print $2}') $(_euca2ools_a $1)" -- ${cur}) )
          return 0
	  ;;
      *) COMPREPLY=( $(compgen -W "$(euca-describe-addresses | awk '$3 ~/available.*/ {print $2}') $(_euca2ools_a $1)" -- ${cur}) )
          return 0
	  ;;
    esac
}
_euca2ools_addresses() {
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    case "${cur}" in
      *) COMPREPLY=( $(compgen -W "$(euca-describe-addresses | awk '$3 !~/nobody/ {print $2}') $(_euca2ools_a $1)" -- ${cur}) )
          return 0
	  ;;
    esac
}
complete -F _euca2ools_addresses euca-release-address
complete -F _euca2ools_addresses euca-describe-addresses
complete -F _euca2ools_associate_address euca-associate-address
complete -F _euca2ools_disassociate_address euca-disassociate-address

###########################################################################
# Instances
###########################################################################
_euca2ools_instances() {
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=()
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    case "${cur}" in
      *) COMPREPLY=( $(compgen -W "$(euca-describe-instances  | awk '/INSTANCE/ {print $2}') $(_euca2ools_a $1)" -- ${cur}) )
          return 0
	  ;;
    esac
}
_euca2ools_run_instances() {
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=()
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    case "${prev}" in
    -g|--group)
	COMPREPLY=( $(compgen -W "$(euca-describe-groups  | awk '/GROUP/ {print $3}')" -- ${cur}) )
        return 0
        ;;
    -k|--keypair)
	COMPREPLY=( $(compgen -W "$(euca-describe-keypairs  | awk '/KEYPAIR/ {print $2}')" -- ${cur}) )
        return 0
        ;;
    -t|--instance-type)
	COMPREPLY=( $(compgen -W "m1.small c1.medium m1.large m1.xlarge c1.xlarge" -- ${cur}) )
        return 0
        ;;
    -z|--availability-zone)
	COMPREPLY=( $(compgen -W "$(euca-describe-availability-zones  | awk '/AVAILABILITYZONE/ {print $2}')" -- ${cur}) )
        return 0
        ;;
    --kernel) 
        COMPREPLY=( $(compgen -W "$(euca-describe-images  | awk '$1 ~/IMAGE/ && $2 ~/eki-.*/ {print $2}')" -- ${cur}) )
        return 0
        ;;
    --ramdisk) 
        COMPREPLY=( $(compgen -W "$(euca-describe-images  | awk '$1 ~/IMAGE/ && $2 ~/eri-.*/ {print $2}')" -- ${cur}) )
        return 0
        ;;
    *) COMPREPLY=( $(compgen -W "$(euca-describe-images  | awk '$1 ~/IMAGE/ && $2 ~/emi-.*/ {print $2}') --kernel --ramdisk $(_euca2ools_a $1)" -- ${cur}) )
        return 0
        ;;
    esac
}
complete -F _euca2ools_instances euca-terminate-instances
complete -F _euca2ools_instances euca-describe-instances
complete -F _euca2ools_instances euca-get-console-output 
complete -F _euca2ools_instances euca-reboot-instances
complete -F _euca2ools_run_instances euca-run-instances

###########################################################################
# Images, Volumes, Snapshots.
###########################################################################
_euca2ools_images() {
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=()
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    case "${cur}" in
      *) COMPREPLY=( $(compgen -W "$(euca-describe-images  | awk '/IMAGE/ {print $2}') $(_euca2ools_a $1)" -- ${cur}) )
          return 0
	  ;;
    esac
}
complete -F _euca2ools_images euca-describe-images
complete -F _euca2ools_images euca-deregister
complete -F _euca2ools_images euca-describe-image-attribute

_euca2ools_volumes() {
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=()
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    case "${prev}" in
      -z|--zone) COMPREPLY=( $(compgen -W "$(euca-describe-availability-zones | awk '/AVAILABILITYZONE/ {print $2}')" -- ${cur}) )
          return 0
	  ;;
      -s|--snapshot) COMPREPLY=( $(compgen -W "$(euca-describe-snapshots | awk '/SNAPSHOT/ {print $2}')" -- ${cur}) )
          return 0
	  ;;
      *) COMPREPLY=( $(compgen -W "$(euca-describe-volumes | awk '/VOLUME/ {print $2}') $(_euca2ools_a $1)" -- ${cur}) )
          return 0
	  ;;
    esac
    return 
}
complete -F _euca2ools_volumes euca-describe-volumes
complete -F _euca2ools_volumes euca-delete-volume
complete -F _euca2ools_volumes euca-create-volume

_euca2ools_attach_volume() {
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=()
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    case "${prev}" in
      -i|--instance) COMPREPLY=( $(compgen -W "$(euca-describe-instances | awk '/INSTANCE/ {print $2}')" -- ${cur}) )
          return 0
	  ;;
      *) COMPREPLY=( $(compgen -W "$(euca-describe-volumes | awk '/VOLUME/ && $5 ~/available/ {print $2}') $(_euca2ools_a $1)" -- ${cur}) )
          return 0
	  ;;
    esac
}
complete -F _euca2ools_attach_volume euca-attach-volume

_euca2ools_detach_volume() {
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=( $(compgen -W "$(euca-describe-volumes  | awk '$1 ~/VOLUME/ && $5 ~/in-use/ {print $2}') $(_euca2ools_a $1)" -- ${cur}) )
    return 0;
}
complete -F _euca2ools_detach_volume euca-detach-volume


_euca2ools_snapshots() {
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=()
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    COMPREPLY=( $(compgen -W "$(euca-describe-snapshots  | awk '/SNAPSHOT/ {print $2}') $(_euca2ools_a $1)" -- ${cur}) )
    return 0
}
complete -F _euca2ools_snapshots euca-describe-snapshots
complete -F _euca2ools_snapshots euca-delete-snapshot
complete -F _euca2ools_volumes euca-create-snapshot


###########################################################################
# Keypairs & Groups.
###########################################################################
_euca2ools_keypairs() {
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=()
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    case "${cur}" in
      *) COMPREPLY=( $(compgen -W "$(euca-describe-keypairs  | awk '/KEYPAIR/ {print $2}') $(_euca2ools_a $1)" -- ${cur}) )
          return 0
	  ;;
    esac
}
complete -F _euca2ools_keypairs euca-describe-keypairs
complete -F _euca2ools_keypairs euca-delete-keypair

_euca2ools_groups() {
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=()
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    case "${cur}" in
      *) COMPREPLY=( $(compgen -W "$(euca-describe-groups  | awk '/GROUP/ {print $3}') $(_euca2ools_a $1)" -- ${cur}) )
          return 0
	  ;;
    esac
}
complete -F _euca2ools_groups euca-describe-groups
complete -F _euca2ools_groups euca-delete-group
_euca2ools_authorize() {
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=()
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    case "${prev}" in
      -P,|--protocol) COMPREPLY=( $(compgen -W "tcp udp icmp" -- ${cur}) )
          return 0
          ;;
      -o,|--source-group) COMPREPLY=( $(compgen -W "$(euca-describe-groups | awk '/GROUP/ {print $3}') $(_euca2ools_a $1)" -- ${cur}) )
          return 0
          ;;
      *) COMPREPLY=( $(compgen -W "$(euca-describe-groups | awk '/GROUP/ {print $3}') $(_euca2ools_a $1)" -- ${cur}) )
          return 0
	  ;;
    esac
}
complete -F _euca2ools_authorize euca-authorize

###########################################################################
# Misc.
###########################################################################
_euca2ools_daz() {
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=( $(compgen -W "verbose coredump $(euca-describe-availability-zones verbose | awk '$1 ~/AVAILABILITYZONE/ && $2 !~/.-/{print $2}') $(_euca2ools_a $1)" -- ${cur}) )
    return 0
}
complete -F _euca2ools_daz euca-describe-availability-zones

complete -F _euca2ools_args euca-describe-regions
complete -F _euca2ools_args euca-create-snapshot
complete -F _euca2ools_args euca-register
complete -F _euca2ools_args euca-download-bundle
complete -F _euca2ools_args euca-add-group
complete -F _euca2ools_args euca-add-keypair
complete -F _euca2ools_args euca-modify-image-attribute
complete -F _euca2ools_args euca-reset-image-attribute
complete -F _euca2ools_args euca-unbundle
complete -F _euca2ools_args euca-upload-bundle
complete -F _euca2ools_args euca-version
complete -F _euca2ools_args euca-bundle-image
complete -F _euca2ools_args euca-bundle-vol
complete -F _euca2ools_args euca-allocate-address
complete -F _euca2ools_args euca-delete-bundle
complete -F _euca2ools_args euca-confirm-product-instance
complete -F _euca2ools_args euca-revoke

