#!/bin/bash

set -eu

function usage
{
	retval="$1"
	case "$retval" in
		0)
			;;
		*)
			exec 1>&2
			;;
	esac
	echo "Usage: $0 --help"
	exit "$retval"
}

while [ "$#" -ge 1 ]
do
	case "$1" in
		--help|-h)
			usage 0
			;;
		*)
			echo "$0: unrecognized option: $1" 1>&2
			usage 1
			;;
	esac
	shift
done

function is_debian_based
{
	[ -e /etc/debian_version ]
}

function is_redhat_based
{
	[ -e /etc/redhat-release ]
}

function is_arch_based
{
	[ -e /etc/arch-release ]
}

if is_debian_based
then
	if type -path apt > /dev/null 2>&1
	then
		debian_pi=apt
	elif type -path apt-get > /dev/null 2>&1
	then
		debian_pi=apt-get
	else
		echo "$0: This appears to be a Debian-based system, but I do not see apt or apt-get" 1>&2
	fi
elif is_redhat_based
then
	if type -path dnf > /dev/null 2>&1
	then
		redhat_pi=dnf
	elif type -path yum /dev/null 2>&1
	then
		redhat_pi=yum
	elif type -path microdnf > /dev/null 2>&1
	then
		redhat_pi=microdnf
	else
		echo "$0: This appears to be a Redhat-based system, but I do not see yum, dnf or microdnf" 1>&2
	fi
elif is_arch_based
then
	arch_pi=pacman
else
	echo "$0: This does not appear to be a Debian-based, Redhat-based, or Arch-based Linux.  We'll do what we can." 1>&2
fi

preflight_good=True

case "$(whoami)" in
	root)
		# Good, we're root. We have access to /usr/local and /usr/share
		;;
	*)
		echo "$0: preflight check: you are not root.  Please sudo or su to root and re-run this script" 1>&2
		preflight_good=False
		;;
esac

case "$(uname -s)" in
	Linux)
		# Good, we're on a Linux.
		;;
	*)
		echo "$0: preflight check: This is not a Linux operating system.  Giving up." 1>&2
		exit 1
		;;
esac

if ! type wget > /dev/null 2>&1
then
	echo "$0: preflight check: no wget command found" 1>&2
	if is_debian_based && [ "$debian_pi" != "" ]
	then
		echo "You can install it with: $debian_pi install wget" 1>&2
	elif is_redhat_based && [ "$redhat_pi" != "" ]
	then
		echo "You can install it with: $redhat_pi install wget" 1>&2
	elif is_arch_based && [ "$arch_pi" != "" ]
	then
		echo "You can install it with: $arch_pi -S wget" 1>&2
	else
		echo "I do not know how to install it on this OS" 1>&2
	fi
	preflight_good=False
fi

if ! type base64 > /dev/null 2>&1
then
	echo "$0: preflight check: no base64 command found" 1>&2
	if is_debian_based && [ "$debian_pi" != "" ]
	then
		echo "You can install it with: $debian_pi install coreutils" 1>&2
	elif is_redhat_based && [ "$redhat_pi" != "" ]
	then
		echo "You can install it with: $redhat_pi install coreutils" 1>&2
	else
		echo "I do not know how to install it on this OS" 1>&2
	fi
	preflight_good=False
fi

if ! type java > /dev/null 2>&1
then
	echo "$0: preflight check: no java command found" 1>&2
	if is_debian_based && [ "$debian_pi" != "" ]
	then
		echo "You can install it with: $debian_pi install default-jre" 1>&2
	elif is_redhat_based && [ "$redhat_pi" != "" ]
	then
		echo "You can install it with: $redhat_pi install java-1.8.0-openjdk-devel" 1>&2
	elif is_arch_based && [ "$arch_pi" != "" ]
	then
		echo "You can install it with: $arch_pi -S jre-openjdk" 1>&2
	else
		echo "I do not know how to install it on this OS" 1>&2
	fi
	preflight_good=False
