#!/usr/bin/env bash
# Author: Mikhail Tergoev (linux-gaming.ru)
# Adapted for Flatpak: Boris Yumankulov (Boria138)
# License MIT
########################################################################
unset PW_AUTOPLAY PW_SET_LANG PW_SILENT_INSTALL
export port_ver=1.7.3
########################################################################
cd "$(dirname "$(readlink -f "$0")")"
script_path="$(pwd)"
def_path="${HOME}/PortProton"
########################################################################
fatal () {
	echo -e "\n${1}\n"
	exit 1
}
########################################################################
if [[ "$(id -u)" == "0" ]] && [[ ! -e "/userdata/system/batocera.conf" ]] ; then
	fatal "Do not run the script from the superuser!"
fi
########################################################################
if grep -i "SteamOS" /etc/os-release &>/dev/null
then fatal "You will need to install flatpak version of PortProton: appstream://ru.linux_gaming.PortProton\n\nhttps://flathub.org/apps/ru.linux_gaming.PortProton\n"
elif ! command -v yad &>/dev/null
then fatal "You will need to install \"yad\" to your system!"
else yad_gui="yad --window-icon=ru.linux_gaming.PortProton --borders=10 --center --text-align=center"
fi
########################################################################
check_flatpak () {
    if [[ ! -z "$FLATPAK_IN_USE" ]]
    then [[ "$FLATPAK_IN_USE" == 1 ]] && return 0 || return 1
    fi
    if grep -i "flatpak" /etc/os-release &>/dev/null ; then
        export FLATPAK_IN_USE=1
        return 0
    else
        export FLATPAK_IN_USE=0
        return 1
    fi
}
########################################################################
case "$LANG" in
	ru_RU*)
		PW_SET_LANG="Russian"
		loc_use_flatpak="Не используйте нативную и flatpak версии PortProton в одной системе!"
		loc_install="Установка PortProton"
		loc_choose_path="Выберите путь для установки (обновления) PortProton,\nили оставьте его по умолчанию.\n\nВнимание:\nУстанавливать необходимо на файловую систему Linux (ext4, btrfs и прочие)."
		loc_set="Выбор"
		loc_path="Путь:"
		loc_other_path="Другой путь..."
		loc_set_path="Выберите путь..."
		;;
	es_ES*)
		PW_SET_LANG="Spanish"
		loc_use_flatpak="¡No utilice flatpak y la versión nativa de PortProton al mismo tiempo!"
		loc_install="Instalar PortProton"
		loc_choose_path="Selecciona la ruta de instalación (actualización) PortProton,\no déjalo en el valor predeterminado. \n\nAtención:\nInstala en un sistema de archivos Linux (ext4, btrfs, etc.)."
		loc_set="Elección"
		loc_path="Camino"
		loc_other_path="Otro camino..."
		loc_set_path="Selecciona el camino..."
		;;
		 *)
		PW_SET_LANG="English"
		loc_use_flatpak="\nDo not use flatpak and the native version of PortProton at the same time!"
		loc_install="Install PortProton"
		loc_choose_path="Select the installation path (update) PortProton,\nor leave it in default. \n\nAttention:\nInstall on a Linux file system (ext4, btrfs, etc.)"
		loc_set="Set"
		loc_path="Path:"
		loc_other_path="Other path..."
		loc_set_path="Select the path..."
		;;
esac
########################################################################
if command -v flatpak &>/dev/null \
&& flatpak list | grep "PortProton" &>/dev/null
then
    $yad_gui --error --title="PortProton" --text "$loc_use_flatpak" 2>/dev/null
    fatal "Do not use flatpak and the native version of PortProton at the same time!"
