#!/usr/bin/env bash
# Locate EXE, if exe file is not found on launch
# Steps:
# 1. If exe file not found, ask user to locate it
# 2. Check sha256sum of NEW_EXE
# 3. Set EXE and EXE path in script file and Info.yml
# 4. Set EXE and EXE path in Info.yml
# 5. Allow immediate exe launch by updating
# 6. If Sha256sum did not match with the NEW_EXE
script-locate-exe-function()
{
  dbug "I: Script: Launched ${FUNCNAME[0]}"
  
  SOURCE "script-check-variables-loaded-or-not"
  script-check-variables-loaded-or-not
  # 1. If exe file not found, ask user to locate it
  if [ ! -f "${EXE_FILE}" ]; then
       echo "E: Script: Locate: ${EXE_FILE} not found at ${EXE_PATH}"
       ${ZENITY_CMD} --question --no-wrap --title="${EXE_NAME} not found!" \
              --text "${EXE_FILE}\nLocate ${EXE_NAME}?"
       ANSWER=$?
       # 1.1 If user selects no or cancels to locate exe file
       if [ ${ANSWER} -eq 1 ]; then
            dbug "I: Script: Locate: User Cancelled!"
            Script_Window  # Return to Script window
       fi
       # 1.2 Show open file dialog
       # 1.2.1 Filer out exe name before " " or "("
       # Let user select ".exe" or ".msi" file
       FILTER=$(echo ${EXE_NAME}|cut -f1 -d " "|cut -f1 -d "("|cut -f1 -d "." \
                          |sed "s/\.[Ee][Xx][Ee]//g"|sed "s/\.[Ms][Ss][Ii]//g")
       # 1.2.2 Show Dialog to select exe file
       unset NEW_EXE
       NEW_EXE="$(${ZENITY_CMD} --file-filter="${FILTER}*.${EXE_EXT}"\
                         --file-selection --title="Locate ${EXE_NAME} File")"
       dbug "I: Script: Locate: Selected ${NEW_EXE}"
       # 1.2.3 If no exe file is selected, or cancel is clicked
       if [ -z "${NEW_EXE}" ]; then
            dbug "I: Script: Locate: User cancelled locating file"
            unset NEW_EXE; # Empty variable
            Script_Window  # Return to Script window
       fi
       # 1.2.4 Create new variables for selected NEW_EXE
       NEW_EXE_NAME=$(basename "${NEW_EXE}")
       NEW_EXE_PATH=$(dirname  "${NEW_EXE}")
       NEW_EXE_NOSP=$(echo     "${NEW_EXE_NAME}"|tr " " "_");
       NEW_EXE_LESS=$(echo    "${NEW_EXE_NOSP}"|sed "s/\.exe//g");
       dbug "I: Script: Locate: Matching checksum of ${NEW_EXE}"
       # 2. Check sha256sum of NEW_EXE
       NEW_EXE_CHECKSUM=$(sha256sum "${NEW_EXE}"|cut -f1 -d " ")
       dbug "I: Script: Locate: ${EXE_FILE} Shasum: ${CHECKSUM}"
       dbug "I: Script: Locate: ${NEW_EXE} Shasum: ${NEW_EXE_CHECKSUM}"
       # 2.1 Compare NEW_EXE_CHECKSUM with one existing in ${SCRIPTFILE}
       if [ "${CHECKSUM}" = "${NEW_EXE_CHECKSUM}" ]; then
            dbug "I: Script: Locate: Checksum matches!"
            # 2.2 When it matches, ask user whether to set it as default exe
            ${ZENITY_CMD} --question --no-wrap --title "${EXE_NAME} found!" \
                   --text "Use ${NEW_EXE_NAME} from now onwards?"
            ANSWER=$?
            # 2.3 If user wants to set it as default exe
            if [ ${ANSWER} -eq 0 ]; then
                 # 3. Set EXE and EXE path in script file
                 dbug "I: Script: Locate: Using ${NEW_EXE} as default"
                 # Update Script ($0) file
                 # 3.1 Update EXE_FILE variable
                 FINDME="\(export EXE\_FILE=\).*"
                 CHANGE="\1\"${NEW_EXE}\""
                 sed "s|${FINDME}|${CHANGE}|g" -i "${0}"
                 dbug "I: Script: Locate: Update EXE_FILE in ${0}"
                 # 3.2 Update EXE_PATH variable
                 FINDME="\(export EXE\_PATH=\).*"
                 CHANGE="\1\"${NEW_EXE_PATH}\""
                 sed    "s|${FINDME}|${CHANGE}|g" -i ${0}
                 echo   "I: Script: Locate: Update EXE_PATH in ${0}"
                 # 4. Set EXE and EXE path in Info.yml
                 echo   "I: Script: Locate: Updating prefix Info.yml"

                 # 4.1 Update EXE_FILE in Info.yml
                 # 4.1.1 sed / with \/ for sed
                 REPL_EXE_FILE=$(echo ${NEW_EXE}|sed "s|\/|\\\/|g" \
                                                |sed "s|\\.|\\\.|g")

                 sed  "s/EXE:.*/EXE:${REPL_EXE_FILE}/g" -i ${INFOFILE}
                 dbug "I: Script: Locate: Updated EXE_FILE in Info.yml"

                 # 4.2 Update EXE_PATH in Info.yml
                 # 4.2.1 sed / with \/ for sed
                 REPL_EXE_PATH=$(echo ${NEW_EXE_PATH}|sed "s|\/|\\\/|g" \
                                                     |sed "s|\\.|\\\.|g")

                 sed  "s/Exe Path:.*/Exe Path:${REPL_EXE_PATH}/g" -i ${INFOFILE}

                 # 5. Allow immediate exe launch by updating
                 # runtime variable for current running script
                 EXE_FILE="${NEW_EXE}"
                 EXE_PATH="${NEW_EXE_PATH}"
                 dbug "I: Script: Locate: Updated EXE_FILE and EXE_PATH"
            fi # if [ ${ANSWER} -eq 0 ]
       else    # 6. If Sha256sum did not match with the NEW_EXE

            echo "W: Script: Locate: Warning files are different"
            # 6.1 Ask user to run once the selected exe with different sha256sum
            ${ZENITY_CMD} --question --no-wrap --title "${EXE_NAME} Checksum Fail!" \
                   --text  "Just run ${NEW_EXE_NAME} once?\nTo use this: Use Change->Default Exe"
            ANSWER=$?
            # If the user still want to run the mismatched exe
            # Let the user run it once
            if [ ${ANSWER} -eq 0 ]; then
                 echo "W: Script: Locate: Allowing running once."
                 NEW_EXE_PATH=$(dirname "${NEW_EXE}")
                 EXE_FILE="${NEW_EXE}"
                 EXE_PATH="${NEW_EXE_PATH}"
            fi
       fi #if [ "${CHECKSUM}" =
  fi #if [ ! -f "${EXE_FILE}" ]
}
