#!/usr/bin/env bash
##makedesc: Install nvim + lazyvim

set -eo pipefail

installed() { command -v "$1" >/dev/null 2>&1; }

# https://www.lazyvim.org/installation
# https://www.devas.life/effective-neovim-setup-for-web-development-towards-2024/

# TODO https://github.com/rockerBOO/awesome-neovim
# TODO https://docs.astronvim.com

isMac() { [ "$(uname -s)" = "Darwin" ]; }
isLinux() { [ "$(uname -s)" = "Linux" ]; }

if isLinux; then
    url="https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz"
    nvimDirName="nvim-linux-x86_64"
elif isMac; then
    url="https://github.com/neovim/neovim/releases/latest/download/nvim-macos-x86_64.tar.gz"
    nvimDirName="nvim-macos-x86_64"
fi

downloadPath="$HOME/install"
downloadTarGz="$downloadPath/nvim.tar.gz"
installPath="/opt/nvim"
cfgPath="$HOME/.config/nvim"
nvimDataPaths=(
    "$cfgPath"
    "$HOME/.local/share/nvim"
    "$HOME/.local/state/nvim"
    "$HOME/.cache/nvim"
)

backup() {
    echo "Backup configuration files..."
    t=$(date +'%s')
    for path in "${nvimDataPaths[@]}"; do
        [[ -d "$path" ]] && cp -rv "$path" "$path-$t.bak"
    done
    echo "Done"
}

install() {
    echo
    echo "==============================================="
    echo "Installing neovim"
    echo "==============================================="
    echo

    backup
    if installed wget; then
        wget -q --show-progress "$url" -O "$downloadTarGz"
    else
        curl -fsSL "$url" -o "$downloadTarGz"
    fi
    tar -xzf "$downloadTarGz" -C "$downloadPath"

    sudo rm -rf "$installPath"
    sudo mv "$downloadPath/$nvimDirName" "$installPath"

    if [ -d "$cfgPath" ]; then
        rm -rf "$cfgPath"
    fi
    git clone --depth=1 --single-branch https://github.com/LazyVim/starter "$cfgPath"
    rm -rf "$cfgPath/.git"

    if command -v update-desktop-database >/dev/null 2>&1; then
        sudo update-desktop-database
    fi
    if command -v xdg-desktop-menu >/dev/null 2>&1; then
        xdg-desktop-menu forceupdate
    fi

    echo
    echo "Finish!"
    nvim -v
    echo
}

remove() {
    echo
    echo "==============================================="
    echo "Removing neovim"
    echo "==============================================="
    echo

    sudo rm -rf "$installPath"
    for path in "${nvimDataPaths[@]}"; do
        rm -rf "$path"
    done
    find "$HOME/.config" -type f -path "*/nvim*" -exec rm -rfv {} + 2>/dev/null || true
    find "$HOME/.local" -type f -path "*/nvim*" -exec rm -rfv {} + 2>/dev/null || true

    echo
    echo "Finish!"
    echo
}

case "$1" in
    b|backup) backup ;;
    r|remove|d|delete|p|purge) remove ;;
    *) install ;;
esac