fi

if ! type desktop-file-install > /dev/null 2>&1
then
	echo "$0: preflight check: no desktop-file-install command found" 1>&2
	if is_debian_based && [ "$debian_pi" != "" ]
	then
		echo "You can install it with: $debian_pi install desktop-file-utils" 1>&2
	elif is_redhat_based && [ "$redhat_pi" != "" ]
	then
		echo "You can install it with: $redhat_pi install desktop-file-utils" 1>&2
	else
		echo "I do not know how to install it on this OS" 1>&2
	fi
	preflight_good=False
fi

if ! [ -d /usr/share/applications ]
then
	echo "$0: preflight check: no /usr/share/applications directory found; this may not be a supported Linux variant" 1>&2
	preflight_good=False
fi

case "$preflight_good" in
	True)
		;;
	False)
		echo "$0: preflight check failed, please install dependencies and/or sudo/su to root as directed above" 1>&2
		exit 1
		;;
	*)
		echo "$0: internal error: \$preflight_good has a strange value: $preflight_good" 1>&2
		exit 1
		;;
esac

mkdir -p /usr/local/bin /usr/local/lib

wget -q -O - https://files.gokgs.com/javaBin/cgoban.jar > /usr/local/lib/cgoban.jar.temp
mv /usr/local/lib/cgoban.jar.temp /usr/local/lib/cgoban.jar

cat << \EOF > /usr/local/bin/kgs
#!/bin/bash

java -jar /usr/local/lib/cgoban.jar "$@"
EOF

chmod 755 /usr/local/bin/kgs

(
	set -eu
	cd /usr/local/bin && ln -sf kgs cgoban3
)

