#!/usr/bin/env bash
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
#
# groovyc Bash Completion
# =======================
#
# Bash completion support for the `groovyc` command,
# generated by [picocli](http://picocli.info/) version 3.0.2.
#
# Installation
# ------------
#
# 1. Source all completion scripts in your .bash_profile
#
#   cd $GROOVY_HOME/bin
#   for f in $(find . -name "*_completion"); do line=". $(pwd)/$f"; grep "$line" ~/.bash_profile || echo "$line" >> ~/.bash_profile; done
#
# 2. Open a new bash console, and type `groovyc [TAB][TAB]`
#
# Documentation
# -------------
# The script is called by bash whenever [TAB] or [TAB][TAB] is pressed after
# 'groovyc (..)'. By reading entered command line parameters,
# it determines possible bash completions and writes them to the COMPREPLY variable.
# Bash then completes the user input if only one entry is listed in the variable or
# shows the options if more than one is listed in COMPREPLY.
#
# References
# ----------
# [1] http://stackoverflow.com/a/12495480/1440785
# [2] http://tiswww.case.edu/php/chet/bash/FAQ
# [3] https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html
# [4] https://stackoverflow.com/questions/17042057/bash-check-element-in-array-for-elements-in-another-array/17042655#17042655
# [5] https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html#Programmable-Completion
#

# Enable programmable completion facilities (see [3])
shopt -s progcomp

# ArrContains takes two arguments, both of which are the name of arrays.
# It creates a temporary hash from lArr1 and then checks if all elements of lArr2
# are in the hashtable.
#
# Returns zero (no error) if all elements of the 2nd array are in the 1st array,
# otherwise returns 1 (error).
#
# Modified from [4]
function ArrContains() {
  local lArr1 lArr2
  declare -A tmp
  eval lArr1=("\"\${$1[@]}\"")
  eval lArr2=("\"\${$2[@]}\"")
  for i in "${lArr1[@]}";{ [ -n "$i" ] && ((++tmp[$i]));}
  for i in "${lArr2[@]}";{ [ -n "$i" ] && [ -z "${tmp[$i]}" ] && return 1;}
  return 0
}

# Bash completion entry point function.
# _complete_groovyc finds which commands and subcommands have been specified
# on the command line and delegates to the appropriate function
# to generate possible options and subcommands for the last specified subcommand.
function _complete_groovyc() {


  # No subcommands were specified; generate completions for the top-level command.
  _picocli_groovyc; return $?;
}

# Generates completions for the options and subcommands of the `groovyc` command.
function _picocli_groovyc() {
  # Get completion data
  CURR_WORD=${COMP_WORDS[COMP_CWORD]}
  PREV_WORD=${COMP_WORDS[COMP_CWORD-1]}

  COMMANDS=""
  FLAG_OPTS="-e --exception -pa --parameters -pr --enable-preview -j --jointCompilation -h --help -v --version"
  ARG_OPTS="-cp -classpath --classpath -sourcepath --sourcepath --temp --encoding -d -b --basescript -J -F --configscript"

  case ${CURR_WORD} in
    -sourcepath|--sourcepath)
      compopt -o filenames
      COMPREPLY=( $( compgen -f -- "" ) ) # files
      return $?
      ;;
    --temp)
      compopt -o filenames
      COMPREPLY=( $( compgen -f -- "" ) ) # files
      return $?
      ;;
    -d)
      compopt -o filenames
      COMPREPLY=( $( compgen -f -- "" ) ) # files
      return $?
      ;;
    *)
      case ${PREV_WORD} in
        -sourcepath|--sourcepath)
          compopt -o filenames
          COMPREPLY=( $( compgen -f -- $CURR_WORD ) ) # files
          return $?
          ;;
        --temp)
          compopt -o filenames
          COMPREPLY=( $( compgen -f -- $CURR_WORD ) ) # files
          return $?
          ;;
        -d)
          compopt -o filenames
          COMPREPLY=( $( compgen -f -- $CURR_WORD ) ) # files
          return $?
          ;;
      esac
  esac

  COMPREPLY=( $(compgen -W "${FLAG_OPTS} ${ARG_OPTS} ${COMMANDS}" -- ${CURR_WORD}) )
}

# Define a completion specification (a compspec) for the
# `groovyc`, `groovyc.sh`, and `groovyc.bash` commands.
# Uses the bash `complete` builtin (see [5]) to specify that shell function
# `_complete_groovyc` is responsible for generating possible completions for the
# current word on the command line.
# The `-o default` option means that if the function generated no matches, the
# default Bash completions and the Readline default filename completions are performed.
complete -F _complete_groovyc -o default groovyc groovyc.sh groovyc.bash
