# completion file for bash

_note_complete_entries () {
  local prefix="${NOTE_STORE_DIR:-$HOME/.note-store/}"
  prefix="${prefix%/}/"
  local suffix=".md"
  local autoexpand=${1:-0}

  local IFS=$'\n'
  local items=($(compgen -f $prefix$cur))

  # Remember the value of the first item, to see if it is a directory. If
  # it is a directory, then don't add a space to the completion
  local firstitem=""
  # Use counter, can't use ${#items[@]} as we skip hidden directories
  local i=0 item

  for item in ${items[@]}; do
    [[ $item =~ /\.[^/]*$ ]] && continue

    # if there is a unique match, and it is a directory with one entry
    # autocomplete the subentry as well (recursively)
    if [[ ${#items[@]} -eq 1 && $autoexpand -eq 1 ]]; then
      while [[ -d $item ]]; do
        local subitems=($(compgen -f "$item/"))
        local filtereditems=( ) item2
        for item2 in "${subitems[@]}"; do
          [[ $item2 =~ /\.[^/]*$ ]] && continue
          filtereditems+=( "$item2" )
        done
        if [[ ${#filtereditems[@]} -eq 1 ]]; then
          item="${filtereditems[0]}"
        else
          break
        fi
      done
    fi

    # append / to directories
    [[ -d $item ]] && item="$item/"

    item="${item%$suffix}"
    COMPREPLY+=("${item#$prefix}")
    if [[ $i -eq 0 ]]; then
      firstitem=$item
    fi
    let i+=1
  done

  # The only time we want to add a space to the end is if there is only
  # one match, and it is not a directory
  if [[ $i -gt 1 || ( $i -eq 1 && -d $firstitem ) ]]; then
    compopt -o nospace
  fi
}

_note_complete_folders () {
  local prefix="${NOTE_STORE_DIR:-$HOME/.note-store/}"
  prefix="${prefix%/}/"

  local IFS=$'\n'
  local items=($(compgen -d $prefix$cur))
  for item in ${items[@]}; do
    [[ $item == $prefix.* ]] && continue
    COMPREPLY+=("${item#$prefix}/")
  done
}


_note()
{
  COMPREPLY=()
  local cur="${COMP_WORDS[COMP_CWORD]}"
  local commands="init ls show help version ${NOTE_STORE_EXTENSION_COMMANDS[*]}"
  if [[ $COMP_CWORD -gt 1 ]]; then
    local lastarg="${COMP_WORDS[$COMP_CWORD-1]}"
    case "${COMP_WORDS[1]}" in
      init)
        _note_complete_folders
      ;;
      ls|list|edit)
        _note_complete_entries
      ;;
      show|-*)
        COMPREPLY+=($(compgen -W "-c --clip" -- ${cur}))
        _note_complete_entries 1
      ;;
      cp|copy|mv|rename)
        COMPREPLY+=($(compgen -W "-f --force" -- ${cur}))
        _note_complete_entries
      ;;
      rm|remove|delete)
        COMPREPLY+=($(compgen -W "-r --recursive -f --force" -- ${cur}))
        _note_complete_entries
      ;;
      #   git)
      #     COMPREPLY+=($(compgen -W "init push pull config log reflog rebase" -- ${cur}))
      #   ;;
    esac
  else
    COMPREPLY+=($(compgen -W "${commands}" -- ${cur}))
    _note_complete_entries 1
  fi
}

complete -o filenames -F _note note
