# Open Infrastructure: container-tools
# Copyright (C) 2016 Andreas Kreuzer <andreas.kreuzer@open-infrastructure.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

_container()
{
    local cur prev cmd opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    if [ ${COMP_CWORD} -gt 0 ]
    then
        cmd="${COMP_WORDS[1]}"
    fi

    if [ "${prev}" = "--" ]
    then
        compopt -o bashdefault
        COMPREPLY=( $(compgen -c -- $cur) )
        return 0
    fi

    case "${cmd}" in
        console)
            case "${cur}" in
                -*)
                    opts="-n --name"
                    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                    return 0
                    ;;

                *)
                    case "${prev}" in
                        -n|--name)
                            opts=$(container list -s -f short)
                            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                            return 0
                            ;;
                    esac
                    ;;
            esac
            ;;

        create)
            case "${cur}" in
                -*)
                    opts="-n --name -c --capability -d --drop-capability -s --script -b --bind"
                    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                    return 0
                    ;;

                *)
                    case "${prev}" in
                        -n|--name)
                            opts=$(cd /srv/container/container-tools/debconf 2>/dev/null && ls *.cfg 2>/dev/null | sed -e 's/.cfg$//g')
                            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                            return 0
                            ;;

                        -s|--script)
                            opts="debootstrap debconf default"
                            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                            return 0
                            ;;
                    esac
                    ;;
            esac
            ;;

        enter)
            case "${cur}" in
                -*)
                    opts="-n --name"
                    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                    return 0
                    ;;

                *)
                    case "${prev}" in
                        -n|--name)
                            opts=$(container list -s -f short)
                            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                            return 0
                            ;;
                    esac
                    ;;
            esac
            ;;

        limit)
            case "${cur}" in
                -*)
                    opts="-n --name --blockio-device-weight --blockio-read-bandwith -b --blockio-weight --blockio-write-bandwith -c --cpu-quota --cpu-shares -m --memory-limit -t --tasks-max"
                    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                    return 0
                    ;;

                *)
                    case "${prev}" in
                        -n|--name)
                            opts=$(container list -a -f short)
                            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                            return 0
                            ;;
                    esac
                    ;;
            esac
            ;;

        list)
            case "${cur}" in
                -*)
                    opts="-a --all -f --format -h --host -o --other -s --started -t --stopped"
                    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                    return 0
                    ;;

                *)
                    case "${prev}" in
                        -h|--host)
                            opts="true false $(hostname -f)"
                            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                            return 0
                            ;;
                    esac
                    ;;
            esac
            ;;

        remove)
            case "${cur}" in
                -*)
                    opts="-n --name -f --force"
                    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                    return 0
                    ;;

                *)
                    case "${prev}" in
                        -n|--name)
                            opts=$(container list -a -f short)
                            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                            return 0
                            ;;
                    esac
                    ;;
            esac
            ;;

        restart)
            case "${cur}" in
                -*)
                    opts="-n --name"
                    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                    return 0
                    ;;

                *)
                    case "${prev}" in
                        -n|--name)
                            opts=$(container list -s -f short)
                            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                            return 0
                            ;;
                    esac
                    ;;
            esac
            ;;

        start)
            case "${cur}" in
                -*)
                    opts="-n --name"
                    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                    return 0
                    ;;

                *)
                    case "${prev}" in
                        -n|--name)
                            opts=$(container list -t -f short)
                            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                            return 0
                            ;;
                    esac
                    ;;
            esac
            ;;

        stop)
            case "${cur}" in
                -*)
                    opts="-n --name -f --force"
                    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                    return 0
                    ;;

                *)
                    case "${prev}" in
                        -n|--name)
                            opts=$(container list -s -f short)
                            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                            return 0
                            ;;
                    esac
                    ;;
            esac
            ;;

        *)
            local commands=$(ls /usr/lib/container-tools/container/)
            COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) )
            return 0
            ;;
    esac

    compopt -o filenames
    COMPREPLY=( $(compgen -f -- $cur) )
    return 0
}

complete -F _container container cnt