#!/bin/bash

# SMB-BROWSER - CIFS/SMB Browser and Network Drive Icon Maker
# Copyright (C) 2025 The Fatdog64 Linux team.
# Licensed under the GNU General Public License Version 2

VERSION=3.0.0
# Refer to the ./INSTALL.md file for dependency information.
declare -x -r YAD_BIN=${YAD_BIN:-yad}

die() {
	printf '%s: %s\n' "$BASH_SOURCE" "$*"
	exit 1
}

set +f
cd "$(dirname "$0")"
APPDIR="$(pwd -P)"

# Initialize translations.
# ========================

export TEXTDOMAIN=fatdog OUTPUT_CHARSET=UTF-8
. gettext.sh
export -f eval_gettext
. ./s/i18n_table.sh && i18n_table || die 'ERR i18n_table.sh'
export ${!i18n_X_@} # export variable names i18n_X_*

# Usage before gtksu.
# ===================

if [[ $1 == --help || $1 == -h ]]; then
	set -- ${SMBB_ARGV0@Q}    # set by fatdog-smb-browser.sh
	[[ $1 ]] || set -- "rox ${APPDIR@Q}"
	ARGV0="$1" eval_gettext "$i18n_usage_brief"
	cat << EOF

${i18n_usage_options#*:}
${i18n_usage_opt_conf#*:}
${i18n_usage_opt_filer#*:}
${i18n_usage_opt_icon_tool#*:}

${i18n_usage_environment#*:}
${i18n_usage_env_smb_browser_editor1#*:}
${i18n_usage_env_smb_browser_editor2#*:}
${i18n_usage_env_smb_yad_bin_1#*:}
${i18n_usage_env_smb_yad_bin_2#*:}
EOF
	exit
fi

# Acquire root priviledge.
# ========================
# Configuration and credentials will be saved in root's home directory.

((EUID)) && exec gtksu "$i18n_gtksu_title" "$0" "$@"

# Set traps and create temporary folder.
# ======================================

TMPD=$(mktemp -d -p "${TMPDIR:-/tmp}" "smb-browser_XXXXXX")
chmod 700 "$TMPD" || die 'ERR cannot set trap'
export TMPD
handler() {
	trap '' HUP INT TERM 0 ERR
	local pid
	: "${TMPD:?}"

	if [[ $CONF_FILE ]]; then
		conf_commit_file
		[[ $GEOMETRY_main ]] &&
			gui_main_dialog_okayed && conf_commit_secrets
	fi
	if mountpoint -q "$MOUNT_TMP_DIR"; then
		if ! umount -n "$MOUNT_TMP_DIR" > "$MOUNT_TMP_DIR.err" 2>&1; then
			gui_write_progress ""
			: env; YAD_OPTIONS="$YAD_BASE_OPTIONS
			${GEOMETRY_popup:- --center --width=400 --height=300}
			--button=$YAD_STOCK_BTN-quit --on-top
			--text=\"$i18n_ERROR_CANNOT_UNMOUNT\n\"
			--filename=\"$MOUNT_TMP_DIR.err\"
			" $YAD_BIN --text-info
		fi
	fi
	[ -z "$YAD_LIST_FD" ] || exec {YAD_LIST_FD}>&- {YAD_LIST_FD}<&-
	[ -z "$YAD_TEXT_FD" ] || exec {YAD_TEXT_FD}>&- {YAD_TEXT_FD}<&-
	if [ -s "$TMPD/main_dialog.pid" ] &&
		read pid < "$TMPD/main_dialog.pid"; then
		kill $pid && wait $pid
	fi 2> /dev/null
	[[ $SMBB_DEBUG != *keep* ]] && rm -rf "$TMPD" || rox "$TMPD"
}
trap handler HUP INT TERM 0

# Import functions.
# =================

APPTITLE=$i18n_AppTitle APPWINSIZE=${i18n_WinSize#*:}

. ./s/conf.sh && conf_init && mkdir -p "$CONF_SECRETS_DIR" || die "ERR conf.sh"
. ./s/gui.sh && gui_init ||
	die "ERR gui.sh${YAD_LIB_YAD_VERSION:+ yad $YAD_LIB_YAD_VERSION}"

. ./s/lib.sh && lib_init || die "ERR lib.sh"
. ./s/tbl.sh
. ./s/main.sh && main_init || die "ERR: main.sh"

set -o pipefail

# BASH_ENV exports stuff to all bash descendants.
# ===============================================

# main_data() will append to $BASH_ENV
# ~/wiki/bash.md#exporting-functions-to-gtkdialog-actions
export BASH_ENV="$TMPD/bash_env.env"
APP_PID=$$
APP_PID_FILE="$TMPD/app.pid"
echo $APP_PID > "$APP_PID_FILE"

exec 3>&1 > "$BASH_ENV"
echo "\
# vim:ft=bash:
APP_PATH='${APPDIR:?}/AppRun'
APP_PID=$APP_PID
APP_PID_FILE='$APP_PID_FILE'
CONF_FILE='$CONF_FILE'
SAVE_CONF_FILE='$SAVE_CONF_FILE'
CONF_SECRETS_DIR='$CONF_SECRETS_DIR'
SAVE_CONF_SECRETS_DIR='$SAVE_CONF_SECRETS_DIR'
VERSION='$VERSION'
"
export -f | grep -v '^declare -fx'
exec 1<&3 3>&- &&
	eval "$(export -f | sed -ne '/^declare -fx/s/-fx/-f +x/p')"

# Process command-line.
# =====================

case $* in
	(*--conf*)
		# Configuration dialog. Exit via handler().
		conf_main; exit $?
	;;
	(*--filer*|*--rox-open*)
		# Open a filer window alongside the main window. Continue.
		opt_filer=1
	;;
	(*--icon-tool*)
		# Blank network drive icon maker. Exit via handler().
		gui_make_blank_iconapp; exit $?
	;;
esac

# These variables affect s/smb_discover.awk.
export DISCOVERY_METHOD="${CONF[DISCOVERY_METHOD]:?}"
export PORT="${CONF[PORT]:?}"
export SCAN_HOST="${CONF[SCAN_HOST]}"
export SCAN_SUBNET="${CONF[SCAN_SUBNET]}"
export SCAN_TIMEOUT="${CONF[SCAN_TIMEOUT]:?}"

# Enter the main loop.
# ====================

((opt_filer)) && ( sleep 2; exec rox "${APPDIR%/*}" ) &
main
exit 0

# vim:ft=bash:ts=8:noet:sw=0:
