# ------------------------------------------------------------------------------
#          FILE:  zshmarks.plugin.zsh
#   DESCRIPTION:  oh-my-zsh plugin file.
#        AUTHOR:  Jocelyn Mallon
#       VERSION:  1.7.0
# ------------------------------------------------------------------------------

# Set BOOKMARKS_FILE if it doesn't exist to the default.
# Allows for a user-configured BOOKMARKS_FILE.
if [[ -z $BOOKMARKS_FILE ]] ; then
	export BOOKMARKS_FILE="$HOME/.bookmarks"
fi

# Check if $BOOKMARKS_FILE is a symlink.
if [[ -L $BOOKMARKS_FILE ]]; then
  BOOKMARKS_FILE=$(readlink $BOOKMARKS_FILE)
fi

# Create bookmarks_file it if it doesn't exist
if [[ ! -f $BOOKMARKS_FILE ]]; then
	touch $BOOKMARKS_FILE
fi

_zshmarks_move_to_trash(){
  if [[ $(uname) == "Linux"* || $(uname) == "FreeBSD"*  ]]; then
    label=`date +%s`
    mkdir -p ~/.local/share/Trash/info ~/.local/share/Trash/files
    \mv "${BOOKMARKS_FILE}.bak" ~/.local/share/Trash/files/bookmarks-$label
    echo "[Trash Info]
Path=/home/"$USER"/.bookmarks
DeletionDate="`date +"%Y-%m-%dT%H:%M:%S"`"
">~/.local/share/Trash/info/bookmarks-$label.trashinfo
  elif [[ $(uname) = "Darwin" ]]; then
    \mv "${BOOKMARKS_FILE}.bak" ~/.Trash/"bookmarks"$(date +%H-%M-%S)
  else
    \rm -f "${BOOKMARKS_FILE}.bak"
  fi
}

function bookmark() {
	local bookmark_name=$1
	if [[ -z $bookmark_name ]]; then
        bookmark_name="${PWD##*/}"
    fi
    cur_dir="$(pwd)"
    # Replace /home/uname with $HOME
    if [[ "$cur_dir" =~ ^"$HOME"(/|$) ]]; then
        cur_dir="\$HOME${cur_dir#$HOME}"
    fi
    # Store the bookmark as folder|name
    bookmark="$cur_dir|$bookmark_name"
    if [[ -z $(grep "$bookmark" $BOOKMARKS_FILE 2>/dev/null) ]]; then
        echo $bookmark >> $BOOKMARKS_FILE
        echo "Bookmark '$bookmark_name' saved"
    else
        echo "Bookmark already existed"
        return 1
    fi
}

__zshmarks_zgrep() {
	local outvar="$1"; shift
	local pattern="$1"
	local filename="$2"
	local file_contents="$(<"$filename")"
	local file_lines; file_lines=(${(f)file_contents})
	for line in "${file_lines[@]}"; do
		if [[ "$line" =~ "$pattern" ]]; then
			eval "$outvar=\"$line\""
			return 0
		fi
	done
	return 1
}

function jump() {
	local bookmark_name=$1
	local bookmark
	if ! __zshmarks_zgrep bookmark "\\|$bookmark_name\$" "$BOOKMARKS_FILE"; then
		echo "Invalid name, please provide a valid bookmark name. For example:"
		echo "  jump foo"
		echo
		echo "To bookmark a folder, go to the folder then do this (naming the bookmark 'foo'):"
		echo "  bookmark foo"
		return 1
	else
		local dir="${bookmark%%|*}"
		eval "cd \"${dir}\""
	fi
}

# Show a list of the bookmarks
function showmarks() {
  local bookmark_file="$(<"$BOOKMARKS_FILE")"
  local bookmark_array; bookmark_array=(${(f)bookmark_file});
  local bookmark_name bookmark_path bookmark_line
  if [[ $# -eq 1 ]]; then
    bookmark_name="*\|${1}"
    bookmark_line=${bookmark_array[(r)$bookmark_name]}
    bookmark_path="${bookmark_line%%|*}"
    bookmark_path="${bookmark_path/\$HOME/~}"
    printf "%s \n" $bookmark_path
  else
    for bookmark_line in $bookmark_array; do
      bookmark_path="${bookmark_line%%|*}"
      bookmark_path="${bookmark_path/\$HOME/~}"
      bookmark_name="${bookmark_line#*|}"
      printf "%s\t\t%s\n" "$bookmark_name" "$bookmark_path"
    done
  fi
}

# Delete a bookmark
function deletemark()  {
  local bookmark_name=$1
  if [[ -z $bookmark_name ]]; then
    printf "%s \n" "Please provide a name for your bookmark to delete. For example:"
    printf "\t%s \n" "deletemark foo"
    return 1
  else
    local bookmark_line bookmark_search
    local bookmark_file="$(<"$BOOKMARKS_FILE")"
    local bookmark_array; bookmark_array=(${(f)bookmark_file});
    bookmark_search="*\|${bookmark_name}"
    if [[ -z ${bookmark_array[(r)$bookmark_search]} ]]; then
      eval "printf '%s\n' \"'${bookmark_name}' not found, skipping.\""
    else
      \cp "${BOOKMARKS_FILE}" "${BOOKMARKS_FILE}.bak"
      bookmark_line=${bookmark_array[(r)$bookmark_search]}
      bookmark_array=(${bookmark_array[@]/$bookmark_line})
      eval "printf '%s\n' \"\${bookmark_array[@]}\"" >! $BOOKMARKS_FILE
      _zshmarks_move_to_trash
    fi
	fi
}

