#!/usr/bin/env bash
winezgui-import-wine-directory()
{

  
  # 1. Ask user to select import directory from where it will copy
  dbug "I: Script: ${FUNCNAME[0]}: Select import directory"
  unset TITLE
  TITLE="Choose a wine prefix directory to import into WineZGUI!"

  IMPORT_DIR=$(${ZENITY_CMD}  --file-selection --title="${TITLE}" --directory)
  if [ -z "${IMPORT_DIR}" ]; then
      dbug "I: Script: ${FUNCNAME[0]}: Select import directory: Cancelled!"
      return 1
  fi

  # Get the name from full path
  IMPORT_BASENAME=$(basename "${IMPORT_DIR}")
  
  # 2. Check system.reg file exists
  if [ ! -f "${IMPORT_DIR}/system.reg" ]; then
     unset MSGTEXT
     MSGTEXT=()
     MSGTEXT+="system.reg not found inside \"${IMPORT_BASENAME}\"\n"
     MSGTEXT+="A wine prefix should have system.reg file in it.\n"
     MSGTEXT+="E.g., ~/.wine"
     ${ZENITY_CMD} --error --title="Not a wine directory" --text="${MSGTEXT}"
     return 1
  fi

  # 3. Find Exe in the given directory
  # script-get-selected-exe expects prefixname
  export PREFIXDIR=${IMPORT_DIR}
  SOURCE "script-get-selected-exe"
  script-get-selected-exe
  
  # 4. Copy wine directory

  # 4.1 SELECTED_EXE and derived variables
  # SELECTED EXE
  export EXE_FILE=$(realpath -m "${SELECTED_EXE}")
  export EXE_NAME=$(basename "${EXE_FILE}")
  export EXE_PATH=$(dirname  "${EXE_FILE}")
  export EXE_NOSP=$(echo ${EXE_NAME}|tr " " "_");
  export EXE_LESS=$(echo ${EXE_NOSP}|sed "s/\.[Ee][Xx][Ee]//"|sed "s/\.[Mm][Ss][Ii]//")
  export EXE_EXT="${EXE_FILE##*.}"
  export PREFIXES_DIR="${WINEZGUIDIR}/Prefixes"
  export SINGLE_PREFIX_DIR="${PREFIXES_DIR}/WineZGUI-Single-Prefix"
  export RUNNERS_DIR="${WINEZGUIDIR}/Runners"
  export PREFIXDIR="${PREFIXES_DIR}/${EXE_LESS}"
  export PREFIXNAME="${EXE_LESS}"
  # EXE_NOEXE = EXE_LESS (remove duplicates)
  export EXE_NOEXE=$(echo "${EXE_NOSP}"           |sed "s/\.[mM][Ss][Ii]//g"\
                                                  |sed "s/\.[eE][Xx][Ee]//g")
  # 4.2: Check if the winezgui prefix data directory is writable or not?
  if [ ! -w "${PREFIXES_DIR}" ]; then
      echo "E: Script: ${FUNCNAME[0]}: ${PREFIXES_DIR} not writable"
      ${ZENITY_CMD} --error --no-wrap --title="Error!" \
            --text "${PREFIXES_DIR} is not writable\nAborting import wine into prefix!"
      return 1
  fi


  # Inform user if user is trying to import from ~/.var/app (like bottles)
  unset TEXTMSG
  if [ ! -r "${IMPORT_DIR}/system.reg" ]; then
#  if [[ "${IMPORT_DIR}" == *".var/app"* ]] || [[ "${IMPORT_DIR}" == *"run/user"* ]] ; then
     TEXTMSG=()
     # TEXTMSG+="Importing wine directory from flatpaked Bottles or PlayonLinux or wine?\n"
     # TEXTMSG+="Press Alt+f2 or in a terminal,\nrun:\n"
     # TEXTMSG+="<b>flatpak --user override --filesystem=~/.var/app io.github.fastrizwaan.WineZGUI</b>"
     # TEXTMSG+="\n\n"
     # TEXTMSG+="and <b>restart WineZGUI</b>!\n"
     # TEXTMSG+="If the above permission is already given, then continue, else copying will fail, continue?"

     TEXTMSG+="Cannot access ${IMPORT_DIR}\n"
     TEXTMSG+="Please run:\n"
     TEXTMSG+="<b>flatpak --user override --filesystem=${IMPORT_DIR} io.github.fastrizwaan.WineZGUI</b>\n"
     TEXTMSG+="and restart winezgui and import again!"
     
     ${ZENITY_CMD} --question --no-wrap \
                   --title="Import ${IMPORT_BASENAME} from a flatpak app?" \
                   --text "${TEXTMSG}"
     ANSWER=$?
     # 1.1 If user selects no or cancels to locate exe file
     if [ ${ANSWER} -eq 1 ]; then
          dbug "I: Script: Import: User Cancelled!"
          return 1  # Return to Script window
     fi
  fi

  # 4.3 Confirm
  unset TEXTMSG
  TEXTMSG=()
  TEXTMSG+="This will copy all files from <b>${IMPORT_DIR}</b> to <b>${PREFIXNAME}</b>\nContinue..?"
  ${ZENITY_CMD} --question --no-wrap \
                --title="Import ${IMPORT_BASENAME} to ${PREFIXNAME}?" \
                --text "${TEXTMSG}"
       ANSWER=$?
       # 1.1 If user selects no or cancels to locate exe file
       if [ ${ANSWER} -eq 1 ]; then
            dbug "I: Script: Import: User Cancelled!"
            return 1  # Return to Script window
       fi
  unset TEXTMSG
  # 4.4 TEST IMPORTDIR SIZE
  # CHECK WINEZGUI AVAILABLE SPACE BEFORE COPYING
  # COPY FILES AND
  # UPDATE EXE_PATH in each script file
  # If importdir is inside prefixdir, No need to import
  # total size =  importdir size
  IMPORTDIR_DISK_USAGE_IN_HF=$(du -sh "${EXE_PATH}"|cut -f1)
  # Check du value assignment
  if [ -z "${IMPORTDIR_DISK_USAGE_IN_HF}" ]; then
       echo "-------------------- Error --------------------------"
       echo "Error: ${FUNCNAME[0]}: IMPORTDIR_DISK_USAGE_IN_HF not assigned"
       echo "-------------------- Error --------------------------"
  fi
  IMPORTDIR_DU_IN_BYTES=$(echo ${IMPORTDIR_DISK_USAGE_IN_HF}|numfmt --from iec)
  # Calculate total backup size = prefix + importdir
  TOTAL_SIZE=$(expr ${IMPORTDIR_DU_IN_BYTES})
  TOTAL_SIZE_IN_HF=$(echo ${TOTAL_SIZE}|numfmt --to iec)

  dbug "-----------------------------------------------------------------------------"

  dbug "I: Script: ${FUNCNAME[0]}: IMPORTDIR_DISK_USAGE_IN_HF=$IMPORTDIR_DISK_USAGE_IN_HF"
  dbug "I: Script: ${FUNCNAME[0]}: IMPORTDIR_DU_IN_BYTES=$IMPORTDIR_DU_IN_BYTES"
  dbug "I: Script: ${FUNCNAME[0]}: TOTAL_SIZE=$TOTAL_SIZE"
  dbug "I: Script: ${FUNCNAME[0]}: TOTAL_SIZE_IN_HF=$TOTAL_SIZE_IN_HF"
  
  
  dbug "I: Script: ${FUNCNAME[0]}: Determining available space"
  dbug "I: Script: ${FUNCNAME[0]}: Available space is:" \
      "${AVAILABLE_SPACE}"
  # Check available disk space inside prefix
  #AVAILABLE_SPACE=$(df -h "${PREFIXDIR}"|sed "s/  */ /g" \
   #   |cut -f4 -d " "|tail -n1)

  AVAILABLE_SPACE=$(df -h "${PREFIXES_DIR}"|tr -s " "|tail -n1|cut -f4 -d " ")
  #Check whether df gave a value or not
  if [ -z "${AVAILABLE_SPACE}" ]; then
       echo "-------------------- Error --------------------------"
       echo "Error: ${FUNCNAME[0]}: AVAILABLE_SPACE not assigned"
       echo "-------------------- Error --------------------------"
  fi
  # Step: Convert the above $AVAILABLE_SPACE into bytes

  # for comparison
  AVAILABLE_SPACE_IN_BYTES=$(echo ${AVAILABLE_SPACE}|numfmt --from iec)

  dbug "I: ${HEADER}: Available space in Human: ${AVAILABLE_SPACE}"
  dbug "I: ${HEADER}: Available space in bytes: ${AVAILABLE_SPACE_IN_BYTES}"
  dbug "-----------------------------------------------------------------------------"
  # Step 5.6: If Target directory does not have sufficient space, abort backup
  dbug "I: Script: ${FUNCNAME[0]}: Checking if size < target dir space"
  if [ ${AVAILABLE_SPACE_IN_BYTES} -gt ${TOTAL_SIZE} ];then
        dbug "I: ${HEADER}: ${PREFIXES_DIR} has enough available disk space"
  else
        echo "E: ${HEADER}: ${PREFIXES_DIR} does not have free disk space!!!"
        unset MSG
        unset TITLE
        TITLE="Not Enough Disk Space!"
        MSG+="${PREFIXES_DIR} has only ${AVAILABLE_SPACE}"
        MSG+=" "
        MSG+="free disk space left!\n"
        MSG+="Prefix backup requires ${TOTAL_SIZE_IN_HF} free disk space."

        # Warn user
        ${ZENITY_CMD} --warning --no-wrap --title "${TITLE}" --text "${MSG}"
        echo "E: Script: ${FUNCNAME[0]}: Not Enough Disk Space, Cancelled!"
        return 1

  fi
  # Add Checksum to prefixdir as suffix here !!!
  # 4.8 setup/install will have 10 digit sha256sum value suffixed
echo "============================================ x ========================"
TEST_NAME=$(echo "${EXE_NAME}"| tr [A-Z] [a-z]) # Change case to test
if [[ "${TEST_NAME}" == *"setup"* ]]   2>/dev/null || \
   [[ "${TEST_NAME}" == *"install"* ]] ; then
     dbug "I: Script: Using sha256sum of the exe"
     x=$(sha256sum "${EXE_FILE}")
     EXE_NOEXE=$(echo "${EXE_NOSP}"               |sed "s/\.[mM][Ss][Ii]//g"\
                                                  |sed "s/\.[eE][Xx][Ee]//g")
     SHASUM10CHARS=${x:0:10}
     export PREFIXDIR="${PREFIXES_DIR}/${EXE_NOEXE}-${SHASUM10CHARS}"
     export PREFIXNAME="${EXE_NOEXE}-${SHASUM10CHARS}"
     echo "x=$x"
     echo "PREFIXDIR=$PREFIXDIR"
     echo "PREFIXNAME=$PREFIXNAME"
     echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"
else
     x=$(sha256sum "${EXE_FILE}")
     EXE_NOEXE=$(echo "${EXE_NOSP}"               |sed "s/\.[mM][Ss][Ii]//g"\
                                                  |sed "s/\.[eE][Xx][Ee]//g")
     SHASUM10CHARS=${x:0:10}
     export PREFIXDIR="${PREFIXES_DIR}/${EXE_NOEXE}-${SHASUM10CHARS}"
     export PREFIXNAME="${EXE_NOEXE}-${SHASUM10CHARS}"
     #export PREFIXDIR="${PREFIXES_DIR}/${EXE_NOEXE}"
     #export PREFIXNAME="${EXE_NOEXE}"
fi

 # mkdir -p "${PREFIXDIR}"

 # 4.5 copying works
  (cp -arv "${IMPORT_DIR}" "${PREFIXDIR}") |\
  ${ZENITY_CMD}  --progress --pulsate --auto-close \
              --text="Copying ${IMPORT_BASENAME} to ${PREFIXNAME}...!" \
              --width=500 --title="Importing..."

 # 4.6 Get exe file using drive_c/../../game.exe
   EXE_INSIDE_DRIVE_C="${SELECTED_EXE##*drive_c/}"
   EXE_FILE="${PREFIXDIR}/drive_c/${EXE_INSIDE_DRIVE_C}"
# 4.7 create prefix using winezgui-create-prefix
  WINEZGUI_CREATE_PREFIX="${DATADIR}/winezgui-create-prefix"
  ${WINEZGUI_CREATE_PREFIX} "${EXE_FILE}"

# 4.8 Create INFOFILE for imported wine directory
# Create Metadata Info.yml for the prefix

INFOFILE="${PREFIXDIR}/Info.yml"

if [ ! -f "${INFOFILE}" ]; then
     #  Insert Data into Info.yml
     SCRIPTFILE="${PREFIXDIR}/${EXE_LESS}.sh"
     PROGNAME=$(grep "export PROGNAME" ${SCRIPTFILE}|cut -f2 -d "="|sed "s/\"//g")
     CHECKSUM=$(grep "export CHECKSUM" ${SCRIPTFILE}|cut -f2 -d "="|sed "s/\"//g")
     ICONFILE=$(grep "export ICONFILE" ${SCRIPTFILE}|cut -f2 -d "="|sed "s/\"//g")
     DESKTOPFILE=$(grep "export DESKTOPFILE" ${SCRIPTFILE}|cut -f2 -d "="|sed "s/\"//g")
     
     DATE=$(date +%F_%H%M)

     echo "Name:${PROGNAME}"                >  "${INFOFILE}"
     echo "Exe:${EXE_FILE}"                 >> "${INFOFILE}"
     echo "Sha256sum:${CHECKSUM}"           >> "${INFOFILE}"
     echo "Exe Path:${EXE_PATH}"            >> "${INFOFILE}"
     echo "Prefix:${PREFIXNAME}"            >> "${INFOFILE}"
     echo "Script:${SCRIPTFILE}"            >> "${INFOFILE}"
     echo "Icon:${ICONFILE}"                >> "${INFOFILE}"
     echo "Shortcut:${DESKTOPFILE}"         >> "${INFOFILE}"
     echo "Created:${DATE}"                 >> "${INFOFILE}"
     echo "Wine:${WINEVER}"                 >> "${INFOFILE}"
     echo "Wine Arch:${WINEARCH}"           >> "${INFOFILE}"
     echo "WineZGUI:${APPVERSION}"          >> "${INFOFILE}"
     echo "WineZGUI Prefix:${WINEZGUIDIR}"  >> "${INFOFILE}"
     echo "Install:${INSTALL_TYPE}"         >> "${INFOFILE}"

     # Include flatpak id in Info.yml
     if [ "${INSTALL_TYPE}" = "flatpak" ]; then
          echo "Flatpak:${FLATPAK_NAME}"    >> "${INFOFILE}"
     fi
     dbug "I: Script: Prefix: Created ${INFOFILE}"
fi


#### THIS PART NEEDS WORK ####
  # USE winezgui-create-prefix without the directory creation

  # get sha256sum of import dir exe
  # find import-dir-exe inside prefixes_dir match sha256sums
  # use winezgui-create-prefix
  # then run script-create-shortcuts-for-found-exes
  # 5. After copying find the exes and create shortcuts.
  #### !!! This needs an already created script file, so create one then run this

  # To get the current scriptfile too in the list
  #  rm "${PREFIXDIR}/*found-exe*.yml"

  # set x permissions
  chmod +rx "${DESKTOPFILE}" "${SCRIPTFILE}" "${S_SCRIPTFILE}" "${S_DESKTOPFILE}" "${NEW_SCRIPT_FILE}" "${NEWDESKTOPFILE}" "${NEWSCRIPTFILE}"
  # Show no guarantee
  ${ZENITY_CMD} --info --title="Import IMPORTDIR to Prefix" \
  --text "Copied $IMPORT_DIR\nto $PREFIXDIR!\n<b>Install dxvk and vkd3d if missing.</b>\n<b>There is NO GUARANTEE that the IMPORTED GAME WILL WORK!</b>"

  # re-enable after script and info.yml is created properly
  SOURCE "winezgui-import-wine-create-shortcuts-for-found-exes"
  winezgui-import-wine-create-shortcuts-for-found-exes
  
}


