#!/bin/bash
export PATH="${PATH}:/app/bin"

# Defaults for non flatpak install
APPLICATIONSDIR='\$(realpath -m \~/.local/share/applications)\'
WINE_CMD=$(which wine)
WINETRICKS_CMD=$(which winetricks)
WINEZGUIDIR='\$(realpath -m \~/.local/share/winezgui)'
TEMPDIR="\$(realpath -m  \~/.local/share/winezgui/tmp)"
INSTALL_TYPE="system"

# Flatpak name should be used to kill, and run from launch script.
FLATPAK_NAME="${FLATPAK_ID}" # set flatpak name

# Get version form VERSION.txt
APPVERSION=$(cat ./VERSION.txt)


# Function Show help
ShowHelp ()
{
  echo "Setup file for WineZGUI scripts"
  echo "Usage:"
  echo "$0 --install | --uninstall"
  echo ""
  echo "Options:"
  echo "-i, --install            Install WineZGUI to default prefix"
  echo "-u, --uninstall          Remove previously installed WinzeGUI"
  echo "-p, --prefix=            Install to user specified prefix"
  echo "-f, --flatpak            Install flatpak specific WineZGUI"
  echo "-d, --deps               Show runtime dependencies"
  echo "-fid=, --flatpak-id=     Use $FLATPAK_ID inside flatpak-builder"
  echo ""
  echo "Examples:"
  echo "$0 --deps"
  echo "$0 --install"
  echo "$0 --install --prefix=/usr"
  echo "$0 --install --prefix=/usr/local"
  echo "$0 --install --flatpak --prefix=/app"

}

# If no arguments are given show help
if [ $# -eq 0 ];  then
  ShowHelp
  exit
fi

# parse command line arguments
for i in "$@"
do
case $i in
    -p=*|--prefix=*)
    INSTALL_PREFIX="${i#*=}"
    ;;
    -f|--flatpak)
    FLATPAK="true"
    ;;
    -fid=*|--flatpak-id=*)
    FLATPAK_NAME="${i#*=}"
    ;;
    -i|--install)
    INSTALL="true"
    ;;
    -u|--uninstall)
    UNINSTALL="true"
    ;;
    -d|--deps)
    DEPENDENCIES="true"
    ;;
    -h|--help)
    ShowHelp
    exit
    ;;
    *)
    ShowHelp       # unknown option
    exit
    ;;
esac
done


# If prefix=nothing then install to /usr
if [ -z "${INSTALL_PREFIX}" ]; then
     INSTALL_PREFIX="/usr"
fi

# Flatpak Specific Commands and Variables
if [ "${FLATPAK}" = "true" ]; then
     echo setting prefix and paths for flatpak
     INSTALL_PREFIX="/app"
     TEMPDIR="\$(realpath -m \~/.var/app/${FLATPAK_NAME}/data/tmp)"
     WINEZGUIDIR="\$(realpath -m \~/.var/app/${FLATPAK_NAME}/data/winezgui)"
     INSTALL_TYPE=\"flatpak\"
fi


RESOURCES="./resources"
ASSETS="./assets"
BINDIR="./bin"
MODULES="${RESOURCES}/modules"
APPDATA="${RESOURCES}/appdata/"
# Files to install
APP01_SRC="${BINDIR}/winezgui"
APP02_SRC="${BINDIR}/mf-install"
APP03_SRC="${MODULES}/winezgui-create-prefix"

DESK_SRC="${RESOURCES}/shortcut/io.github.fastrizwaan.WineZGUI.desktop"
MIME_SRC="${RESOURCES}/mimetype/winezgui-wzt.xml"
ICON_SRC="${ASSETS}/io.github.fastrizwaan.WineZGUI.svg"
META_SRC="${APPDATA}/io.github.fastrizwaan.WineZGUI.metainfo.xml"

#MIME_ICO1="application-x-wzt.svg"
#MIME_ICO2="gnome-mime-application-x-wzt.svg"

