#!/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 $(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
