#!/usr/bin/env bash
# ARCHIMAGE DEFAULTS
HERE="$(dirname "$(readlink -f $0)")"
export UNION_PRELOAD=$HERE
export JUNEST_HOME=$HERE/.junest
export PATH=$PATH:$HERE/.local/share/junest/bin
mkdir -p $HOME/.cache
if test -f /etc/resolv.conf; then
	ETC_RESOLV=' --bind /etc/resolv.conf /etc/resolv.conf ' # NEEDED TO CONNECT THE INTERNET
fi

# DOWNLOAD THE RUNTIME OF BOTTLES
if ! [ -d $HOME/.local/share/bottles/runtimes ]; then
	mkdir -p $HOME/.local/share/bottles/runtimes
	bottlesruntimedlurl=$(wget -q https://api.github.com/repos/bottlesdevs/runtime/releases -O - | grep browser_download_url | grep -i "runtime-" | cut -d '"' -f 4)
	wget -q $bottlesruntimedlurl -O Bottles-runtime.tar.gz
	tar xf ./Bottles-runtime.tar.gz -C $HOME/.local/share/bottles/runtimes/ 2> /dev/null
	rm -R -f ./Bottles-runtime.tar.gz
fi


# TRY TO CLONE THE INTERNAL STRUCTURE OF THE APPIMAGE (EXPERIMENTAL)
if ! [ -d $HOME/.local/share/bottles/junest ]; then
	mkdir -p $HOME/.local/share/bottles/junest
	rsync -av -f"+ */" -f"- *" "$HERE/.junest/" "$HOME/.local/share/bottles/junest/"
fi

# FIND THE VENDOR
VENDOR=$(glxinfo -B | grep "OpenGL vendor")
if [[ $VENDOR == *"Intel"* ]]; then
	export VK_ICD_FILENAMES="/usr/share/vulkan/icd.d/intel_icd.i686.json:/usr/share/vulkan/icd.d/intel_icd.x86_64.json"
	VENDORLIB="intel"
	export MESA_LOADER_DRIVER_OVERRIDE=$VENDORLIB
elif [[ $VENDOR == *"NVIDIA"* ]]; then
        NVIDIAJSON=$(find /usr/share -name "*nvidia*json" | sed 's/ /:/g')
	export VK_ICD_FILENAMES=$NVIDIAJSON
	VENDORLIB="nvidia"
	export MESA_LOADER_DRIVER_OVERRIDE=$VENDORLIB
elif [[ $VENDOR == *"Radeon"* ]]; then
	export VK_ICD_FILENAMES="/usr/share/vulkan/icd.d/radeon_icd.i686.json:/usr/share/vulkan/icd.d/radeon_icd.x86_64.json"
	VENDORLIB="radeon"
	export MESA_LOADER_DRIVER_OVERRIDE=$VENDORLIB
fi

# FIND LIBRARIES OF THE VENDOR
rm -R -f $HOME/.cache/hostdri2junest
VENDORLIBRARIES=$(find /usr/lib -name "*$VENDORLIB*.so*")
for arg in $VENDORLIBRARIES; do
	for var in $arg; do
		LIB=$(readelf -d "$var" | grep .so | sed 's:.* ::' | cut -c 2- | sed 's/\(^.*so\).*$/\1/' | uniq)
		find /usr/lib -name "*$LIB*" > $HOME/.cache/hostdri2junest
	done
done
echo "$VENDORLIBRARIES" >> $HOME/.cache/hostdri2junest

# FIND LIBRARIES ON THE HOST
DRIPATH=$(find /usr/lib -name dri)
VDPAUPATH=$(find /usr/lib -maxdepth 2 -name vdpau)
export LIBVA_DRIVERS_PATH=$DRIPATH
export GLPATH=/lib:/lib64:/lib/x86_64-linux-gnu:/usr/lib
export VULKAN_DEVICE_INDEX=1
export __GLX_VENDOR_LIBRARY_NAME=mesa

function _host_accelleration(){
	LLVM=$(find /usr/lib -name "*LLVM*")
	for arg in $LLVM; do
		for var in $arg; do
			echo "$var"
		done
	done

	MESA=$(find /usr/lib -name "*mesa*.so*")
	for arg in $MESA; do
		for var in $arg; do
			echo "$var"
		done
	done

	D3D=$(find /usr/lib -name "*d3d*.so*")
	for arg in $D3D; do
		for var in $arg; do
			echo "$var"
		done
	done

	EGL=$(find /usr/lib -name "libEGL*" | grep -v "libEGL_mesa")
	for arg in $EGL; do
		for var in $arg; do
			echo "$var"
		done
	done

	STDC=$(find /usr/lib -name "*stdc*.so*")
	for arg in $STDC; do
		for var in $arg; do
			echo "$var"
		done
	done

	SWRAST=$(find /usr/lib -name "*swrast*")
	for arg in $SWRAST; do
		for var in $arg; do
			echo "$var"
		done
	done

	VULKAN=$(find /usr/lib -name "*vulkan*")
	for arg in $VULKAN; do
		for var in $arg; do
			echo "$var"
		done
	done
}


# WHAT TO BIND? LISTS ALL THE LIBRARIES WE FOUND ABOVE IN THE FORMAT `/path/to/lib1:/path/to/lib2`
ACCELL_DRIVERS=$(echo $(echo "$(_host_accelleration)") | sed 's/ /:/g')
BINDLIBS=$(echo $(cat $HOME/.cache/hostdri2junest | uniq | sort -u) | sed 's/ /:/g')

rm -f $HOME/.cache/libbinds $HOME/.cache/libbindbinds
echo $ACCELL_DRIVERS | tr ":" "\n" >> $HOME/.cache/libbinds
echo $BINDLIBS | tr ":" "\n" >> $HOME/.cache/libbinds
for arg in $(cat $HOME/.cache/libbinds); do
	for var in "$arg"; do
		echo "$arg $(echo $arg | sed 's#/x86_64-linux-gnu##g' | cut -d/ -f1,2,3 )" >> $HOME/.cache/libbindbinds
		break
	done
done
sed -i -e 's#^#--bind / / --bind #' $HOME/.cache/libbindbinds

#BINDS=$(cat $HOME/.cache/libbinds | tr "\n" " ")
DEV_NVIDIA=$(find /dev -name nvidia*[0-9]* 2> /dev/null | head -1)
DRI_NVIDIA=$(find /usr/lib -name *nvidia_*.so | head -1)

# CHECK FOR LIBLLVM
#HOST_LIBLLVM=$(find /usr/lib -name "*libLLVM*" | grep -v ".so.")
#JUNEST_LIBLLVM=$(find $JUNEST_HOME/usr/lib -name "*libLLVM*" | grep -v ".so.")

# EXPORT LIBRARIES
#export LD_LIBRARY_PATH=/lib:/lib64:/lib/x86_64-linux-gnu:/usr/lib:$JUNEST_HOME/lib:$JUNEST_HOME/usr/lib
#export LD_PRELOAD=$DRIPATH/swrast_dri.so

# UNCOMMENT JUST ONE OF THE FOLLOWING "EXEC=" TO CHOOSE WHAT TO RUN BETWEEN BOTTLES OR GLXINFO
EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2- | sed -e 's|%.||g')
#EXEC="glxinfo"

