#!/usr/bin/env bash
# ============================================================================ #
# WineZGUI (winezgui) (C) GPL3 Mohammed Asif Ali Rizvan <fast.rizwaan@gmail.com>
# URL: https://github.com/fastrizwaan/WineZGUI
# winezgui main program to run or create a wine prefix for a selected exe
# ============================================================================ #

## ShellCheck can't read dynamic paths from `source`, so ignore them (SC1090/SC1091)
# shellcheck source=/dev/null

export AUTHOR="Mohammed Asif Ali Rizvan"
export EMAIL="fast.rizwaan@gmail.com"
export COPYRIGHT="GNU General Public License (GPLv3+)"
export WEBSITE="https://github.com/fastrizwaan/WineZGUI"
# Variables
HEADER="$(basename "${0}")"
WINEZGUIDIR="$(realpath -m ~/.local/share/winezgui)"
TEMPDIR="$(realpath -m "${WINEZGUIDIR}/tmp")"

WBOOT_CMD="$(which wineboot) -i"
ICOTOOL_CMD="$(which icotool)"
WRESTOOL_CMD="$(which wrestool)"
ZENITY_CMD="$(which zenity)"
EXIFTOOL_CMD="$(which exiftool)"
ZSTD_CMD="$(which zstd)"
TAR_CMD="$(which tar)"
WGET_CMD="$(which wget)"

SYSTEM_WINE="$(which wine)"
ARGV=("$@")

export DEBUG="Y"
export PROCESSNAME="$0"
export HEADER  # for Terminal Messages
# These values will be assigned by Setup using sed command
export APPNAME=WineZGUI   # Application Name
export APPVERSION="1.00"
export APP_WITH_VER="${APPNAME}-${APPVERSION}" # Example: WineZGUI-0.88
export INSTALL_PREFIX="/usr"
export DATADIR=/usr/share/winezgui # scripts & data dir; /usr changes to prefix
export INSTALL_TYPE="system"
export WINEZGUIDIR
export TEMPDIR
export FLATPAK_NAME=""
#/These values will be changed  by Setup using sed command
export SETTINGS_FILE="${WINEZGUIDIR}/Settings.yml" # Settings file 
export TEMPLATES_DIR="${WINEZGUIDIR}/Templates"    # Prefix Templates Directory
export PREFIXES_DIR="${WINEZGUIDIR}/Prefixes"
export SINGLE_PREFIX_DIR="${PREFIXES_DIR}/WineZGUI-Single-Prefix"      # Scripts Prefixes Directory
export RUNNERS_DIR="${WINEZGUIDIR}/Runners"        # Wine runners Directory
# Commands used by WineZGUI and Scripts
export UPDATE_ICON_CACHE="gtk-update-icon-cache -f -t ~/.local/share/icons 2>/dev/null"
export UPDATE_DESKTOP_DATABASE="update-desktop-database"
export WBOOT_CMD # will be overridden by winezgui-set-wine_cmd-runner-commands()
export ICOTOOL_CMD
export WRESTOOL_CMD
export ZENITY_CMD
export EXIFTOOL_CMD
export ZSTD_CMD
export TAR_CMD
export WGET_CMD
export SYSTEM_WINE
# LD_LIBRARY_PATH
if [ -z "${LD_LIBRARY_PATH}" ]; then
LD_LIBRARY_PATH+="/lib:/lib32:/lib64"; fi
LD_LIBRARY_PATH+="${LD_LIBRARY_PATH}:/app/lib:/app/lib32:/app/lib64:"
LD_LIBRARY_PATH+="/app/lib/i386-linux-gnu:/app/lib/wine:"
LD_LIBRARY_PATH+="/app/lib64/wine:"
LD_LIBRARY_PATH+="/usr/lib/x86_64-linux-gnu/wine:"
LD_LIBRARY_PATH+="/usr/lib/wine:"
LD_LIBRARY_PATH+="/usr/lib/wine/wine:"
LD_LIBRARY_PATH+="/usr/lib64/wine:"
LD_LIBRARY_PATH+="/usr/lib64/wine/wine:"
LD_LIBRARY_PATH+="/usr/lib/i386-linux-gnu/wine:"
LD_LIBRARY_PATH+="$(pwd)"
export LD_LIBRARY_PATH
export PATH="${PATH}:/bin:/usr/bin:/usr/local/bin:/app/bin"
export ARGV

echo "SYSTEM_WINE=${SYSTEM_WINE}"

# SOURCE function uses source command and try to required scripts in both DATADIR or SCRIPTDIR
source "${DATADIR}/winezgui-source"

# Set dbug variable 
SOURCE "winezgui-dbug"

# Set WINE_CMD, RUNNER, RUNNER_NAME, WINEVER, WINETRICKS variables
SOURCE "winezgui-set-wine_cmd-runner-commands"
winezgui-set-wine_cmd-runner-commands

APPLICATIONSDIR="$(realpath -m ~/.local/share/applications)"
export ABOUTFILE="${WINEZGUIDIR}/About.yml"
export APPLICATIONSDIR

# Shortcuts (.desktop files) will be installed in APPLICATIONSDIR
# prefixed with shortcut names to manage winezgui specific shortcuts
if [ "${INSTALL_TYPE}" = "system" ]; then 
     SHORTCUT_PREFIX="system_winezgui"