fi
########################################################################
[[ -z "${XDG_DATA_HOME}" ]] && export XDG_DATA_HOME="$HOME/.local/share"
if ! check_flatpak ; then
	PP_CONFIG_FILE="${HOME}/.config/PortProton.conf"
	if [[ -f "${XDG_DATA_HOME}/PortWINE/PortProton/data/scripts/start.sh" ]] ; then
		echo "${XDG_DATA_HOME}/PortWINE/PortProton" > "${PP_CONFIG_FILE}"
	elif [[ -f "${HOME}/PortWINE/PortProton/data/scripts/start.sh" ]] ; then
		echo "${HOME}/PortWINE/PortProton" > "${PP_CONFIG_FILE}"
	elif [[ -f "${HOME}/PortProton/data/scripts/start.sh" ]] ; then
		echo "${HOME}/PortProton" > "${PP_CONFIG_FILE}"
	fi

	if [[ "$script_path" == "/usr/bin" ]] \
	&& [[ -f "${PP_CONFIG_FILE}" ]]
	then
		export PORT_WINE_PATH="$(cat "${PP_CONFIG_FILE}" | head -n 1)"
		if [[ -f "${PORT_WINE_PATH}/data/scripts/start.sh" ]] ; then
			if [[ "$1" == "--repair" ]] ; then
				export PORT_WINE_DATA_PATH="${PORT_WINE_PATH}/data"
			else
				echo "${port_ver}" > "${PORT_WINE_PATH}/data/tmp/PortProton_ver"
				/usr/bin/env bash "${PORT_WINE_PATH}/data/scripts/start.sh" "$@"
				exit 0
			fi
		else
			rm -f "${PP_CONFIG_FILE}"
		fi
	fi
else
	if [ "$script_path" == "/app/bin" ] ; then
		export PORT_WINE_PATH="${XDG_DATA_HOME}"
		if [ -f "${PORT_WINE_PATH}/scripts/start.sh" ] ; then
			if [[ "$1" == "--repair" ]] ; then
				export PORT_WINE_DATA_PATH="${XDG_DATA_HOME}"
			else
				echo "${port_ver}" > "${PORT_WINE_PATH}/tmp/PortProton_ver"
				/usr/bin/env bash "${PORT_WINE_PATH}/scripts/start.sh" "$@"
				exit 0
			fi
		fi
	fi
fi
########################################################################
export PW_AUTOPLAY=1
export INSTALLING_PORT=1
########################################################################
if [[ "$1" != "--repair" ]] ; then
	if ! check_flatpak ; then
		inst1=$($yad_gui --title  "$loc_install" --text "$loc_choose_path" --list --radiolist \
		--width=600 --height=200  --column="$loc_set" --column "$loc_path" \
		TRUE "${def_path}" \
		FALSE "$loc_other_path")
		[ "$?" != "0" ] && exit 1
		inst1="$(echo $inst1 | awk -F'|' '{print $2}')"
		case $inst1 in
			"${def_path}")
				D_PATH="${def_path}" ;;
			"$loc_other_path")
				D_PATH="$($yad_gui --file --directory --title="$loc_set_path" --width=800 --height=800)" ;;
		esac
		[[ -z "${D_PATH}" ]] && fatal
		echo "${D_PATH}" | grep -i "PortProton" 2>/dev/null || D_PATH="${D_PATH}/PortProton"
		export PORT_WINE_DATA_PATH="${D_PATH}/data"
		export PORT_WINE_PATH="${D_PATH}"
		if [[ ! -z "$PORT_WINE_PATH" ]]
		then echo "${PORT_WINE_PATH}" > "${PP_CONFIG_FILE}"
		fi
	else
		export PORT_WINE_DATA_PATH="${XDG_DATA_HOME}"
	fi
elif [[ -f "$PORT_WINE_PATH/data/user.conf" ]] ; then
	sed -i 's/="devel"/="master"/g' "$PORT_WINE_PATH/data/user.conf"
fi

if [[ ! -d "${PORT_WINE_DATA_PATH}" ]] ; then
    mkdir -p "$PORT_WINE_DATA_PATH" || fatal "Cannot create a directory: $PORT_WINE_PATH"
elif [[ "$1" == "--repair" ]] ; then
	rm -fr "${PORT_WINE_DATA_PATH}/tmp"/{cache_lang,gstreamer_tmp}/
	rm -f "${PORT_WINE_DATA_PATH}/tmp"/{scripts_ver,fixes_apply,update_skip_mirror}
	rm -f "${PORT_WINE_DATA_PATH}/tmp"/{scripts_update_notifier,update_remind_later}
else
	rm -fr "${PORT_WINE_DATA_PATH}/tmp/"
	rm -fr "${PORT_WINE_DATA_PATH}/dist/"
