# Global aliases for ZSH
if alias -g 2>/dev/null; then
    alias -g ...=../..
    alias -g ....=../../..
    alias -g .....=../../../..
    alias -g ......=../../../../..
    alias -g H='| head'
    alias -g T='| tail'
    alias -g G='| grep'
    alias -g L="| less"
    alias -g C="| wc -l"
    alias -g S="| sort"
    alias -g U="| uniq"
    alias -g count="| wc -l"
    alias -g NO="1> /dev/null"
    alias -g NE="2> /dev/null"
    alias -g NUL="&> /dev/null"
    alias -g BG="&;disown"
    alias -g COL="| column -t"
    alias -g CLIP="| xclip -i -selection primary -f | xclip -i -selection clipboard"
fi

# File default aliases
if alias -s 2>/dev/null; then
    alias -s pdf="open"
    alias -s zip="unzip -l"
    alias -s rar="unrar l"
    alias -s tar="tar tf"
    alias -s gz="tar tf"
    alias -s jar="java -jar"
    alias -s git="git clone --recursive"
fi

alias ..la="cd ..;la"
alias ..ll="cd..;ll"
alias ..l="..ll"

alias l=ll
alias ls='ls --color=auto'
alias ll="ls -lFh  --group-directories-first"
alias la="ls -lAFh --group-directories-first"
alias lt='ls -lAFh --sort=time'
alias lsz='ls -lAFh --sort=size'
alias al=la # No, I don't need the Mono Assembly Linker

alias md="mkdir -p"
alias rd="rmdir -p"
alias -- -='cd -'
alias cdt='cd `mktemp -d`'

alias svi=sudoedit
alias svim=sudoedit
# This will enable us to use aliases in sudo.
# (If alias finishes with a space or tab, the shell will check if the next command is also aliased.)
# Source: https://github.com/mayah/home/blob/master/.zsh/zshrc.d/alias.zsh
alias sudo='sudo '
alias open=xdg-open

# Command rewrites
alias rm='rm -i'
alias mv='mv -i'
alias cp='cp -ir'
alias scp='scp -r'
alias dd='dd status=progress'
alias ssh="ssh -tt"
alias wget="wget --hsts-file=$XDG_DATA_HOME/wget/hsts-file"
alias vi=vim
alias grip='grip --user=frebib --pass=$GRIP_API_KEY'
alias acme.sh='$XDG_CONFIG_HOME/acme.sh/acme.sh --home $XDG_CONFIG_HOME/acme.sh --config-home $XDG_CONFIG_HOME/acme.sh --log $XDG_CONFIG_HOME/acme.sh/acme.sh.log'
alias acmesh='$XDG_CONFIG_HOME/acme.sh/acme.sh --home $XDG_CONFIG_HOME/acme.sh --config-home $XDG_CONFIG_HOME/acme.sh --log $XDG_CONFIG_HOME/acme.sh/acme.sh.log'
alias alpine-sdk='docker run -ti --rm \
    -e USER \
    -e UID="$(id -u)" \
    -e PWD \
    -e HOME \
    -w $PWD \
    -v $PWD:$PWD \
    -v ~/.abuild:$HOME/.abuild \
    -v ~/.abuild/distfiles:/var/cache/distfiles \
    frebib/alpine-sdk:edge'
alias abuild='alpine-sdk abuild'
alias abuild-sign='alpine-sdk abuild-sign'
alias apk='alpine-sdk apk'
alias hddtemps='find /sys/block/ -name sd\* | sed "s|sys/block|dev|g" | sudo xargs hddtemp | sort -t: -k3'
alias stripansi='sed -r "s/\x1B\[(([0-9]+)(;[0-9]+)*)?[m,K,H,f,J]//g"'
alias calc="noglob bc -l <<<" # noglob allows * without quoting

exists pacman && \
    alias pacman='pacman --color=always'
exists yay && \
    alias p='yay'
exists tree && \
    alias tree='tree --dirsfirst -C -F'
exists make && \
    alias make="make -j$(nproc)"
exists gopass && \
    alias pass='gopass'
echo | busybox grep --color '' >/dev/null 2>&1 && \
    alias grep='grep --color'
vim --version 2>/dev/null | command grep -q +clientserver && \
    alias vim="vim --servername vim -p"

