#!/bin/bash

###############################################################################
# UExtract v4.0 by JakeSFR (a.k.a. SFR)'2013-2020                             #
# GNU GPL v2 applies                                                          #
###############################################################################

MYPATH="$(dirname "$(readlink -f "$0")")"
PATH="${MYPATH}/bin:${PATH}"
LD_LIBRARY_PATH="${MYPATH}/bin:${LD_LIBRARY_PATH}"

APPNAME="$(grep -m1 "^APPNAME=\".*\"" "${MYPATH}/uextract" | cut -f2 -d '"')"

export TEXTDOMAINDIR="${MYPATH}/locale"
export TEXTDOMAIN=uextract
export OUTPUT_CHARSET=UTF-8

WORKDIR="/tmp/uextract_apprun.${USER}.${$}"

if ! which gettext >/dev/null 2>&1; then
	gettext() { echo "$@"; };
	export -f gettext
fi

if ! mkdir -p "$WORKDIR"; then
	echo "$(gettext 'Cannot create temporary directory! Aborting...')"
	exit 1
fi

trap '[ -d "${WORKDIR}" ] && rm -rf "${WORKDIR}"; exit' 0 INT HUP TERM

TMPTEXTFILE="${WORKDIR}/tmptextfile"
TMPEXEC="${WORKDIR}/uextract_exec_${USER}.${$}"

CUR_LANG="${LANG:0:2}"
[ "$LANGUAGE" ] && CUR_LANG="${LANGUAGE:0:2}"

LINKS="${MYPATH}/doc/LINKS.txt"
FILETYPES="${MYPATH}/doc/FILETYPES.txt"
if [ -f "${MYPATH}/doc/FILETYPES_${CUR_LANG}.txt" ]; then
	FILETYPES="${MYPATH}/doc/FILETYPES_${CUR_LANG}.txt"
fi

which gtkdialog4 >/dev/null 2>&1 && GTKDIALOG=gtkdialog4 || GTKDIALOG=gtkdialog
which ${GTKDIALOG} >/dev/null 2>&1 && GUI=gtkdialog || GUI=xdialog

# -----------------------------------------------------------------------------

# $1 = label, $2 = input_file,
# $3 = gtkdialog_width, $4= gtkdialog_height
# $5 = xdialog_height, $6 = xdialog_width

func_show_dialog() {

	mkdir -p "${WORKDIR}/gtk-3.0"

	# GTK2
	CUSTOM_GTK2="${WORKDIR}/gtkrc"
	cat > "$CUSTOM_GTK2" <<EOF
style 'fixed_font' {
font_name="Monospace"
}
widget '*Text*' style 'fixed_font'
class '*GtkText*' style 'fixed_font'
EOF

	# GTK3
	CUSTOM_GTK3="${WORKDIR}/gtk-3.0/gtk.css"
	mkdir -p "${WORKDIR}/gtk-3.0"
	cat > "$CUSTOM_GTK3" <<EOF
textview {
font-family: monospace;
}
EOF

	if [ "$GUI" = 'gtkdialog' ]; then

		echo '
		<window title="'${APPNAME}'" image-name="'${MYPATH}/UExtract.png'" window-position="1">
			<vbox>

				<text use-markup="true">
					<label>"<span size='"'x-large'"'><b>'${1}'</b></span>"</label>
				</text>

				<edit editable="false" cursor-visible="false">
					<width>'${3}'</width>
					<height>'${4}'</height>
					<input file>'${2}'</input>
				</edit>

				<hbox homogeneous="true">
					<button has-focus="true">
						<label>'$(gettext "Close")'</label>
						<input file stock="gtk-close"></input>
					</button>
				</hbox>

			</vbox>
		</window>
		' | GTK2_RC_FILES="${CUSTOM_GTK2}:${HOME}/.gtkrc-2.0" XDG_CONFIG_HOME="${WORKDIR}" $GTKDIALOG -s #--styles "${CUSTOM_GTK}"	# not supported in older Gtkdialog versions

	else

		Xdialog --fixed-font \
				--rc-file "${CUSTOM_GTK2}" \
				--center \
				--no-cancel \
				--title "${APPNAME}" \
				--backtitle "${1}" \
				--textbox "${2}" "${5}" "${6}"

	fi

}

# -----------------------------------------------------------------------------