fi
rm -fr "${PORT_WINE_DATA_PATH}/img/"
rm -fr "${PORT_WINE_DATA_PATH}/locales/"
rm -fr "${PORT_WINE_DATA_PATH}/scripts/"
if [[ -f "${PORT_WINE_DATA_PATH}/user.conf" ]] ; then
	echo "WARNING: Moved your user.conf to user.conf.bak"
	mv "${PORT_WINE_DATA_PATH}/user.conf" "${PORT_WINE_DATA_PATH}/user.conf.bak"
fi
########################################################################
mkdir -p "${PORT_WINE_DATA_PATH}/tmp"
echo "${port_ver}" > "${PORT_WINE_DATA_PATH}/tmp/PortProton_ver"
case "${PW_SET_LANG}" in
	"Russian") echo "ru" > "${PORT_WINE_DATA_PATH}/tmp/PortProton_loc" ;;
	"Spanish") echo "es" > "${PORT_WINE_DATA_PATH}/tmp/PortProton_loc" ;;
	"English") echo "en" > "${PORT_WINE_DATA_PATH}/tmp/PortProton_loc" ;;
esac
########################################################################
export PORT_WINE_TMP_PATH="${PORT_WINE_DATA_PATH}/tmp"
if ! check_flatpak
then cd "${D_PATH}"
else cd "${PORT_WINE_DATA_PATH}"
fi

$yad_gui --progress --pulsate --title="$loc_install" --text="$loc_install" \
		 --close-on-unfocus --no-buttons --skip-taskbar --width=500 &>/dev/null &
sleep 1

echo -e "Try download scripts from git.linux-gaming.ru..."
if ! curl -f -# -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" -H 'Cache-Control: no-cache, no-store' -H 'Pragma: no-cache' \
		-L "https://git.linux-gaming.ru/CastroFidel/PortWINE/archive/master.tar.gz" \
		-o "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz"
then
	echo -e "\nError.\nTry download scripts from gitlab.eterfund.ru..."
	if ! curl -f -# -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" -H 'Cache-Control: no-cache, no-store' -H 'Pragma: no-cache' \
		-L "https://gitlab.eterfund.ru/Castro-Fidel/PortWINE/-/archive/master/PortWINE-master.tar.gz" \
		-o "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz"
	then
		echo -e "\nError.\nTry download scripts from github.com..."
		curl -f -# -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" -H 'Cache-Control: no-cache, no-store' -H 'Pragma: no-cache' \
		-L "https://github.com/Castro-Fidel/PortWINE/archive/refs/heads/master.tar.gz" \
		-o "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz"
		[ "$?" != "0" ] && fatal "Critical error during file download!"
	fi
fi
echo "Try unpacking scripts..."
tar -xzf "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz" -C "${PORT_WINE_TMP_PATH}"
if [ "$?" = "0" ] ; then
	[ ! -d "${PORT_WINE_DATA_PATH}" ] && mkdir "${PORT_WINE_DATA_PATH}"
	if [[ -d "${PORT_WINE_TMP_PATH}/portwine" ]] ; then
		cp -fr "${PORT_WINE_TMP_PATH}/portwine/data_from_portwine/"* "${PORT_WINE_DATA_PATH}"
		rm -fr "${PORT_WINE_TMP_PATH}/portwine/"
	else
		cp -fr "${PORT_WINE_TMP_PATH}/PortWINE-master/data_from_portwine/"* "${PORT_WINE_DATA_PATH}"
		rm -fr "${PORT_WINE_TMP_PATH}/PortWINE-master/"
	fi
	rm -f "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz"
	export scripts_current_ver=$(cat "${PORT_WINE_DATA_PATH}/scripts/var" | grep SCRIPTS_NEXT_VERSION | awk -F "=" '{print $2}')
	echo "${scripts_current_ver}" > "${PORT_WINE_TMP_PATH}/scripts_ver"
else
	rm -f "${PORT_WINE_TMP_PATH}/PortWINE-master.tar.gz"
	[ "$?" != "0" ] && fatal "Critical error during file unpacking!"
fi
########################################################################
cd "${PORT_WINE_DATA_PATH}/scripts"
/usr/bin/env bash "${PORT_WINE_DATA_PATH}/scripts/setup.sh" && exit 0
