#!/usr/bin/env sh

if ! exist git; then
    return 1
fi

# print git version output and get raw version number by stripping prefix
git_version=$(git --version 2>/dev/null)
git_version="${git_version##git version }"

alias g='git'
if exist lazygit; then
    alias lg="lazygit"
fi

alias ga='git add'
alias gaa='git add --all'
alias gai='git add -i'

alias gc='git commit -v'
alias gc!='git commit -v --amend'
alias gcn!='git commit -v --no-edit --amend'

if version_at_least 2.23 "$git_version"; then
    alias gcm='git switch master 2>/dev/null || git switch main'
    alias gcd='git switch develop 2>/dev/null || git switch staging'
    gcb() {
        git switch "$@" 2>/dev/null || git switch -c "$@"
    }
else
    alias gcm='git checkout master 2>/dev/null || git checkout main'
    alias gcd='git checkout develop'
    alias gcb='git checkout -b'
fi
alias gco='git checkout'

alias gi='git ignore'

# normal diff
alias gd='git diff'
alias gds='git diff --staged'
# word-based diff (with custom word regex)
alias gdw='git diffword'
alias gdws='git diffword --staged'
# side-by-side diff
alias gdd='git diffside'
alias gdds='git diffside --staged'
# syntax-based diff
if exist difft; then
    alias gdy='git diffsyn'
    alias gdys='git diffsyn --staged'
fi
alias gdd='git diffside'
alias gdds='git diffside --staged'
# show last committed content
alias gdl='git last'

# show quick log overview
alias glg='git log --oneline --decorate --graph'
alias glga='git log --oneline --decorate --graph --remotes --all'
# show quick log overview - with dates
alias glgd="git log --graph --pretty=format:'%C(auto)%h%Creset %C(cyan)%ar%Creset%C(auto)%d%Creset %s'"
alias glgad="git log --graph --remotes --all --pretty=format:'%C(auto)%h%Creset %C(cyan)%ar%Creset%C(auto)%d%Creset %s'"
# show detailed log overview
alias glog='git log --stat'
# show detailed log overview with contents
alias gloog='git log --stat -p'

alias gf='git fetch'
alias gfa='git fetchall'
alias gl='git pull'

alias gpn='git push --dry-run'
alias gp='git push'
alias gpf!='git push --force'
alias gpm='git pushmerge'
alias gpa='git pushall'

alias grv='git remote -v'

alias grs='git restore --staged'
alias grs!='git restore'

alias grb='git rebase'
alias grbi='git rebase -i'
alias grbc='git rebase --continue'
alias grbm='git rebase master || git rebase main'

alias gst='git status'

alias gstp='git stash pop'
alias gstl='git stash list'
alias gstL='git stash list --stat'
if version_at_least 2.13 "$git_version"; then
    alias gsta='git stash push'
else
    alias gsta='git stash save'
fi

if exist git-bug; then
    gb() {
        if [ "$#" -eq 1 ]; then
            git bug show "$1"
        else
            git bug ls "$@"
        fi
    }
    alias gbt='git bug termui'

    alias gba='git bug add'
    alias gbm='git bug comment add'
    alias gbc='git bug status close'

    alias gbp='git bug push'
    alias gbl='git bug pull'
fi

unset -v git_version