func_input_files() {

	if [ "$GUI" = 'gtkdialog' ]; then

		CHOOSER="$(echo '
		<window title="'${APPNAME}'" image-name="'${MYPATH}/UExtract.png'" window-position="1">
			<vbox>

				<text use-markup="true">
					<label>"<span size='"'x-large'"'><b>'$(gettext 'Select file to extract')'</b></span>"</label>
				</text>

				<hseparator></hseparator>

				<chooser action="0" space-fill="true" space-expand="true">
					<variable>CHOOSER</variable>
					<default>'${HOME}'</default>
					<width>600</width>
					<height>400</height>
					<action when="file-activated">exit:OK</action>
					<action when="selection-changed">refresh:MIME</action>
				</chooser>

				<hbox space-fill="false" space-expand="false">
					<text space-fill="true" space-expand="true"><label>""</label></text>
					<hbox homogeneous="true" space-fill="true">
						<button ok></button>
						<button cancel></button>
					</hbox>
				</hbox>

			</vbox>

		</window>
		' | $GTKDIALOG -s)"

		IFILES="$(echo "$CHOOSER" | grep '^CHOOSER=' | sed -n 's/.*="\(.*\)"/\1/p')"
		eval $(echo "$CHOOSER" | grep '^EXIT=')
		[ "$EXIT" = 'OK' ] && return 0 || return 1

	else

		IFILES="$(Xdialog --stdout \
						--no-buttons \
						--center \
						--title "$APPNAME" \
						--backtitle "$(gettext 'Select file to extract')" \
						--fselect "" 0 0 2>/dev/null)"

		[ $? -eq 0 ] && return 0 || return 1

	fi

}

# -----------------------------------------------------------------------------

func_output_dir() {

	if [ "$GUI" = 'gtkdialog' ]; then

		CHOOSER="$(echo '
		<window title="'${APPNAME}'" image-name="'${MYPATH}/UExtract.png'" window-position="1">
			<vbox>

				<text use-markup="true">
					<label>"<span size='"'x-large'"'><b>'$(gettext 'Select output directory')'</b></span>"</label>
				</text>

				<hseparator></hseparator>

				<chooser action="2" space-fill="true" space-expand="true">
					<variable>CHOOSER</variable>
					<default>$(pwd)</default>
					<width>600</width>
					<height>400</height>
				</chooser>

				<hbox space-fill="false" space-expand="false">

					<vbox spacing="0">
						<checkbox>
							<default>true</default>
							<variable>AUTOCLOSE</variable>
							<label>'$(gettext 'Autoclose output window if no errors')'</label>
						</checkbox>
					
						<checkbox>
							<default>false</default>
							<variable>LISTMODE</variable>
							<label>'$(gettext 'List contents instead of extracting')'</label>
							<action>if true disable:AUTOCLOSE</action>
							<action>if true disable:CHOOSER</action>
							<action>if false enable:AUTOCLOSE</action>
							<action>if false enable:CHOOSER</action>
						</checkbox>
					</vbox>

					<text space-fill="true" space-expand="true"><label>""</label></text>

					<vbox homogeneous="true" space-fill="false" space-expand="false">
						<hbox>
							<text space-fill="true" space-expand="true"><label>""</label></text>
							<hbox homogeneous="true" space-fill="true">
								<button ok></button>
								<button cancel></button>
							</hbox>
						</hbox>
					</vbox>

				</hbox>

			</vbox>

		</window>
		' | $GTKDIALOG -s)"

		CUSTOMDIR="$(echo "$CHOOSER" | grep '^CHOOSER=' | sed -n 's/.*="\(.*\)"/\1/p')"
		eval $(echo "$CHOOSER" | grep -E '^EXIT=|^AUTOCLOSE=|^LISTMODE=')
		[ "$EXIT" = 'OK' ] && return 0 || return 1

	else
	
		CUSTOMDIR="$(Xdialog --stdout \
							 --center \
							 --title "$APPNAME" \
							 --backtitle "$(gettext 'Select output directory')" \
							 --check "$(gettext 'Autoclose output window if no errors')" on \
							 --dselect "${CURRENTDIR}" 0 0 2>/dev/null)"
		
		RETCODE=$?

		LISTMODE='false'
		AUTOCLOSE="$(echo "$CUSTOMDIR" | tail -n 1)"
		CUSTOMDIR="$(echo "$CUSTOMDIR" | head -n -1)"
		
		[ "$AUTOCLOSE" = 'checked' ] && AUTOCLOSE='true' || AUTOCLOSE='false'
		[ $RETCODE -eq 0 ] && return 0 || return 1
	
	fi

}

# =============================================================================

### START