function _exec(){
	if [[ $VENDOR == *"NVIDIA"* ]]; then
		$HERE/.local/share/junest/bin/junest -n -b "$BINDS\
			$ETC_RESOLV\
			--bind /dev/dri $JUNEST_HOME/dev/dri\
			--bind $DEV_NVIDIA $JUNEST_HOME/dev/nvidia\
			--bind /usr/lib/ConsoleKit $JUNEST_HOME/usr/lib/ConsoleKit\
			--bind $DRI_NVIDIA $JUNEST_HOME/usr/lib/dri/nvidia_dri.so\
			--bind /usr/libexec $JUNEST_HOME/usr/libexec\
			--bind /usr/lib/firmware $JUNEST_HOME/usr/lib/firmware\
			--bind /usr/lib/modules $JUNEST_HOME/usr/lib/modules\
			--bind /usr/lib/nvidia $JUNEST_HOME/usr/lib/nvidia\
			--bind /usr/lib/systemd $JUNEST_HOME/usr/lib/systemd\
			--bind /usr/lib/udev $JUNEST_HOME/usr/lib/udev\
			--bind $VDPAUPATH $JUNEST_HOME/usr/lib/vdpau\
			--bind /usr/lib/xorg $JUNEST_HOME/usr/lib/xorg\
			--bind /usr/share/bug $JUNEST_HOME/usr/share/bug\
			--bind /usr/share/dbus-1 $JUNEST_HOME/usr/share/dbus-1\
			--bind /usr/share/doc $JUNEST_HOME/usr/share/doc\
			--bind /usr/share/egl $JUNEST_HOME/usr/share/egl\
			--bind /usr/share/glvnd $JUNEST_HOME/usr/share/glvnd\
			--bind /usr/share/lightdm $JUNEST_HOME/usr/share/lightdm\
			--bind /usr/share/lintian $JUNEST_HOME/usr/share/lintian\
			--bind /usr/share/man $JUNEST_HOME/usr/share/man\
			--bind /usr/share/nvidia $JUNEST_HOME/usr/share/nvidia\
			--bind /usr/share/vulkan $JUNEST_HOME/usr/share/vulkan\
			--bind /usr/src $JUNEST_HOME/usr/src\
			" -- env __GLX_VENDOR_LIBRARY_NAME=mesa MESA_LOADER_DRIVER_OVERRIDE=zink GALLIUM_DRIVER=zink $EXEC "$@"
	else
		$HERE/.local/share/junest/bin/junest -n -b "\
			$ETC_RESOLV\
			--bind /usr/libexec $JUNEST_HOME/usr/libexec\
			--bind /usr/lib/modules $JUNEST_HOME/usr/lib/modules\
			--bind /usr/lib/xorg $JUNEST_HOME/usr/lib/xorg\
			--bind /usr/share/dbus-1 $JUNEST_HOME/usr/share/dbus-1\
			--bind /usr/share/glvnd $JUNEST_HOME/usr/share/glvnd\
			--bind /usr/share/vulkan $JUNEST_HOME/usr/share/vulkan\
			--bind /usr/src $JUNEST_HOME/usr/src\
			" -- $EXEC "$@"
	fi
}
_exec