# Function aliases
env() { command env $@ | stripansi | sort; }
mcd(){ mkdir -p -- $@ && cd -- $@; }
randstr() { tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w $1 | head -n 1; }

# System aliases
alias sc="systemctl"
alias ssc="sudo systemctl"
alias scu="systemctl --user"
alias j=journalctl
alias ps='ps aux'
alias catn='tail -n +1 --'
alias kl='killall -s 9'
alias chx='chmod +x'

# Git Aliases
alias g=git
alias ginit='git init'
alias gignore='$EDITOR .gitignore'
alias gitc='$EDITOR $XDG_CONFIG_HOME/git/config'
alias ggignore='$EDITOR $XDG_CONFIG_HOME/git/gitignore'
alias gcl="git clone --recursive"
alias gco="git checkout"
alias gcom="git checkout master"
alias ga="git add"
alias gap="git add -p"
alias gau="git add -u"
alias gaN="git add -N"
alias gaa="ga -A"
alias grm="git rm"
alias gc="git commit"
alias gcm="gc -m"
gcmst() { git stash -u -k && git commit -m "$1" && git stash pop; }
alias gca="git commit --amend --date=\"$(date -R)\""
alias gcn="git commit --no-edit"
alias gcan="gca --no-edit"
alias gcam="gca -m"
alias gst="git status"

alias gm="git merge"
alias gma="git merge --abort"
alias grb="git rebase"
alias grba="grb --abort"
alias grbc="grb --continue"
alias grbsk="grb --skip"
alias grbsh="grb --show-current"
alias grbom="git rebase origin/master"

alias gf="git fetch"
alias gp="git push"
alias gpf="gp --force"
alias gpsu="git push --set-upstream"
alias gpoH="git push origin HEAD"
alias gpsuom="git push --set-upstream origin master"
alias gpall="git remote | xargs -L1 git push"
alias gl="git pull --rebase"
alias glp="gl && gp"
alias gd="git diff --patch-with-stat"
alias gdni="gd --no-index"
alias gds="gd --staged"
alias gsh="git show --format=fuller --patch-with-stat"
alias glg="git log --color --format=fuller --stat"
alias glgp="git log --color --format=fuller --patch-with-stat"
alias glog="git log --color --oneline --decorate --graph"

alias grst="git reset"
alias gundo="git reset --keep @~1"
alias gclean="git clean"
alias gbr="git branch"
alias gtg="git tag"
alias gbl="git blame"
alias gr="git remote"
alias grv="git remote -v"
alias gra="gr add"
alias grr="gr rm"
alias grao="gra origin"
alias grro="grr origin"

alias gsta='git stash'
alias gstd='gsta drop'
alias gstl='gsta list --stat --color'
alias gstp='gsta pop'
alias gstv="gsta show -p stash@{0}"

