#!/bin/sh -e
#
#    byobu-select-profile
#    Copyright (C) 2008 Canonical Ltd.
#
#    Authors: Dustin Kirkland <kirkland@byobu.org>
#             Nick Barcet <nick.barcet@ubuntu.com>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, version 3 of the License.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.


# If you change any strings, please generate localization information with:
#	./debian/rules get-po

PKG="byobu"
[ -r "$HOME/.byoburc" ] && . "$HOME/.byoburc"
[ -z "${BYOBU_PREFIX}" ] && export BYOBU_PREFIX="@prefix@" || export BYOBU_PREFIX
. "${BYOBU_PREFIX}/lib/${PKG}/include/common"

TEXTDOMAIN="$PKG"

COLORS="default_light \
	default_dark \
	white \
	black \
	grey \
	dark_grey \
	light_grey \
	blue \
	light_blue \
	cyan \
	light_cyan \
	green \
	light_green \
	purple \
	light_purple \
	red \
	light_red \
	yellow \
	brown"

# Find a hash utility
for i in md5sum md5 sha512sum sha256sum sha1sum shasum shasum5.12 shasum5.10; do
	if eval $BYOBU_TEST $i >/dev/null 2>&1; then
		HASH="$i"
		break
	fi
done

usage () {
    cat <<EOT
Usage: $0 [OPTION]
    -l,--list                list available profiles
    -b,--background COLOR    set the background color
    -f,--foreground COLOR    set the foreground color
    -h,--hostname            set the colors based on a hash of the hostname
    -i,--ip                  set the colors based on a hash of the ip
    -r,--random              set the colors randomly
    --help                   this help
EOT
}

# Initialize variables
FILE="$BYOBU_CONFIG_DIR/color"
PROFILE="$BYOBU_CONFIG_DIR/profile"
[ -r "$PROFILE" ] || ln -sf $BYOBU_PREFIX/share/$PKG/profiles/common "$PROFILE"
selected=-1
color=

listprofiles() {
	# Display list of profiles, one per line
	for x in $COLORS; do
		echo "$x"
	done
}

getletter() {
	count=$(echo "$1" | wc -c)
	if [ "$count" = "2" ]; then
		echo "$1"
		return
	fi
	color="$1"
	case $color in
		default_light) letter="d";;
		default_dark)  letter="D";;
		black)         letter="k";;
		dark_grey)     letter="K";;
		blue)          letter="b";;
		light_blue)    letter="B";;
		cyan)          letter="c";;
		light_cyan)    letter="C";;
		green)         letter="g";;
		light_green)   letter="G";;
		purple)        letter="m";;
		light_purple)  letter="M";;
		red)           letter="r";;
		light_red)     letter="R";;
		grey)          letter="w";;
		light_grey)    letter="W";;
		white)         letter="w";;
		yellow)        letter="Y";;
		brown)         letter="y";;
		*)             letter="d";;
	esac
	echo "$letter"
}

setcolor_screen() {
	which="$1"
	color="$2"
	[ -r $FILE ] && . $FILE
	if [ "$which" = "foreground" ]; then
		FOREGROUND=$(getletter "$color")
	else
		BACKGROUND=$(getletter "$color")
	fi
	[ "$MONOCHROME" = "1" ] || MONOCHROME=0
	printf "FOREGROUND=$FOREGROUND\nBACKGROUND=$BACKGROUND\nMONOCHROME=$MONOCHROME" > $FILE
	touch "$BYOBU_RUN_DIR/reload-required"
	$BYOBU_BACKEND -X at 0 source "$BYOBU_CONFIG_DIR/profile"
}

get_contrast() {
	# See section 2.2: http://www.w3.org/TR/AERT#color-contrast
	local awk="awk"
	if eval $BYOBU_TEST gawk >/dev/null 2>&1; then
		awk="gawk"
	fi
	local hex="$(echo "$1" | sed -e 's/^[\\#]*//' -e "s/\(..\)\(..\)\(..\)/\1 \2 \3/")"
	local bright=$(echo $hex | $awk --non-decimal-data '{printf "%0.0f",(("0x"$1)*299+("0x"$2)*587+("0x"$3)*114)/1000}')
	if [ $bright -ge 130 ]; then
		_RET="black"
	else
		_RET="white"
	fi
}

setcolor_tmux() {
	if [ "$BYOBU_BACKEND" != "tmux" ]; then
		echo "WARNING: This functionality is only supported in Byobu with the tmux backend" 1>&2
	fi
	dark="$1"
	get_contrast "$dark"
	light="$_RET"
	accent="magenta"
	highlight="red"
	monochrome="0"
	printf "BYOBU_DARK=\"$dark\"\nBYOBU_LIGHT=$light\nBYOBU_ACCENT=$accent\nBYOBU_HIGHLIGHT=$highlight\nMONOCHROME=$MONOCHROME" > "$FILE".tmux
	tmux source "$BYOBU_PREFIX/share/byobu/profiles/tmuxrc"
}

if [ $# -eq 0 ]; then
	usage
else
	while true; do
		case "$1" in
			-b|--background)
				setcolor_screen "background" "$2"
				shift 2
			;;
			-f|--foreground)
				setcolor_screen "foreground" "$2"
				shift 2
			;;
			-h|--hostname)
				color=$(hostname | $HASH | head -c 6)
				setcolor_tmux "#$color"
				shift
				break
			;;
			-i|--ip)
				[ -r "$BYOBU_CONFIG_DIR/statusrc" ] && . "$BYOBU_CONFIG_DIR/statusrc"
				. $BYOBU_PREFIX/lib/$PKG/ip_address
				color=$(__ip_address t| $HASH | head -c 6)
				setcolor_tmux "#$color"
				shift
				break
			;;
			-l|--list)
				listprofiles
				shift
				break
			;;
			-r|--random)
				color=$(head -c 10 /dev/urandom | $HASH | head -c 6)
				setcolor_tmux "#$color"
				shift
				break
			;;
			*)
				usage
				exit 1
			;;
			--)
				shift
				break
			;;
		esac
		[ $# -eq 0 ] && break
	done
fi

exit 0

# vi: syntax=sh ts=4 noexpandtab
