#!/usr/bin/env sh
#
# Global aliases for any shell

exist() { type "$1" >/dev/null 2>&1; }

# Avoid aliases which I did not create -- unalias EVERYTHING
unalias -a

# v shorthand for neovim
if exist nvim; then
    alias v="nvim"
    alias vim="nvim"
    alias vs="nvim -c 'ScratchPad'"                                # open an empty 'scratchpad' which simply disappears after use
    alias vw="nvim -c \"lua require 'zettelkasten'.index_open()\"" # open to personal wiki
elif exist vim; then
    alias v="vim"
else
    alias v="vi"
    alias vim="vi"
fi

# exit shell mimicks vim
alias :q="exit"

# ls defaults
if exist exa; then
    alias l="exa -l --git --git-ignore --group-directories-first"
    alias L="exa -hal --grid --git --group-directories-first"
    # a recursive tree
    # - usually want to change levels recursed with -L2 -L3 or similar
    alias ll="exa --tree -L2 --group-directories-first"
    alias LL="exa -a --tree -L2 --group-directories-first"
    alias lla="exa --tree --group-directories-first"
    alias LLA="exa -a --tree --group-directories-first"
else
    alias l="ls -lhF"
    alias L="ls -lAhF"
fi

# cd defaults
alias ..="cd .."
alias ...="cd ../.."
alias ~="cd ~"

alias md="mkdir -p"

# clear my screen
alias cl="clear"

# Display current external ip address
alias myip="curl -s icanhazip.com"

# fzf
if exist fzf; then
    # Display fuzzy-searchable history
    alias fzfhistory="history -l -E -D 0 | fzf --tac --height 20"
    fzfman() {
        man "$(apropos --long "$1" | fzf | awk '{print $2, $1}' | tr -d '()')"
    }

    # Fuzzy search packages to install
    if exist yay; then
        fzf_pkg_tool=yay
    elif exist paru; then
        fzf_pkg_tool=paru
    elif exist pacman; then
        fzf_pkg_tool=pacman
    fi
    # shellcheck disable=2139 # we *want* this to be done at shell startup instead of dynamically
    if [ -n "$fzf_pkg_tool" ]; then
        alias fzfyay="$fzf_pkg_tool -Slq | fzf -m --preview '$fzf_pkg_tool -Si {1}' | xargs -ro $fzf_pkg_tool -S"
        # Fuzzy uninstall packages
        alias fzfyayrns="$fzf_pkg_tool -Qeq | fzf -m --preview '$fzf_pkg_tool -Qi {1}' | xargs -ro $fzf_pkg_tool -Rns"
    fi
    unset fzf_pkg_tool

    # ripgrep-all to fzf search through any documents
    if exist rga; then
        fzfrga() {
            RG_PREFIX="rga --files-with-matches"
            xdg-open "$(
                FZF_DEFAULT_COMMAND="$RG_PREFIX '$1'" \
                    fzf --sort --preview="[[ ! -z {} ]] && rga --pretty --context 5 {q} {}" \
                    --phony -q "$1" \
                    --bind "change:reload:$RG_PREFIX {q}" \
                    --preview-window="70%:wrap"
            )"
        }
    fi
fi

# vifm
if exist vifm; then
    alias vm=vifm
    alias vmm='vifm ${PWD}'
fi

# default image viewer
if exist imv-folder; then
    iv() {
        if [ "$#" -eq 1 ] && [ -f "$1" ]; then
            imv-folder "$1"
        else
            imv "$@"
        fi
    }
else
    for cmd in imv nsxiv vimiv sxiv feh; do
        # shellcheck disable=SC2139
        # since we *want* it defined at definition
        if exist "$cmd"; then alias iv="$cmd"; break; fi
    done
fi

# python
if exist ptipython; then
    alias py=ptipython
elif exist ipython; then
    alias py=ipython
elif exist python; then
    alias py=python
fi

# distrobox
if exist distrobox; then
    alias db=distrobox
fi

if exist sc-im; then
    alias sc=sc-im
fi

if exist tidy-viewer; then
    tv() {
        tidy-viewer -a -e "$@" | less -S -R
    }
fi
