#!/bin/bash

_commands() {
    echo "con gym gcon contests gyms groups gcontests hack info login peek problems standings submit time watch open parse test completion version -h --help"
}

_cf() {

    local cur
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    _script_commands=""

    case $COMP_CWORD in
    1)
        _script_commands=$(_commands)
        ;;
    *)
        case "${COMP_WORDS[COMP_CWORD - 1]}" in
        "login")
            _script_commands="--handle"
            ;;
        "con" | "gym")
            _script_commands="--id"
            ;;
        "gcon")
            _script_commands="--group"
            ;;
        "open" | "parse")
            _script_commands="--prob"
            ;;
        "test")
            _script_commands=$(ls)
            ;;
        "standings")
            case "${COMP_WORDS[1]}" in
            "standings")
                _script_commands="-c --contest --group -v --verbose -s --sort -t --top -a --all"
                ;;
            "hack")
                _script_commands="-c --contest -t --top -a --all"
                ;;
            esac
            ;;
        "submit")
            _script_commands="-p --prob -w --watch -l --lang $(ls)"
            ;;
        "gcontests")
            _script_commands="--group"
            ;;
        "contests" | "gyms" | "groups" | "problems")
            _script_commands="--pretty-off"
            ;;
        "hack")
            _script_commands="standings -n --number -p --prob -r --reverse --time-limit $(ls)"
            ;;
        "peek" | "watch" | "time" | "info") ;;

        "-p" | "--prob")
            _script_commands=$(cf problems --pretty-off)
            ;;
        "--group")
            _script_commands=$(cf groups --pretty-off)
            ;;
        "--id")
            case "${COMP_WORDS[1]}" in
            "con")
                _script_commands=$(cf contests --pretty-off)
                ;;
            "gym")
                _script_commands=$(cf gyms --pretty-off)
                ;;
            esac
            ;;
        "--contest")
            _script_commands=$(cf gcontests --group ${COMP_WORDS[COMP_CWORD - 2]} --pretty-off)
            ;;
        *)
            case "${COMP_WORDS[COMP_CWORD - 2]}" in
            "--group")
                case "${COMP_WORDS[1]}" in
                "gcontests")
                    _script_commands="--pretty-off"
                    ;;
                "gcon")
                    _script_commands="--contest"
                    ;;
                esac
                ;;
            esac
            ;;
        esac
        ;;
    esac

    COMPREPLY=($(compgen -W "${_script_commands}" -- "${cur}"))

    return 0
}

complete -F _cf cf