base64 -d << \EOF > /usr/local/lib/cgoban-icon.jpeg
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP
ERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e
Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCABAAEADASIA
AhEBAxEB/8QAGwAAAgMBAQEAAAAAAAAAAAAABggEBQcAAgP/xAA5EAABAwIDBQUGBAYDAAAAAAAB
AgMEBREABiEHEjFBYRMyUXGBCCIjkaHBFBVCgiQzUmKisUTR4f/EABgBAAMBAQAAAAAAAAAAAAAA
AAAEBgID/8QAHxEAAgIBBAMAAAAAAAAAAAAAAQMAAgQFEiExEUGh/9oADAMBAAIRAxEAPwDxiFVK
lHp7YLpKnFdxtPeV/wCY6sT0U+IXSN5xR3W0/wBSv+sV1Fpbs94yJBLjizck4RUrfyepD6VpRyzv
vxQfZTVOp12cCGFmG0eCWu96q4/K2A+s0qW7dUh150+K1lX+8PRQtkeW26HDRNpbC5YYR2xVvXK7
C99fHGWbfcnUShRIUan0xmO+6tS1LSSTugAW1PMn6YcrUV6EsU4yUDwuoEUKS1NgOb8SS/HUOBac
KT9MWVE2l5lo7qUTHU1SMOKH9F26LGt/O+CCrUOTNntwYMZyRJeXuNttpupRPIY2TIOwvLNNom9m
uAzVam/ZTgUtQbY/sTYi/U/LqWqLdiDsVLx4ZUGDGTc20fNMQu094pfQPix3NHG/TmOowQYj7RoG
yrZdATWBQI7dUUFCFHYeWl11VrH9WiddSdPM2GKfIWZ4ua6A3UWEhp5J3JDN79mscvI8QcJtVs5H
UjtV0o4h305ofkqKzPE7M62Qq7UU9mkf3fqPz09MatsmgN1DMVMhlAWlyQjfT4pBur6A4XqiVPtZ
zkhR951xSz5k3ww/s6zO0zSJY1ERhSwfAq90fQqw5Wu0ASxxkhCarHoRrcYBt/ccqudEU2K2p15l
hDKUJ1uo3X/pQ+WNgOZGQ3fcG954AfwrLdUm1R0h6dMdUtThHcSTohPQC3nbGp3gnkfJcPLiVTX0
ofqjqbLdtcNj+lP3PPFLtj2lUvIVKO9uS6s8k/hYYV/mvwT9TwHMiTtlz6Mk0NDrMZT86XvIjbyT
2aCALqUelxpzwmWbavNrFTkVGoynJMp9RU44s3JP2HTlghKzONfquZq5IrFZlrky3jqo8EjklI5J
HIDBBsOrq6TnVqEtdo1RHYLBOm/qUHzvp+7AU+bk46myVQ6nFmINlMPIcSR4pIP2xm1dwInDJSHp
ss+xDJl9cCovxFkhTDqmyD4pJH2w0nstNKVlao1Zf/IkhlBPghN7/NZ+WFt2yUpyj5xcmISRGqA7
ZB5b/BY876/uw1+wunmj7J6BHULOPRhKX43dJc18goD0wVtuAMMZwemrB7EPJ9QjwojsuXIQxHZS
VuOLVZKQOZOBTJefqLnCRUWaWtYVDWAA5oXEHgsDwvcfK9r2wB+1ZX/y3IMWnoXZyoTEpIvxQgFR
/wAtzC87PM8yMpZwh1ltSlMpV2cpsH+YyrvDz5jqBjU7xutqeWmc35OmUdW6mQU9pFcP6HU90+R1
B6E4RSspfizH4kptTT7Lim3W1CxSoGxB9cP9Hnx50JmbEeS9HfbS404k6KSoXBHmDhY/avyaIVWa
zjT2rR5pDU0JGiXgPdX+4Cx6p64ITB3FXOPrTIy5tSiw0C633kNJHVSgPviOTfB7sNoS6tnRqatF
41NHbrNtN/gged9f24za20EzhlOCE2YfQm354yzDzVRFU+SotLSoLZeAuW1Dn5EXBGDSdtg2c0F/
8ol1lyG7FSlvsVQJHugCwsQixFuYNsVGB/OmUaPmuGGaiyUvIHwZDejjfrzHQ4TU3ZwepHaVqpxD
svzQ/JnPtLbQKPnOvUpOX5xmU+FGUS52S2/irV7wssA8EI1tzxkinieeDXM+yrNFJcUuEyKrGHBc
fv26oOt/K+AqZBnwllEyFJjKHEOtKQR8xhythboyxTkpePK7Azedgu1+j0PKzlAzZUFxkRF3gvdi
ty7arkoO6CRunUdDblguzZtT2V5iy/Nos+vFyNLaLav4F+6TyUPc4g2I6jCsQ4M6asIhw5ElZ4Ja
aUs/QYNcsbKcz1ZxK5rKaVGPFcjv26IGt/O2C1hXswdkpQPLLAQSp9IlVOuCk0gfjnFulDS20kBa
Qe/rYpFtdbW54ZjIGWI2VMvtU5khx9R7SS9b+Y4ePoOAx2S8oUfKkMs05kqfWPjSXNXHPXkOg0wQ
4Ta3fwOpHarqpyzspxQfZ//Z
EOF

cat << \EOF > /usr/local/lib/cgoban3.desktop
[Desktop Entry]
Comment=Log into KGS or edit SGF files with cgoban3
Terminal=false
Name=cgoban3
Exec=/usr/local/bin/cgoban3
Type=Application
Icon=/usr/local/lib/cgoban-icon.jpeg
Categories=Game;BoardGame
EOF

desktop-file-install --dir=/usr/share/applications /usr/local/lib/cgoban3.desktop

echo "It looks like the install was successful.  Check your desktop environment's menus to see if cgoban3 is now under Games."
echo 'Alternatively, you can start cgoban3 with the "kgs" or "cgoban3" commands at a shell prompt.'
exit 0