###########################
# Settings

# These can be overwritten any time.
# If they are not set yet, they will be
# overwritten with their default values

fastfile_dir="${fastfile_dir:-${HOME}/.fastfile}"
fastfile_var_prefix="${fastfile_var_prefix:-ยง}"

###########################
# Impl

#
# Generate a shortcut
#
# Arguments:
#    1. name - The name of the shortcut (default: name of the file)
#    2. file - The file or directory to make the shortcut for
# STDOUT:
#    => fastfile_print
#
function fastfile() {
    test "$2" || 2="."
    file=$(readlink -f "$2")

    test "$1" || 1="$(basename "$file")"
    name=$(echo "$1" | tr " " "_")


    mkdir -p "${fastfile_dir}"
    echo "$file" > "$(fastfile_resolv "$name")"

    fastfile_sync
    fastfile_print "$name"
}

#
# Resolve the location of a shortcut file (the database file, where the value is written!)
#
# Arguments:
#    1. name - The name of the shortcut
# STDOUT:
#   The path to the shortcut file
#
function fastfile_resolv() {
    echo "${fastfile_dir}/${1}"
}

#
# Get the real path of a shortcut
#
# Arguments:
#    1. name - The name of the shortcut
# STDOUT:
#    The path
#
function fastfile_get() {
    cat "$(fastfile_resolv "$1")"
}

#
# Print a shortcut
#
# Arguments:
#    1. name - The name of the shortcut
# STDOUT:
#    Name and value of the shortcut
#
function fastfile_print() {
    echo "${fastfile_var_prefix}${1} -> $(fastfile_get "$1")"
}

#
# List all shortcuts
#
# STDOUT:
#    (=> fastfile_print) for each shortcut
#
function fastfile_ls() {
    for f in "${fastfile_dir}"/*(N); do
        file=$(basename "$f") # To enable simpler handling of spaces in file names
        varkey=$(echo "$file" | tr " " "_")

        # Special format for columns
        echo "${fastfile_var_prefix}${varkey}|->|$(fastfile_get "$file")"
    done | column -t -s "|"
}

#
# Remove a shortcut
#
# Arguments:
#    1. name - The name of the shortcut (default: name of the file)
# STDOUT:
#    => fastfile_print
#
function fastfile_rm() {
    fastfile_print "$1"
    rm "$(fastfile_resolv "$1")"
    unalias "${fastfile_var_prefix}${1}"
}

#
# Generate the aliases for the shortcuts
#
function fastfile_sync() {
    for f in "${fastfile_dir}"/*(N); do
        file=$(basename "$f") # To enable simpler handling of spaces in file names
        varkey=$(echo "$file" | tr " " "_")

        alias -g "${fastfile_var_prefix}${varkey}"="'$(fastfile_get "$file")'"
    done
}

##################################
# Shortcuts

alias ff=fastfile
alias ffp=fastfile_print
alias ffrm=fastfile_rm
alias ffls=fastfile_ls
alias ffsync=fastfile_sync

##################################
# Init

fastfile_sync