#!/bin/bash

_link_editor() {
    COMPREPLY=()
    curr="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    if [[ ${COMP_CWORD} -eq 1 ]] ; then
        COMPREPLY=( $(compgen -W "-d -l --help --version" -- ${curr}) )
        return 0
    elif [[ ${COMP_CWORD} -gt 2 &&
            "${COMP_WORDS[1]}" != "-d" &&
            "${COMP_WORDS[1]}" != "-l" &&
            "${COMP_WORDS[1]}" != "--help" &&
            "${COMP_WORDS[1]}" != "--version" ]] ; then
        COMPREPLY=( )
        return 0
    fi

    FIND_ARG_USED=false
    REPLACE_ARG_USED=false

    MODE_LINKS_CHANGE=false
    SUBMODE_LINKS_CHANGE_SIMPLE=false
    SUBMODE_LINKS_CHANGE_REPLACING=false

    MODE_REPLACING_IN_DIR=false

    MODE_WRONG_USING=false

    case "${COMP_WORDS[1]}" in
        "-l") MODE_LINKS_CHANGE=true     ;;
        "-d") MODE_REPLACING_IN_DIR=true ;;
        *)    MODE_WRONG_USING=true      ;;
    esac

    args=(${COMP_WORDS[@]})
    if [[ $curr != "" ]] ; then
        unset 'args[${#args[@]}-1]'
    fi
    for arg in ${args[@]}
    do
        if [[ "$arg" == "-f" ]] ; then
            FIND_ARG_USED=true
            if [[ $MODE_LINKS_CHANGE == true ]] ; then
                SUBMODE_LINKS_CHANGE_REPLACING=true
            fi
        elif [[ "$arg" == "-r" ]] ; then
            REPLACE_ARG_USED=true
            if [[ $MODE_LINKS_CHANGE == true ]] ; then
                SUBMODE_LINKS_CHANGE_REPLACING=true
            fi
        elif [[ "$arg" == "-p" ]] ; then
            if [[ $MODE_LINKS_CHANGE == true ]] ; then
                SUBMODE_LINKS_CHANGE_SIMPLE=true
            fi
        fi
    done

    if [[ $MODE_LINKS_CHANGE == true &&
          $SUBMODE_LINKS_CHANGE_SIMPLE == false &&
          $SUBMODE_LINKS_CHANGE_REPLACING == false ]] ; then
        if [[ "${curr}" == -* && "${prev}" != "-l" ]] ; then
            COMPREPLY=( $(compgen -W "-p -f -r" -- ${curr}) )
            return 0
        else #input links: -l ...
            COMPREPLY=( )
            return 0
        fi
    fi

    if [[ $MODE_LINKS_CHANGE == true &&
          $SUBMODE_LINKS_CHANGE_SIMPLE == true ]] ; then
        if [[ "${prev}" == "-p" ]] ; then            
            link=${COMP_WORDS[2]}
            if [[ "$link" == \"* && "$link" == *\" ]]; then
                link="${link:1:-1}"
            else
                link="${link//\\/}"
            fi
            link=${link%%/}
            if [[ "$link" != "" && -L "$link" ]] ; then
                link=${link/"~"/$HOME}
                if [[ "${curr}" == "" ]]; then
                    rlink="`readlink "$link"`"
                    COMPREPLY=( "\"${rlink}\"" )
                    return 0
                fi
            fi
        else
            COMPREPLY=( )
            return 0
        fi
    fi

    if [[ $FIND_ARG_USED == false &&
          $REPLACE_ARG_USED == false &&
          ${prev} != -* ]] ; then
        COMPREPLY=( $(compgen -W "-f -r" -- ${curr}) ) 
        return 0
    fi

    if [[ $FIND_ARG_USED == true &&
          $REPLACE_ARG_USED == false ]] ; then
        if [[ ${curr} == -* && "${prev}" != "-f" ]] ; then
            COMPREPLY=( $(compgen -W "-r" -- ${curr}) ) 
            return 0
        else
            COMPREPLY=( )
            return 0
        fi
    elif [[ $FIND_ARG_USED == false &&
          $REPLACE_ARG_USED == true ]] ; then
        if [[ ${curr} == -* ]] ; then
            COMPREPLY=( $(compgen -W "-f" -- ${curr}) )
            return 0
        else
            COMPREPLY=( )
            return 0
        fi
    elif [[ $FIND_ARG_USED == true &&
          $REPLACE_ARG_USED == true ]] ; then
        if [[ $MODE_REPLACING_IN_DIR == true && "${prev}" != -* ]] ; then
            COMPREPLY=( $(compgen -W "-R" -- ${curr}) )
        else
            COMPREPLY=( )
        fi
        return 0
    fi

}

complete -o default -F _link_editor link-editor
complete -o default -F _link_editor ./link-editor
