#!/hint/bash

######################################################################
# Set up colors and settings for all the things                      #
######################################################################
if [ -x "`which dircolors`" ]; then
	eval "$(dircolors -p | cat - "${XDG_CONFIG_HOME}/dir_colors" |
		dircolors -b -)"
	alias ls='ls -1v --color=auto'
	alias dir='dir -v --color=auto'
	alias vdir='vdir -v --color=auto'

	for xgrep in ${PATH//:/\/*grep }/*grep; do
		if [ -f "$xgrep" ]; then
			xgrep=$(basename "$xgrep")
			if [ "$xgrep" != pgrep ]; then
				alias $xgrep="$xgrep --color=auto"
			fi
		fi
	done
	unset xgrep

	wdiff() {
		if [[ -t 1 ]]; then
			local old new off
			if type colordiff &>/dev/null; then
				eval "$(colordiff <(echo old) <(echo new)|sed -rn 's@(.*)[<>] (old|new)(.*)@\2='\''\1'\''\noff='\''\3'\''\n@p')"
			else
				new="$(tput setaf 2)"
				old="$(tput setaf 1)"
				off="$(tput sgr0)"
			fi
			command wdiff \
				-w "$old[-" \
				-x "-]$off" \
				-y "$new{+" \
				-z "+}$off" \
				"$@"
		else
			command wdiff "$@"
		fi
	}

	chardiff() {
		if [[ -t 1 ]]; then
			local old new off
			if type colordiff &>/dev/null; then
				eval "$(colordiff <(echo old) <(echo new)|sed -rn 's@(.*)[<>] (old|new)(.*)@\2='\''\1'\''\noff='\''\3'\''\n@p')"
			else
				new="$(tput setaf 2)"
				old="$(tput setaf 1)"
				off="$(tput sgr0)"
			fi
			command chardiff \
				-w "$old[-" \
				-x "-]$off" \
				-y "$new{+" \
				-z "+}$off" \
				"$@"
		else
			command chardiff "$@"
		fi
	}

	diff() {
		if [[ -t 1 ]]; then
			(
				set -o pipefail
				command diff "$@" | colordiff
			)
		else
			command diff "$@"
		fi
	}

	diffstat() {
		if [[ -t 1 ]]; then
			command diffstat -C "$@"
		else
			command diffstat "$@"
		fi
	}
else
	alias ls='ls -1v'
	alias dir='dir -v'
	alias vdir='vdir -v'
fi

######################################################################
# Set up the standard aliases for ls                                 #
######################################################################
alias ll='ls -l'
alias la='ls -a'
alias l='ls -CF'

######################################################################
# Some preferences for miscellaneous stuff                           #
######################################################################
#alias rm='gvfs-trash'
alias tree='tree --charset utf8'
alias cd=pushd
alias gitk='gitk --all --date-order'
alias mv='mv -i'
alias bc='bc -q'

alias userctl='systemctl --user'
alias journalctl='journalctl --no-hostname' # I know what host I'm on
alias datetimectl=timedatectl # I forget which it is

######################################################################
# These are actually functions :P                                    #
######################################################################
term-title() {
	local fmt=''
	case "$TERM" in
		screen|tmux) fmt='\ek%s\e\\';;
		xterm*|rxvt*) fmt='\e]0;%s\a';;
	esac
	printf "$fmt" "$*"
}
mvln() {
	local name=mvln
	local verbing=moving
	_cpln "$@"
}
cpln() {
	local name=cpln
	local verbing=copying
	_cpln "$@"
}
_cpln() {
	if [[ $# -lt 2 ]]; then
		libremessages error 'Usage: %s FILES... DEST' "$name"
		return 1
	fi
	declare -i i=1
	while [[ $i -lt $# ]]; do
		local src dst target link
		src="${!i}"
		dst="${!#}"
		if [[ ! -L "$src" ]]; then
			libremessages error 'Not a soft link: %s' "$src"
			return 1
		fi
		if [[ -d "$dst" ]]; then
			link="$dst/${src##*/}"
		else
			link="$dst"
		fi
		target=$(readlink -f -- "$src") || return 1
		ln -srT -- "$target" "$link"
		# using `cmp` instead of `[ "$src" -ef "$link" ]` has
		# the use-case where "$link" was a pre-existing link
		# to a duplicate of "$src".
		if ! cmp -- "$src" "$link"; then
			libremessages error 'Failed %s link: %s -> %s' "$verbing" "$src" "$link"
			return 1
		fi
		if [[ "$name" = mvln ]]; then
			rm -f -- "$src"
		fi
		i+=1
	done
}
jarls() {
	jar tf "$1" |
	    sed -n 's/\.class$//p' |
	    LC_ALL=C sort |
	    xargs -r -d $'\n' javap -classpath "$1"
}
tarls() {
	local file
	for file in "$@"; do
		bsdtar tf "$file" | sed "s|^|$file:|"
	done
}
jarmain() {
	jarls "$1" 2>/dev/null |
	    grep -E '(^[a-z]|public static void main\(java\.lang\.String\[\]\))' |
	    grep -B1 '^ '
}
calc() {
	bc <<<"$*"
}