#!/bin/bash
# This script installs relevant system dependencies for ./build.sh to compile JNI bindings.
# Each linux distribution has a different package manager, so the script has to be adapted
# for each distribution.
# To add your distribution:
# 1) Identify your distribution ID via:
#    lsb_release -a
# 2) Add a case to the case statment below.
# 3) Add a function to handle your distribution.


func_echo_plus () {
	# Echo function that prints output in green to distinguish it from sub-shell output.
	GREEN='\033[0;32m'
	NC='\033[0m' # No Color
	echo -e "${GREEN}${@}${NC}"
}

func_echo_error () {
	# As above, but in red. Also pre-appends '***' to output.
	RED='\033[0;31m'
	NC='\033[0m' # No Color
echo -e "${RED}*** ${@}${NC}"
}

func_configure_fedora () {
	FEDORA_VERSION=$(cat /etc/system-release | cut -f3 -d" ")
	if [ "$FEDORA_VERSION" -lt "21" ]; then
		INSTALL_CMD="yum"
	else
		INSTALL_CMD="dnf"
	fi


	func_echo_plus "Installing C Development Tools"
	set -x
	sudo $INSTALL_CMD -y groups install "C Development Tools and Libraries"

	func_echo_plus "Installing Java 8 development packages that include jni.h for JNI bindings. Update this script to '9' when java 9 comes out"
	sudo $INSTALL_CMD -y install java-1.8.0-openjdk-devel.x86_64

	func_echo_plus "Installing Gtk2 and Gtk3 development packages"
	sudo $INSTALL_CMD -y install gtk3-devel gtk2-devel

	func_echo_plus "Installing Gnome development packages"
	sudo $INSTALL_CMD -y install libgnome-devel.x86_64 libgnomeui-devel.x86_64

	func_echo_plus "Installing X11 Development libraries. Someday when wayland takes over these will not be needed..."
	# Deals with error: "#include <X11/Intrinsic.h>, #include <X11/extensions/XTest.h>" build errors)
	sudo $INSTALL_CMD -y install libXt-devel libXtst-devel

	func_echo_plus "Install Mesa (OpenGL headers)"
	# Deals with error: "/usr/bin/ld: cannot find -lGLU collect2: error: ld returned 1 exit status"
	sudo $INSTALL_CMD -y install mesa-libGLU-devel

	func_echo_plus "Done"
}


LINUX_DISTRO=$(cat /etc/system-release | cut -f1 -d" ")
if [ "$LINUX_DISTRO" = "" ]; then
	func_echo_error "Error, could not identify your distribution"
	exit
fi

DISTRO_NOT_KNOWN_MSG="
Currently the script doesn't know how to automatically configure your distro : $LINUX_DISTRO
Consider updating this script for your distribution.
In general, You should install the following packages:
 - C Development tools (usually comes in a 'group install')
 - java-*-openjdk-devel  (depending on current version of java)
 - gtk2-devel gtk3-devel
 - libgnome-devel libgnomeui-devel
 - libXt-devel libXts-devel
 - mesa-libGLU-devel
"


case "$LINUX_DISTRO" in
"Fedora")
	func_echo_plus "Fedora found. Installing packages..."
	func_configure_fedora
	;;
"YOUR_DISTRIBUTION")
	echo "YOUR_DISTRIBUTION HERE"
	;;
*)
	func_echo_error "$DISTRO_NOT_KNOWN_MSG"
	;;
esac


# check if .classpath exists in swt project.
if [ -a "../org.eclipse.swt/.classpath" ]; then 
	func_echo_plus ".classpath found, you are good to go";
else 
	func_echo_error "Warning: ../org.eclipse.swt/.classpath not found. Normally you rename ../org.eclipse.swt/.classpath_gtk to ../*/.classpath manually"
fi