# Basename
APP01=$(basename $APP01_SRC)
APP02=$(basename $APP02_SRC)
APP03=$(basename $APP03_SRC)


DESK=$(basename $DESK_SRC)
MIME=$(basename $MIME_SRC)
ICON=$(basename $ICON_SRC)
META=$(basename $META_SRC)


# Target Directory to install
APPS_DIR="${INSTALL_PREFIX}/bin"
DATA_DIR="${INSTALL_PREFIX}/share/winezgui"
DESK_DIR="${INSTALL_PREFIX}/share/applications"
MIME_DIR="${INSTALL_PREFIX}/share/mime/packages"
ICON_DIR="${INSTALL_PREFIX}/share/icons/hicolor/scalable/apps"
META_DIR="${INSTALL_PREFIX}/share/metainfo"
#MIME_ICO="${INSTALL_PREFIX}/share/icons/hicolor/32x32/mimetypes"

# If Install is selected
if [ "${INSTALL}" = "true"  ]
     then
     # Create required Directories
     mkdir -p $APPS_DIR
     mkdir -p $DATA_DIR
     mkdir -p $DESK_DIR
     mkdir -p $MIME_DIR
     mkdir -p $ICON_DIR
     mkdir -p $META_DIR
     #mkdir -p $MIME_ICO

     # Install the files
     echo Installing...
     install -Dm755 $APP01_SRC $APPS_DIR && echo "Installed '$APPS_DIR/$APP01'"
     install -Dm755 $APP02_SRC $APPS_DIR && echo "Installed '$APPS_DIR/$APP02'"
     install -Dm755 $APP03_SRC $DATA_DIR && echo "Installed '$DATA_DIR/$APP03'"
     
     # Install all modules
     SAVEIFS=${IFS}
     IFS=$(echo -en "\n\b")
     for i in $(ls "${MODULES}"); do 
     MODULE_NAME=$(basename "${i}")
     MODULE="${MODULES}/${i}"
     
     install -Dm755 $MODULE $DATA_DIR && echo "Installed '$DATA_DIR/$MODULE_NAME'"
     done

     IFS=${SAVEIFS}
     install -Dm644 $DESK_SRC $DESK_DIR  && echo "Installed '$DESK_DIR/$DESK'"
     install -Dm644 $MIME_SRC $MIME_DIR  && echo "Installed '$MIME_DIR/$MIME'"
     install -Dm644 $ICON_SRC $ICON_DIR  && echo "Installed '$ICON_DIR/$ICON'"
     install -Dm644 $META_SRC $META_DIR  && echo "Installed '$META_DIR/$META'"

     ## mimetype icon same as application icon
     #install -Dm644 $ICON_SRC $MIME_ICO/$MIME_ICO1 && \
     #               echo "Installed '$MIME_ICO/$MIME_ICO1'"

     #install -Dm644 $ICON_SRC $MIME_ICO/$MIME_ICO2 && \
     #               echo "Installed '$MIME_ICO/$MIME_ICO2'"




     # Update mime and desktop paths
     update-mime-database "${INSTALL_PREFIX}/share/mime" &
     update-desktop-database "${DESK_DIR}" &
     gtk-update-icon-cache --ignore-theme-index "${INSTALL_PREFIX}/share/icons" \
                           2>/dev/null &

     # Change Variables in winezgui and winezgui-create-prefix scripts
     # for system or flatpak install
     sed "s|DATADIR=/usr|DATADIR=$INSTALL_PREFIX|"           -i "$APPS_DIR/$APP01"
     sed "s|WINEZGUIDIR=.*|WINEZGUIDIR=\"$WINEZGUIDIR\"|"    -i "$APPS_DIR/$APP01"
     sed "s|APPVERSION=.*|APPVERSION=\"$APPVERSION\"|"       -i "$APPS_DIR/$APP01"
     sed "s|INSTALL_TYPE=.*|INSTALL_TYPE=\"$INSTALL_TYPE\"|" -i "$APPS_DIR/$APP01"
     sed "s|FLATPAK_NAME=.*|FLATPAK_NAME=\"$FLATPAK_NAME\"|" -i "$APPS_DIR/$APP01"

     sed "s|WINEZGUIDIR=.*|WINEZGUIDIR=\"$WINEZGUIDIR\"|"    -i "$APPS_DIR/$APP02"
     sed "s|TEMPDIR=.*|TEMPDIR=\"$TEMPDIR\"|"                -i "$APPS_DIR/$APP02"

     sed "s|DATADIR=/usr|DATADIR=$INSTALL_PREFIX|"           -i "$DATA_DIR/$APP03"
     sed "s|TEMPDIR=.*|TEMPDIR=\"$TEMPDIR\"|"                -i "$DATA_DIR/$APP03"
     sed "s|WINEZGUIDIR=.*|WINEZGUIDIR=\"$WINEZGUIDIR\"|"    -i "$DATA_DIR/$APP03"
     sed "s|INSTALL_TYPE=.*|INSTALL_TYPE=\"$INSTALL_TYPE\"|" -i "$DATA_DIR/$APP03"
     sed "s|APPVERSION=.*|APPVERSION=\"$APPVERSION\"|"       -i "$DATA_DIR/$APP03"
     sed "s|FLATPAK_NAME=.*|FLATPAK_NAME=\"$FLATPAK_NAME\"|" -i "$DATA_DIR/$APP03"

#     sed "s|INSTALL_TYPE=.*|INSTALL_TYPE=\"$INSTALL_TYPE\"|" -i $DATA_DIR/$APP04
     # Create uninstall script for later removal
     
     echo "rm -vf $APPS_DIR/$APP01" >  ./uninstall
     echo "rm -vf $APPS_DIR/$APP02" >> ./uninstall
     echo "rm -vf $DATA_DIR/$APP03" >> ./uninstall
     
     SAVEIFS=${IFS}
     IFS=$(echo -en "\n\b")
     for i in $(ls "${MODULES}"); do 

     echo "rm -vf $DATA_DIR/$i" >> ./uninstall
     done
     IFS=${SAVEIFS}
     
     echo "rm -vf $DESK_DIR/$DESK" >> ./uninstall
     echo "rm -vf $MIME_DIR/$MIME" >> ./uninstall
     echo "rm -vf $ICON_DIR/$ICON" >> ./uninstall
     echo "rm -vf $META_DIR/$META" >> ./uninstall
     #echo "rm -vf $MIME_ICO/$MIME_ICO1" >> ./uninstall
     #echo "rm -vf $MIME_ICO/$MIME_ICO2" >> ./uninstall
     echo "rmdir  $DATA_DIR && echo removed '${DATA_DIR}'" >> ./uninstall


# For --uninstall, if already installed then uninstall else skip
elif [ "${UNINSTALL}" = "true" ]; then
       if [ -f ./uninstall ]; then
            echo "Uninstalling..."
            sh ./uninstall
            rm ./uninstall
       else
            echo "Not installed. "
       fi
fi

if [ "${DEPENDENCIES}" = "true" ]; then

     # Function to print if dependencies are installed.
     FOUND=()    # Array/list to hold all found commands
     NOTFOUND=() # Array/list to hold all not found commands

     RUNTIME="wine icotool exiftool zenity gnome-terminal zstd"

     for i in $RUNTIME ; do
         if ! [ -x "$(command -v $i)" ]; then
                NOTFOUND+=("$i")
                NOTFOUND+=(" ")
         elif [ -x "$(command -v $i)" ]; then
                FOUND+=$i
                FOUND+=(" ")
         fi
     done

     # Show found and not found dependencies for WineZGUI
     echo "Dependencies..."

     # If NOTFOUND variable has a value
     if ! [ -z "$NOTFOUND" ]; then
          echo "Found    : $FOUND"
          echo "Not Found: $NOTFOUND"
     else
          echo "$RUNTIME"
          echo "Found all dependencies"

     fi
fi