# Docker aliases
alias d=docker
alias dps="docker ps --format='table {{.ID}}\t{{.Image}}\t{{.Label \"org.label-schema.version\"}}\t{{.Networks}}\t{{.RunningFor}}\t{{.Status}}\t{{.Names}}' | sed '1s/version/VERSION/'"
alias dpsa="docker ps -a --format='table {{.ID}}\t{{.Image}}\t{{.Label \"org.label-schema.version\"}}\t{{.Networks}}\t{{.RunningFor}}\t{{.Status}}\t{{.Names}}' | sed '1s/version/VERSION/'"
alias dnets="docker network ls -q | xargs docker inspect | jq '.[] | select(.Name != \"host\" and .Name != \"none\") | [.] | map(.Name + \"\t\" + (.IPAM.Config | map(.Subnet) | join(\"\t\")))[]' -r | sort -V -k2,3 | column -t"
daddrs() { docker inspect ${1:-bridge} | jq '.[0].Containers | map(.Name + "\t" + .IPv4Address + "\t" + .IPv6Address)[]' -r | sort -V -k2,3 | column -t; }
alias din='docker inspect'
alias drm='docker rm'
alias drmi='docker rmi'
alias dim='docker images'
alias dbl='docker build --pull'
alias dbl.='docker build --pull .'
alias drun='docker run -ti'
alias dkl='docker kill'
dklrm() { docker kill $@ ; docker rm $@; }
alias dst='docker stop'
alias drst='docker restart'
alias dnet='docker network'
alias dvol='docker volume'
alias dlg='docker logs -f'
alias dalpine='docker run -ti --rm spritsail/alpine /bin/sh'
alias drm-stopped='docker container prune'
alias drmi-untag='docker image prune'
alias dprune='docker system prune -f'
dsh() { do_dsh 2 exec $@; return $?; }
_dsh() { __docker_complete_running_containers $@; }
drsh() { do_dsh 4 run --rm --entrypoint= $@; return $?; }
_drsh() { __docker_container_subcommand $@; }
do_dsh() {
    local minargs=$1
    shift
    if [ $# -lt $minargs ]; then
        echo "Usage: ${funcstack[2]} [user@]container [program [args]]" >&2
        return 64
    fi

    local dowhat="$1"
    local docker_args=()
    shift

    while [ "${1:0:1}" = '-' ]; do
        if [ "${1:0:2}" != '--' ]; then
            docker_args+=("$1")
            shift
        fi
        docker_args+=("$1")
        shift
    done

    local user="$(echo "$1" | cut -d'@' -f1 -s)"
    local prog="${@:2:$#}"
    local usercmd=""
    if [ -z "$user" ]; then
        host="$1"
    else
        host=`echo $1 | cut -d'@' -f2 -s`
        usercmd="--user=$user"
    fi

    if [ "$dowhat" = 'exec' -a -z "$(docker ps -q -f name="$host")" <&- ]; then
        echo "No such container $host" >&2
        return 5
    fi

    if [ -z "$prog" ]; then
        shell_args=()
        if [ "$dowhat" = 'run' ]; then
            shell_args=(--rm --entrypoint=)
        fi
        for shell in bash sh; do
            shell_path="$(set -o pipefail; docker $dowhat ${shell_args[@]} "$host" which "$shell" <&- | sed 's|[\r\n]||g')"
            retval=$?
            if [ $retval -eq 0 ]; then
                prog="$shell_path"
                break
            elif [ $retval -ge 125 ]; then
                return
            fi
        done
        if [ -z "$prog" ]; then
            echo "Warning: No shell found in path.. trying /bin/sh" >&2
            prog=/bin/sh
        fi
    fi

    docker $dowhat ${docker_args[@]} -ti $usercmd $host $(xargs <<< $prog)
}

alias dc='docker-compose'
alias dm='docker-machine'
dmc() { eval $(docker-machine env $1); }

# ZFS aliases
alias zfs='sudo zfs'
alias zpool='sudo zpool'
alias z=zfs
alias zp=zpool
zl() { (set -o pipefail; command zfs list $@ | grep -Ev 'docker/[0-9a-f]{64}' | column -t -R 2,3,4); return $?; }
_zl() { _zfs "list $@"; }

# General Aliases
alias ssha='eval `ssh-agent` ; ssh-add'
alias aliases="$EDITOR $DOTFILES/aliases ; exec zsh"
alias vimrc="$EDITOR $VIMRC"
alias zshrc="$EDITOR ${ZDOTDIR:-$HOME}/.zshrc ; exec zsh"
alias gitrc="$EDITOR $XDG_CONFIG_HOME/git/config"
alias xinitrc="$EDITOR $XDG_CONFIG_HOME/X11/xinitrc"
alias xresources="$EDITOR $XDG_CONFIG_HOME/X11/xresources ; xrdb merge $XDG_CONFIG_HOME/X11/xresources"
alias sshc="$EDITOR ~/.ssh/config"
alias dotfiles="cd $DOTFILES"
alias i3c="$EDITOR $XDG_CONFIG_HOME/i3/config; systemctl --user reload i3"
alias polybarc="$EDITOR $XDG_CONFIG_HOME/polybar/config; systemctl --user restart polybar@i3bar"

alias sf=screenfetch
alias nf=neofetch
alias rot13="tr '[A-Za-z]' '[N-ZA-Mn-za-m]'"

# Networking aliases
alias ipa="ip a"
alias addrs="ip a | grep inet | grep -ve fe80 -e '127\\.0\\.0\\.1/8' -e '::1/128' | sort -n | sed 's/^\\s*//'"

# vim: ft=sh