else 
     SHORTCUT_PREFIX="${FLATPAK_NAME}"
fi

export SHORTCUT_PREFIX
export BKP_EXT="wzt" # winezgui backup file extension

SOURCE "check-all-variables"
echo "-------------------------------${0}--------------------------------------"
check-all-variables \
"AUTHOR EMAIL COPYRIGHT WEBSITE DEBUG PROCESSNAME HEADER APPNAME       \
APPVERSION APP_WITH_VER DATADIR INSTALL_TYPE WINEZGUIDIR FLATPAK_NAME  \
SETTINGS_FILE TEMPLATES_DIR PREFIXES_DIR UPDATE_ICON_CACHE             \
UPDATE_DESKTOP_DATABASE WINEVER WBOOT_CMD ICOTOOL_CMD WRESTOOL_CMD     \
ZENITY_CMD EXIFTOOL_CMD ZSTD_CMD TAR_CMD WGET_CMD LD_LIBRARY_PATH PATH \
WINE_CMD WINETRICKS ABOUTFILE APPLICATIONSDIR SHORTCUT_PREFIX \
BKP_EXT INSTALL_PREFIX TEMPDIR WINEZGUIDIR INSTALL_TYPE"

# For Zenity 4
ZENITY_VERSION=$(${ZENITY_CMD} --version|cut -f1 -d ".")

WineZGUI_Window() # Main WineZGUI application window function
{
  HEADER="$(basename "${0}")"
  
  # For Zenity 4
  if [ "${ZENITY_VERSION}" -eq 4 ]; then
       WINDOW_HEIGHT=820
       WINDOW_WIDTH=500
  else
       WINDOW_HEIGHT=440
       WINDOW_WIDTH=360
  fi
  
  SELECTION=$(${ZENITY_CMD} --list --hide-header               \
                     --title "${APP_WITH_VER}"                 \
                     --width=${WINDOW_WIDTH}                   \
                     --height=${WINDOW_HEIGHT}                 \
                     --radiolist --column " "                  \
                     --column "Action"                         \
                         TRUE "Open Exe..."                    \
                            0 "Launch..."                      \
                            0 "Script..."                      \
                            0 "Backup..."                      \
                            0 "Restore..."                     \
                            0 "Delete..."                      \
                            0 "Runner..."                      \
                            0 "Template..."                    \
                            0 "Settings..."                    \
                            0 "Kill all..."                    \
                            0 "More..."                        \
                            0 "Help..."                        \
                            0 "About..."                       \
                            0 "Quit..."                        \
                       --text "<b>Wine GUI using Zenity...</b>")
  
  if    [ -z "${SELECTION}" ]; then # Exit if Cancel is clicked
          echo "I: ${HEADER}: Cancel Selected. Bye!"
          SOURCE "winezgui-quit"
          winezgui-quit
          #exit 0
  fi         
 
  dbug "I: ${HEADER}: ${SELECTION} Selected!" # Show What is selected
 
  if   [ "${SELECTION}" = "Open Exe..." ]; then
         SOURCE "winezgui-open-exe"
         winezgui-open-exe

  elif [ "${SELECTION}" = "Launch..."  ]; then
         SOURCE "winezgui-launch"
         winezgui-launch

  elif [ "${SELECTION}" = "Script..."  ]; then
         SOURCE "winezgui-script"
         winezgui-script

  elif [ "${SELECTION}" = "Backup..." ]; then
         SOURCE "winezgui-backup"
         winezgui-backup

  elif [ "${SELECTION}" = "Restore..." ]; then
         SOURCE "winezgui-restore"
         winezgui-restore
  
  elif [ "${SELECTION}" = "Delete..."  ]; then
         SOURCE "winezgui-delete-prefix"
         winezgui-delete-prefix
  
  elif [ "${SELECTION}" = "Runner..." ]; then
        SOURCE "winezgui-runner"
        winezgui-runner
  
  elif [ "${SELECTION}" = "Template..." ]; then
         SOURCE "winezgui-template"
         winezgui-template

  elif [ "${SELECTION}" = "Settings..."  ]; then
         SOURCE "winezgui-settings"
         winezgui-settings

  elif [ "${SELECTION}" = "More..."  ]; then
         SOURCE "winezgui-more"
         winezgui-more

  elif [ "${SELECTION}" = "Help..." ]; then
         SOURCE "winezgui-help"
         winezgui-help

  elif [ "${SELECTION}" = "About..." ]; then
         SOURCE "winezgui-about"
         winezgui-about

  elif [ "${SELECTION}" = "Kill all..." ]; then
         SOURCE "winezgui-kill-all"
         winezgui-kill-all

  elif [ "${SELECTION}" = "Quit..." ]; then
         SOURCE "winezgui-quit"
         winezgui-quit
  fi

  # When program returns from script, source changes
  source "${DATADIR}/winezgui-source"

  WineZGUI_Window  # After All options
} 
echo "-------------------------------${0}--------------------------------------"
#----------------------------------- Startup ----------------------------------#

SOURCE "winezgui-cli-arguments"
winezgui-cli-arguments

SOURCE "winezgui-startup-checks"
winezgui-startup-checks

SOURCE "winezgui-check-file-type"
winezgui-check-file-type "${1}"

dbug "I: ${HEADER}: Launching ${APPNAME}"
WineZGUI_Window

