#!/usr/bin/env bash
##### Rename Prefix Directory ####
# Steps:
# 1. Ask for New Prefix Name
# 2. replace " " with "_" (underscore)
# 3. If a prefix with given name already exist, inform
# 4. Create Variables for replacement
# 5. Replace PREFIX values inside files
# 6. Rename files as per new prefix name 
# 7. Create new shortcut and delete old one
# 8. Launch Script from Renamed Directory
script-rename-prefix()
{
  dbug "I: Script: Launched ${FUNCNAME[0]}"
  
  SOURCE "script-check-variables-loaded-or-not"
  script-check-variables-loaded-or-not
  if [ -z "${1}" ]; then
    # 1. Ask for New Prefix Name
    GET_PREFIX_NAME=$(${ZENITY_CMD} --title "Rename Prefix..."           \
                             --width=500 --entry                  \
                             --text "Enter a name for the prefix" \
                             --entry-text "${PREFIXNAME}"         )
  else 
      GET_PREFIX_NAME="${1}"
  fi
    
  # 1.1 If User clicks cancel, go back 
  if [ -z "${GET_PREFIX_NAME}" ]; then
     dbug "I: Script: ${FUNCNAME[0]}: Cancelled"
     Script_Window
  fi
  
  # Check if user entered symbols
  SOURCE "winezgui-check-entry-text"
  winezgui-check-entry-text "${GET_PREFIX_NAME}"
  
  ENTRY_CHECK=$?
  if [ ${ENTRY_CHECK} -eq 1 ]; then
       dbug "I: Script: ${FUNCNAME[0]}: Symbols used in filename, cancelling!"
       return 1
  fi
  


  # 2. replace " " with "_" (underscore)
  NEWPREFIXNAME=$(echo ${GET_PREFIX_NAME}|tr " " "_")
  
  
  # 3. If a prefix with given name already exist, inform
  if [ -d "${PREFIXES_DIR}/${NEWPREFIXNAME}" ]; then
       ${ZENITY_CMD} --error --title="Directory Already Exists!" \
              --text="Cannot change ${PREFIXNAME} to ${NEWPREFIXNAME}"
              
       dbug "I: Script: ${FUNCNAME[0]}: Cannot change to ${NEWPREFIXNAME}"
       dbug "I: Script: ${FUNCNAME[0]}: Directory ${PREFIXNAME} Already Exists!"
       Script_Window
  fi

  # 4. Create Variables for replacement
  NEWPREFIXDIR="${PREFIXES_DIR}/${NEWPREFIXNAME}"
  NEW_EXE_FILE="$(echo ${EXE_FILE}|sed "s|${PREFIXDIR}|${NEWPREFIXDIR}|g; t;")"
  NEW_EXE_FILE="${NEW_EXE_FILE}"
  NEW_EXE_PATH="$(dirname "${NEW_EXE_FILE}")"

  # 5.  Replace PREFIX values inside files
  # 5.1 If gamedir is outside prefix, do not change EXE path on renaming prefix
  # Keep EXE: FILE, PATH, NAME, NOSP when they are outside prefix
  # if not exe_path inside exe_file = if exe_file not inside prefixdir
  if ! [[ "${EXE_FILE}" == *"${PREFIXDIR}"* ]] ; then
          dbug "I: Script: ${FUNCNAME[0]}: Game directory is outside prefix!"
          sed "s|${EXE_FILE}|XOEXE_FILEXO|g; t;" -i "${PREFIXDIR}/${INFOFILE}"    || echo "Failed1:${FUNCNAME[0]}"
          sed "s|${EXE_FILE}|XOEXE_FILEXO|g; t;" -i "${PREFIXDIR}/${SCRIPTFILE}"  || echo "Failed2:${FUNCNAME[0]}"
          sed "s|${EXE_FILE}|XOEXE_FILEXO|g; t;" -i "${PREFIXDIR}/${DESKTOPFILE}" || echo "Failed3:${FUNCNAME[0]}"

          sed "s|${EXE_PATH}|XOEXE_PATHXO|g; t;" -i "${PREFIXDIR}/${INFOFILE}"    || echo "Failed4:${FUNCNAME[0]}"
          sed "s|${EXE_PATH}|XOEXE_PATHXO|g; t;" -i "${PREFIXDIR}/${SCRIPTFILE}"  || echo "Failed5:${FUNCNAME[0]}"
          sed "s|${EXE_PATH}|XOEXE_PATHXO|g; t;" -i "${PREFIXDIR}/${DESKTOPFILE}" || echo "Failed6:${FUNCNAME[0]}"

          sed "s|${EXE_NAME}|XOEXE_NAMEXO|g; t;" -i "${PREFIXDIR}/${INFOFILE}"    || echo "Failed7:${FUNCNAME[0]}"
          sed "s|${EXE_NAME}|XOEXE_NAMEXO|g; t;" -i "${PREFIXDIR}/${SCRIPTFILE}"  || echo "Failed8:${FUNCNAME[0]}"
          sed "s|${EXE_NAME}|XOEXE_NAMEXO|g; t;" -i "${PREFIXDIR}/${DESKTOPFILE}" || echo "Failed9:${FUNCNAME[0]}"

          sed "s|${EXE_NOSP}|XOEXE_NOSPXO|g; t;" -i "${PREFIXDIR}/${INFOFILE}"    || echo "Failed10:${FUNCNAME[0]}"
          sed "s|${EXE_NOSP}|XOEXE_NOSPXO|g; t;" -i "${PREFIXDIR}/${SCRIPTFILE}"  || echo "Failed11:${FUNCNAME[0]}"
          sed "s|${EXE_NOSP}|XOEXE_NOSPXO|g; t;" -i "${PREFIXDIR}/${DESKTOPFILE}" || echo "Failed12:${FUNCNAME[0]}"
  fi

  # 5.2 Replace PREFIX values inside .desktop, .txt and .sh files
  # Main Replacement
  
  NEWSCRIPTFILE="${NEWPREFIXDIR}/${NEWPREFIXNAME}.sh"
  NEWICONFILE="${NEWPREFIXDIR}/${NEWPREFIXNAME}.png"
  NEWDESKTOPFILE="${NEWPREFIXDIR}/${NEWPREFIXNAME}.desktop"
  NEWINFOFILE="${NEWPREFIXDIR}/Info.yml"
 
  # 5.2.1 Replace in .desktop file
  
  sed "s|${SCRIPTFILE}|${NEWSCRIPTFILE}|g; t;"    -i "${DESKTOPFILE}" || echo "Failed13:${FUNCNAME[0]}"
  sed "s|${ICONFILE}|${NEWICONFILE}|g; t;"        -i "${DESKTOPFILE}" || echo "Failed14:${FUNCNAME[0]}"
  sed "s|${INFOFILE}|${NEWINFOFILE}|g; t;"        -i "${DESKTOPFILE}" || echo "Failed15:${FUNCNAME[0]}"
  
  # 5.3 Replace in Info.yml
  sed "s|${SCRIPTFILE}|${NEWSCRIPTFILE}|g; t;"    -i "${INFOFILE}" || echo "Failed16:${FUNCNAME[0]}"
  sed "s|${ICONFILE}|${NEWICONFILE}|g; t;"        -i "${INFOFILE}" || echo "Failed17:${FUNCNAME[0]}"
  sed "s|${DESKTOPFILE}|${NEWDESKTOPFILE}|g; t;"  -i "${INFOFILE}" || echo "Failed18:${FUNCNAME[0]}"
  sed "s|${EXE_FILE}|${NEW_EXE_FILE}|g; t;"       -i "${INFOFILE}" || echo "Failed19:${FUNCNAME[0]}"
  sed "s|${INFOFILE}|${NEWINFOFILE}|g; t;"        -i "${INFOFILE}" || echo "Failed20:${FUNCNAME[0]}"

  # 5.3 Change in Script FIle
  sed "s|${SCRIPTFILE}|${NEWSCRIPTFILE}|g; t;"    -i "${SCRIPTFILE}" || echo "Failed21:${FUNCNAME[0]}"
  sed "s|${ICONFILE}|${NEWICONFILE}|g; t;"        -i "${SCRIPTFILE}" || echo "Failed22:${FUNCNAME[0]}"
  sed "s|${DESKTOPFILE}|${NEWDESKTOPFILE}|g; t;"  -i "${SCRIPTFILE}" || echo "Failed23:${FUNCNAME[0]}"
  sed "s|${INFOFILE}|${NEWINFOFILE}|g; t;"        -i "${SCRIPTFILE}" || echo "Failed24:${FUNCNAME[0]}"
  
  ########################### FIX ME SECTION #############################
  # Change Variables inside Script file which has PREFIXNAME
  # 5.4 Change export PREFIXNAME= Variable to new prefix name value
  # 5.4.1 Change Values inside Script file
  S_PREFIXDIR="^export PREFIXDIR=.*"
  R_PREFIXDIR="export PREFIXDIR=\"${NEWPREFIXDIR}\""
  sed "s|${S_PREFIXDIR}|${R_PREFIXDIR}|g; t;"     -i "${SCRIPTFILE}" || echo "Failed25:${FUNCNAME[0]}"
  
  S_PREFIXNAME="^export PREFIXNAME=.*"
  R_PREFIXNAME="export PREFIXNAME=\"${NEWPREFIXNAME}\""
  sed "s|${S_PREFIXNAME}|${R_PREFIXNAME}|g; t;"   -i "${SCRIPTFILE}" || echo "Failed26:${FUNCNAME[0]}" 

  S_WINEZGUI_SCRIPTS="^export WINEZGUI_SCRIPTS=.*"
  R_WINEZGUI_SCRIPTS="export WINEZGUI_SCRIPTS=\"${NEWPREFIXDIR}/winezgui-scripts\""
  sed "s|${S_WINEZGUI_SCRIPTS}|${R_WINEZGUI_SCRIPTS}|g; t;"  -i "${SCRIPTFILE}" || echo "Failed27:${FUNCNAME[0]}"

  S_WINEPREFIX="^export WINEPREFIX=.*"
  R_WINEPREFIX="export WINEPREFIX=\"${NEWPREFIXDIR}\""
  sed "s|${S_WINEPREFIX}|${R_WINEPREFIX}|g; t;"   -i "${SCRIPTFILE}" || echo "Failed28:${FUNCNAME[0]}"
  
  S_EXE_FILE="^export EXE_FILE=.*"
  R_EXE_FILE="export EXE_FILE=\"${NEW_EXE_FILE}\""
  sed "s|${S_EXE_FILE}|${R_EXE_FILE}|g; t;"       -i "${SCRIPTFILE}" || echo "Failed29:${FUNCNAME[0]}"

  S_EXE_PATH="^export EXE_PATH=.*"
  R_EXE_PATH="export EXE_PATH=\"${NEW_EXE_PATH}\""
  sed "s|${S_EXE_PATH}|${R_EXE_PATH}|g; t;"       -i "${SCRIPTFILE}" || echo "Failed30:${FUNCNAME[0]}"
  
  # 5.4.2 Change values inside Info.yml
  # 5.4.2.1 Change Script file value in Info.yml
  #Game Prefix    : /home/rizvan/.local/share/winezgui/PREFIXNAME
  S_INFO_PREFIXDIR="Prefix:.*"
  R_INFO_PREFIXDIR="Prefix:${NEWPREFIXDIR}"
  sed "s|${S_INFO_PREFIXDIR}|${R_INFO_PREFIXDIR}|g; t;"  -i "${INFOFILE}" || echo "Failed31:${FUNCNAME[0]}"

  #Exe Path:/home/rizvan/GAMEDIR  
  S_GAME_DIRECTORY="Exe Path:.*"
  R_GAME_DIRECTORY="Exe Path:${NEW_EXE_PATH}"
  sed "s|${S_GAME_DIRECTORY}|${R_GAME_DIRECTORY}|g; t;"  -i "${INFOFILE}" || echo "Failed32:${FUNCNAME[0]}"




  # 5.5 Restore EXE: FILE, PATH, NAME, NOSP, after main changes above
  if ! [[ "${EXE_FILE}" == *"${PREFIXDIR}"* ]] ; then
          
          sed "s|XOEXE_FILEXO|${EXE_FILE}|g; t;" -i "${PREFIXDIR}/${INFOFILE}"    || echo "Failed33:${FUNCNAME[0]}"
          sed "s|XOEXE_FILEXO|${EXE_FILE}|g; t;" -i "${PREFIXDIR}/${SCRIPTFILE}"  || echo "Failed34:${FUNCNAME[0]}"
          sed "s|XOEXE_FILEXO|${EXE_FILE}|g; t;" -i "${PREFIXDIR}/${DESKTOPFILE}" || echo "Failed35:${FUNCNAME[0]}"
          sed "s|XOEXE_PATHXO|${EXE_PATH}|g; t;" -i "${PREFIXDIR}/${INFOFILE}"    || echo "Failed36:${FUNCNAME[0]}"
          sed "s|XOEXE_PATHXO|${EXE_PATH}|g; t;" -i "${PREFIXDIR}/${SCRIPTFILE}"  || echo "Failed37:${FUNCNAME[0]}"
          sed "s|XOEXE_PATHXO|${EXE_PATH}|g; t;" -i "${PREFIXDIR}/${DESKTOPFILE}" || echo "Failed38:${FUNCNAME[0]}"
          sed "s|XOEXE_NAMEXO|${EXE_NAME}|g; t;" -i "${PREFIXDIR}/${INFOFILE}"    || echo "Failed39:${FUNCNAME[0]}"
          sed "s|XOEXE_NAMEXO|${EXE_NAME}|g; t;" -i "${PREFIXDIR}/${SCRIPTFILE}"  || echo "Failed40:${FUNCNAME[0]}"
          sed "s|XOEXE_NAMEXO|${EXE_NAME}|g; t;" -i "${PREFIXDIR}/${DESKTOPFILE}" || echo "Failed41:${FUNCNAME[0]}"
          sed "s|XOEXE_NOSPXO|${EXE_NOSP}|g; t;" -i "${PREFIXDIR}/${INFOFILE}"    || echo "Failed42:${FUNCNAME[0]}"
          sed "s|XOEXE_NOSPXO|${EXE_NOSP}|g; t;" -i "${PREFIXDIR}/${SCRIPTFILE}"  || echo "Failed43:${FUNCNAME[0]}"
          sed "s|XOEXE_NOSPXO|${EXE_NOSP}|g; t;" -i "${PREFIXDIR}/${DESKTOPFILE}" || echo "Failed44:${FUNCNAME[0]}"
  fi
  
  # 6. Rename files having prefix as part of file name, with new prefix name 
  # check if the file exists before renaming
  RENAMED_ICON_FILE="${PREFIXES_DIR}/${PREFIXNAME}/${NEWPREFIXNAME}.png"
  RENAMED_SCRIPT_FILE="${PREFIXES_DIR}/${PREFIXNAME}/${NEWPREFIXNAME}.sh"
  RENAMED_DESK_FILE="${PREFIXES_DIR}/${PREFIXNAME}/${NEWPREFIXNAME}.desktop"
  
  # 6.1 Rename .png file
  if [ -f "${ICONFILE}" ]; then
       mv "${ICONFILE}" "${RENAMED_ICON_FILE}" && \
       dbug "I: Script: ${FUNCNAME[0]}: Renamed ${PREFIXNAME}.png ->" \
            "${NEWPREFIXNAME}.png"
  fi
  
  # 6.2 Rename .sh file
  if [ -f "${SCRIPTFILE}" ]; then
       mv "${SCRIPTFILE}" "${RENAMED_SCRIPT_FILE}" && \
      dbug "I: Script: ${FUNCNAME[0]}: Renamed ${PREFIXNAME}.sh ->" \
           "${NEWPREFIXNAME}.sh"
  fi
  
  # 6.3 Rename .desktop and .sh file
  if [ -f "${DESKTOPFILE}" ]; then
       mv "${DESKTOPFILE}" "${RENAMED_DESK_FILE}" && \
       echo  "I: Script: Rename: Prefix: Renamed ${PREFIXNAME}.desktop" \
             "-> ${NEWPREFIXNAME}.sh"
  fi
  
  # 6.4 Rename: Prefix Directory
  mv "${PREFIXDIR}" "${PREFIXES_DIR}/${NEWPREFIXNAME}" && \
  echo  "I: Script: Rename: Prefix: Renamed directory ${PREFIXNAME}" \
        "-> ${NEWPREFIXNAME}"


  # FIXME: Does this work???? ln or not required?
  # 7. Create new shortcut and delete old one
  # 7.1 link new .desktop file to desktop directory
  #ln -sf "${NEWDESKTOPFILE}" "${DEXSKTOPDIR}/${NEWPREFIXNAME}.desktop" && \
  #ln -sf "${NEWDESKTOPFILE}" "${APPLICATIONSDIR/${SHORTCUT_PREFIX}_${NEWPREFIXNAME}.desktop" && \
  dbug "I: Script: ${FUNCNAME[0]}: Created shortcut for ${NEWDESKTOPFILE}" \
         "at ${APPLICATIONSDIR}" 2>/dev/null || \
  echo   "E: Script: Rename: Prefix: Create Shortcut Failed!!!"
  
  # 7.3 update icon cache and desktop menu
  # Clean up broken shortcuts and update shortcuts menu
  SOURCE "winezgui-remove-broken-links"
  winezgui-remove-broken-links


  # Required for instant change in the GameWindow
  export PREFIXNAME="${NEWPREFIXNAME}"
  export PREFIXDIR="${NEWPREFIXDIR}"
  export SCRIPTFILE="${NEWSCRIPTFILE}"
  export ICONFILE="${NEWICONFILE}"
  export DESKTOPFILE="${NEWDESKTOPFILE}"
  dbug "I: Script: ${FUNCNAME[0]}: starting script from renamed dir"
  
  # set x permissions
  chmod +rx "${DESKTOPFILE}" "${SCRIPTFILE}" "${S_SCRIPTFILE}" "${S_DESKTOPFILE}" "${NEW_SCRIPT_FILE}" "${NEWDESKTOPFILE}" "${NEWSCRIPTFILE}"
  # 8. Launch Script from Renamed Directory
  "${NEWSCRIPTFILE}" &
  
  unset GET_PREFIX_NAME NEWPREFIXNAME NEWPREFIXDIR NEW_EXE_FILE NEW_EXE_PATH
  unset NEWSCRIPTFILE NEWICONFILE NEWDESKTOPFILE
  exit 0 
}