case "$1" in

	--filetypes)
		func_show_dialog "$(gettext 'Filetypes')" "${FILETYPES}" 780 400 32 98
		exit
		;;

	--backends)
		"${MYPATH}/uextract" -b | sed -r "s/\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | tail -n +5 | head -n -1 > "${TMPTEXTFILE}"
		func_show_dialog "$(gettext 'Backends')" "${TMPTEXTFILE}" 400 400 32 51
		exit
		;;

	--dependencies)
		"${MYPATH}/uextract" -d | sed -r "s/\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | tail -n +5 | head -n -1 > "${TMPTEXTFILE}"
		func_show_dialog "$(gettext 'Dependencies')" "${TMPTEXTFILE}" 400 400 32 51
		exit
		;;

	--weblinks)
		func_show_dialog "$(gettext 'Weblinks')" "$LINKS" 780 400 32 98
		exit
		;;

esac

# -----------------------------------------------------------------------------

IFILES=( "$@" )

if [ ${#IFILES[@]} -eq 0 ]; then
	while [ ! "$IFILES" ] || [ -d "$IFILES" ]; do
		func_input_files || exit 1
	done
fi

CURRENTDIR="${IFILES[0]%/*}/"
cd -- "$CURRENTDIR" || exit 1

func_output_dir || exit 1

# -----------------------------------------------------------------------------

# Try to properly handle filenames with HTML % triplets, which are replaced by ROX to ASCII characters.
# Fixed by jun7 in https://github.com/jun7/rox-filer/commit/5a3126c7e9780007ebd318dae0a6403027cb0d79
for FILE in $(seq 0 $((${#IFILES[@]}-1))); do
	if [ ! -f "${IFILES[$FILE]}" ]; then
		TMPFILENAME="${IFILES[$FILE]}"
		for i in ' ' '!' '\*' "\'" '(' ')' ';' ':' '@' '&' '=' '+' ',' '\/' '\?' '%' '#' '[' ']'; do
			TMPFILENAME="${TMPFILENAME//$i/$(printf "%%%x" "'$i")}"
			[ -f "$TMPFILENAME" ] && IFILES[$FILE]="$TMPFILENAME" && break
		done
	fi
done

# =============================================================================

export PS1="# "

[ "$LISTMODE" = 'true' ] && LM='-l' || LM=''

if [ "$GUI" != 'gtkdialog' ] || [ ! "$($GTKDIALOG --version | grep 'VTE')" ] || [ ! -z "$UEXTRACT_TERM" ]; then

	echo '#! /bin/bash
trap "'"rm -rf $WORKDIR"'" EXIT
'${MYPATH}'/uextract "$@"
RETVAL=$?
rm -f '${TMPEXEC}'' > "$TMPEXEC"

	if [ "$AUTOCLOSE" = "true" ] && [ "$LISTMODE" != 'true' ]; then
		echo '[ $RETVAL -eq 0 ] && exit' >> "$TMPEXEC"
	fi

	echo '/bin/sh' >> "$TMPEXEC"

	chmod +x "$TMPEXEC"

	for i in $UEXTRACT_TERM defaultterm urxvt uxterm rxvt xterm roxterm lxterminal termit sakura; do
		[ $(which $i 2>/dev/null) ] && { EXEC_TERMINAL=$i; break; }
	done

	exec $EXEC_TERMINAL -T "$APPNAME" -e ${TMPEXEC} ${LM} -o "$CUSTOMDIR" "${IFILES[@]}"

else

	echo "clear; trap 'rm -rf $WORKDIR' EXIT" > "$TMPEXEC"
	
	CUSTOMDIR="${CUSTOMDIR//\'/\'\"\'\"\'}"
	echo -n "${MYPATH}/uextract ${LM} -o '$CUSTOMDIR'" >> "$TMPEXEC"
	
	for FILE in $(seq 0 $((${#IFILES[@]}-1))); do
		IFILES[$FILE]="${IFILES[$FILE]//\'/\'\"\'\"\'}"
		echo -n " '${IFILES[$FILE]}'" >> "$TMPEXEC"
	done

	chmod +x "$TMPEXEC"

	export MAIN='
	<window title="'${APPNAME}'" image-name="'${MYPATH}/UExtract.png'">
		<vbox>
			<terminal argv0="/bin/sh"
				scrollback-lines="100000"
				has-focus="true"
				text-background-color="#ffffff"
				text-foreground-color="#000000">
				<variable>vte0</variable>
				<width>83</width>
				'$(if [ "$AUTOCLOSE" = "true" ] && [ "$LISTMODE" != 'true' ]; then
					echo '<input>echo "HISTFILE=; printf \"\033c\";' ${TMPEXEC}' && exit"</input>'
				else
					echo '<input>echo "HISTFILE=; printf \"\033c\";' ${TMPEXEC}'"</input>'
				fi)'
				<action signal="child-exited">exit:EXIT</action>
			</terminal>
		</vbox>
	</window>'

	exec $GTKDIALOG -cp MAIN
fi

exit
