#!/bin/bash

TOOLBOX_NAME="$1"
TOOLBOX_RELEASE="$2"
APP_NAME="${TOOLBOX_NAME}"
CONTAINER_NAME="$(echo $TOOLBOX_NAME | sed -e 's/^[^a-zA-Z0-9]/_/' -e 's/\(.\)[^a-zA-Z0-9_.-]/\1_/g')"

[ -z "$TOOLBOX_NAME" ] && echo "usage: $0 NAME [RELEASE]" && exit 1
if [ -z "$TOOLBOX_RELEASE" ]; then
    . /etc/os-release
    TOOLBOX_RELEASE="${PLATFORM_ID##*:}"
fi

APP_ID_PREFIX="org.gnome.Toolbox.App"
APP_ID="${APP_ID_PREFIX}.$(echo $TOOLBOX_NAME | sed -e 's/[^A-Za-z0-9_]/_/g')"

SERVICE_DIR=~/.local/share/dbus-1/services
mkdir -p $SERVICE_DIR

SERVICE_FILE="${SERVICE_DIR}/${APP_ID}.service"
if [ ! -e "${SERVICE_FILE}" ]; then
    cat <<- EOF > "${SERVICE_FILE}"
	[D-BUS Service]
	Name=${APP_ID}
	Exec=/usr/libexec/gnome-terminal-server --app-id "${APP_ID}" --name "${APP_NAME}" --class="${APP_NAME}"

	EOF

    busctl --user call org.freedesktop.DBus  \
                       /org/freedesktop/DBus \
                       org.freedesktop.DBus  \
                       ReloadConfig
fi

APP_DIR=~/.local/share/applications
mkdir -p $APP_DIR

DESKTOP_FILE="${APP_DIR}/${APP_ID}.desktop"
if [ ! -e "${DESKTOP_FILE}" ]; then
    cat <<- EOF > "${DESKTOP_FILE}"
	[Desktop Entry]
	Name=${APP_NAME}
	Type=Application
	Icon=org.gnome.Terminal
	Exec=toolbox-app "${TOOLBOX_NAME}" "${TOOLBOX_RELEASE}"
	StartWMClass=${APP_ID}
	X-GNOME-SingleWindow=false
	Actions=new-window;
	Keywords=terminal;toolbox;${TOOLBOX_RELEASE}

	[Desktop Action new-window]
	Name=New Window
	Exec=toolbox-app "${TOOLBOX_NAME}" "${TOOLBOX_RELEASE}"
	EOF
fi

APP_CONFIG_DIR=~/.config/${APP_ID}
mkdir -p "$APP_CONFIG_DIR"

PROFILE_ID_FILE="${APP_CONFIG_DIR}/profile-id"
if [ ! -e "${PROFILE_ID_FILE}" ];then
    PROFILE_ID="$(uuidgen)"
    echo $PROFILE_ID > "${PROFILE_ID_FILE}"
else
    PROFILE_ID="$(cat ${PROFILE_ID_FILE})"
fi

PROFILE_CONFIG="${APP_CONFIG_DIR}/profile-config"
if [ ! -e "${PROFILE_CONFIG}" ]; then
    cat <<- EOF > "${PROFILE_CONFIG}"
	[org/gnome/terminal/legacy/profiles:/:${PROFILE_ID}]
	audible-bell=false
	scrollback-unlimited=true
	title='${APP_NAME}'
	title-mode='after'
	visible-name='${APP_NAME}'
	custom-command='toolbox-app "${TOOLBOX_NAME}" "${TOOLBOX_RELEASE}"'
	use-custom-command=true

	EOF

    cat ${PROFILE_CONFIG} | dconf load /

    PROFILE_LIST="$(gsettings get org.gnome.Terminal.ProfilesList list)"
    PROFILE_LIST="${PROFILE_LIST%]}, '${PROFILE_ID}']"
    gsettings set org.gnome.Terminal.ProfilesList list "${PROFILE_LIST}"
fi

TERMINAL_CONFIG="${APP_CONFIG_DIR}/terminal.config"
if [ ! -e "${TERMINAL_CONFIG}" ]; then
    cat <<- EOF > "${TERMINAL_CONFIG}"
	[GNOME Terminal Configuration]
	Version=1
	CompatVersion=1
	Windows=${APP_ID} Window;

	[${APP_ID} Window]
	Terminals=${APP_ID} Tab;
	ActiveTerminal=${APP_ID}
	MenubarVisible=false

	[${APP_ID} Tab]
	ProfileID=${PROFILE_ID}
	Title=${APP_NAME}
	Command=toolbox-app "${TOOLBOX_NAME}" "${TOOLBOX_RELEASE}"

	EOF
fi

toolbox create --release "${TOOLBOX_RELEASE}"   \
               --container "${CONTAINER_NAME}" >& /dev/null

CONTAINER_ID=$(toolbox run --container "${CONTAINER_NAME}" sh -c '. /run/.containerenv; echo -n "$id"')

[ -z "${CONTAINER_ID}" ] && exit 1

STARTUP_SCRIPT="toolbox-app.sh"
STARTUP_SCRIPT_SOURCE="${APP_CONFIG_DIR}/${STARTUP_SCRIPT}"
STARTUP_SCRIPT_DEST="/etc/profile.d/${STARTUP_SCRIPT}"

if [ ! -e ${STARTUP_SCRIPT_SOURCE} ]; then
    cat <<- EOF >> "${STARTUP_SCRIPT_SOURCE}"
	TOOLBOX_APP_NAME="${APP_NAME}"
	TOOLBOX_APP_CONTAINER_NAME="${CONTAINER_NAME}"
	TOOLBOX_APP_CONTAINER_ID="${CONTAINER_ID}"

	echo -e '\033]777;container;pop;;\033\\'
	EOF

    podman cp --pause=false ${STARTUP_SCRIPT_SOURCE} ${CONTAINER_ID}:${STARTUP_SCRIPT_DEST}
fi

SUDO_CONFIG="sudoers"
SUDO_CONFIG_SOURCE="${APP_CONFIG_DIR}/${SUDO_CONFIG}"
SUDO_CONFIG_DEST="/etc/sudoers.d/${SUDO_CONFIG}"
if [ ! -e "${SUDO_CONFIG_SOURCE}" ]; then
    cat <<- EOF > "${SUDO_CONFIG_SOURCE}"
	${USER}	ALL=(ALL)	NOPASSWD: ALL
	EOF
    podman cp --pause=false ${SUDO_CONFIG_SOURCE} ${CONTAINER_ID}:${SUDO_CONFIG_DEST}
fi

if [ "${TOOLBOX_APP_ID}" != "${APP_ID}" ]; then
    export TOOLBOX_APP_ID="${APP_ID}"
    unset GNOME_TERMINAL_SERVICE GNOME_TERMINAL_SCREEN
    gnome-terminal --print-environment                           \
                   --title "${APP_NAME}" --app-id "${APP_ID}"    \
                   --load-config="${TERMINAL_CONFIG}" 2>/dev/null | while read env
    do
       echo "$env" | grep -q "^GNOME_TERMINAL_SCREEN=" && exit 0
    done
else
    exec toolbox enter --container "${CONTAINER_NAME}"
fi
