#!/bin/bash

function error {
  echo -e "\e[91m$1\e[39m"
  exit 1
}

#avoid changing current directory before determining DIRECTORY.
# this broke installation to custom folder if running install script with relative paths
#  if pi-apps is already downloaded to ~/.pi-apps, and PWD=.pi-apps, and this script is run as ./install instead of ~/.pi-apps/install:
#   cd $HOME would later cause DIRECTORY check to fail and trigger fresh download to ~/pi-apps
#    However cd $HOME is necessary to prevent error: shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
DIRECTORY="$(readlink -f "$(dirname "$0")")"
cd "$HOME"

#ensure non-root
if [[ "$(id -u)" == 0 ]]; then
  error "Pi-Apps is not designed to be installed as root! Please try again as a regular user."
fi

#ensure debian
command -v apt >/dev/null || error "apt: command not found. Most likely this system is not running Debian."

#Ensure running arm processor
if uname -m | grep -qi 'x86\|i686\|i386' ;then
  error "Pi-Apps is not supported on non-ARM CPU architectures. We encourage you to use your distro's app store, like Gnome Software or Discover Software Center."
fi

sudo apt update || error "The command 'sudo apt update' failed. Before Pi-Apps will work, you must fix your apt package-management system."

#install dependencies
package_available_installer() { #determine if the specified package-name exists in a local repository for the current dpkg architecture (simplified and renamed for installer use only)
  local package="$(awk -F: '{print $1}' <<<"$1")"
  dpkg_arch="$(dpkg --print-architecture)"
  [ -z "$package" ] && error "package_available(): no package name specified!"
  local output="$(apt-cache policy "$package":"$dpkg_arch" | grep "Candidate:")"
  if [ -z "$output" ]; then
    return 1
  elif echo "$output" | grep -q "Candidate: (none)"; then
    return 1
  else
    return 0
  fi
}

dependencies='yad curl wget aria2 lsb-release apt-utils apt-transport-https gnupg imagemagick bc librsvg2-bin locales shellcheck git wmctrl xdotool x11-utils rsync unzip debsums libgtk3-perl bzip2 zstd binutils'

if package_available_installer software-properties-common ; then
  dependencies+=' software-properties-common'
fi

if ! dpkg -s $dependencies &>/dev/null ;then
  sudo apt install $dependencies -y -f --no-install-recommends || error "Pi-Apps dependencies failed to install and so the Pi-Apps install has been aborted. Before Pi-Apps can be installed you must solve any errors above."
fi

#remove annoying "YAD icon browser" launcher
sudo rm -f /usr/share/applications/yad-icon-browser.desktop

#download pi-apps if folder missing
if [ -z "$DIRECTORY" ] || [ "$DIRECTORY" == "$HOME" ] || [ "$DIRECTORY" == bash ] || [ ! -f "${DIRECTORY}/api" ] || [ ! -f "${DIRECTORY}/gui" ];then
  DIRECTORY="$HOME/pi-apps"
fi
downloaded=0 #track if pi-apps was downloaded this time

#Re-download pi-apps folder in all cases if pi-apps already exists
#users expect to use the install script to "restore" a working pi-apps install in incase their local version is somehow not working or corrupted
if [ -d "$DIRECTORY" ];then    
  rm -rf ~/pi-apps-forced-update
  
  echo "Reinstalling Pi-Apps..."
  downloaded=1
  output="$(git clone --depth 1 https://github.com/Botspot/pi-apps ~/pi-apps-forced-update 2>&1)"
  if [ $? != 0 ] || [ ! -d "$DIRECTORY" ];then
    error "Pi-Apps download failed!\ngit clone output was: $output"
  fi
  cp -af "${DIRECTORY}/data" ~/pi-apps-forced-update
  cp -af "${DIRECTORY}/apps" ~/pi-apps-forced-update
  rm -rf "$DIRECTORY"
  mv -f ~/pi-apps-forced-update "$DIRECTORY"
  
#if pi-apps folder does not exist, download it
elif [ ! -d "$DIRECTORY" ];then
  echo "Downloading Pi-Apps..."
  downloaded=1
  output="$(git clone --depth 1 https://github.com/Botspot/pi-apps "$DIRECTORY" 2>&1)"
  if [ $? != 0 ] || [ ! -d "$DIRECTORY" ];then
    error "Pi-Apps download failed!\ngit clone output was: $output"
  fi
  #click new installation analytics link
  "${DIRECTORY}/api" shlink_link script install
fi

#Past this point, DIRECTORY variable populated with valid pi-apps directory

#if ChromeOS, install lxterminal
if command -v garcon-terminal-handler >/dev/null ;then
  echo "In order to install apps on ChromeOS, a working terminal emulator is required.
Installing lxterminal in 10 seconds... (press Ctrl+C to cancel)"
  sleep 10
  sudo apt install -yf lxterminal || error "Failed to install lxterminal on ChromeOS!"
fi

#menu button
if [ ! -f ~/.local/share/applications/pi-apps.desktop ];then
  echo "Creating menu button..."
fi
mkdir -p ~/.local/share/applications
if [ -f /etc/xdg/menus/lxde-pi-applications.menu ] || [ -f /etc/xdg/menus/rpd-applications.menu ];then #If on PiOS, place launcher in Accessories as it has always been there and is more intuitive there
echo "[Desktop Entry]
Name=Pi-Apps
Comment=Raspberry Pi App Store for open source projects
Exec=${DIRECTORY}/gui
Icon=${DIRECTORY}/icons/logo.png
Terminal=false
StartupWMClass=Pi-Apps
Type=Application
Categories=Utility
StartupNotify=true" > ~/.local/share/applications/pi-apps.desktop
else #if not on PiOS, place launcher in Preferences to match the wider decision of putting app installers there (see PR #2388)
echo "[Desktop Entry]
Name=Pi-Apps
Comment=Raspberry Pi App Store for open source projects
Exec=${DIRECTORY}/gui
Icon=${DIRECTORY}/icons/logo.png
Terminal=false
StartupWMClass=Pi-Apps
Type=Application
Categories=Utility;System;PackageManager;
StartupNotify=true" > ~/.local/share/applications/pi-apps.desktop
fi
chmod 755 ~/.local/share/applications/pi-apps.desktop
gio set ~/.local/share/applications/pi-apps.desktop "metadata::trusted" true

#copy menu button to Desktop
mkdir -p ~/Desktop
cp -f ~/.local/share/applications/pi-apps.desktop ~/Desktop/

chmod 755 ~/Desktop/pi-apps.desktop
gio set ~/Desktop/pi-apps.desktop "metadata::trusted" true

#copy icon to local icons directory (necessary on some wayland DEs like on PiOS Wayfire)
mkdir -p ~/.local/share/icons
cp -f ${DIRECTORY}/icons/logo.png ~/.local/share/icons/pi-apps.png
cp -f ${DIRECTORY}/icons/settings.png ~/.local/share/icons/pi-apps-settings.png

#settings menu button
if [ ! -f ~/.local/share/applications/pi-apps-settings.desktop ];then
  echo "Creating Settings menu button..."
fi
echo "[Desktop Entry]
Name=Pi-Apps Settings
Comment=Configure Pi-Apps or create an App
Exec=${DIRECTORY}/settings
Icon=${DIRECTORY}/icons/settings.png
Terminal=false
StartupWMClass=Pi-Apps-Settings
Type=Application
Categories=Settings;
StartupNotify=true" > ~/.local/share/applications/pi-apps-settings.desktop

if [ ! -f ~/.config/autostart/pi-apps-updater.desktop ];then
  echo "Creating autostarted updater..."
fi
mkdir -p ~/.config/autostart
echo "[Desktop Entry]
Name=Pi-Apps Updater
Exec=${DIRECTORY}/updater onboot
Icon=${DIRECTORY}/icons/logo.png
Terminal=false
StartupWMClass=Pi-Apps
Type=Application
X-GNOME-Autostart-enabled=true
Hidden=false
NoDisplay=false" > ~/.config/autostart/pi-apps-updater.desktop

mkdir -p "${DIRECTORY}/data/status" "${DIRECTORY}/data/update-status" \
  "${DIRECTORY}/data/preload" "${DIRECTORY}/data/settings" \
  "${DIRECTORY}/data/status" "${DIRECTORY}/data/update-status" \
  "${DIRECTORY}/data/categories"

#pi-apps terminal command
if [ ! -f /usr/local/bin/pi-apps ] || ! cat /usr/local/bin/pi-apps | grep -q "${DIRECTORY}/gui" ;then
  echo "#!/bin/bash
${DIRECTORY}/gui"' "$@"' | sudo tee /usr/local/bin/pi-apps >/dev/null
  sudo chmod +x /usr/local/bin/pi-apps
fi

#check if system is broken
errors="$("${DIRECTORY}/api" is_supported_system)" || error "$errors"

if "${DIRECTORY}/api" package_installed coreutils-from-uutils; then
  sudo apt-get -o DPkg::Lock::Timeout=-1 install coreutils-from-gnu coreutils-from-uutils- --allow-remove-essential -y
  # force re-generate any preloaded files
  rm -rf ${DIRECTORY}/data/preload/*
fi

#preload app list
if [ ! -f "$DIRECTORY/data/preload/LIST-" ];then
  echo "Preloading app list..."
fi
"${DIRECTORY}/preload" yad &>/dev/null

#Run runonce entries
"${DIRECTORY}/etc/runonce-entries" &>/dev/null

#Determine message of the day. If announcements file missing or over a day old, download it.
if [ ! -f "${DIRECTORY}/data/announcements" ] || [ ! -z "$(find "${DIRECTORY}/data/announcements" -mtime +1 -print)" ]; then
  wget https://raw.githubusercontent.com/Botspot/pi-apps-announcements/main/message -qO "${DIRECTORY}/data/announcements"
fi

if [ $downloaded == 1 ];then
  echo "Installation complete. Pi-Apps can be launched from the start menu or by running the command 'pi-apps'."
  echo "Further explanation for how to use Pi-Apps can be found on our getting started webpage: https://pi-apps.io/wiki/getting-started/running-pi-apps/"
else
  echo -e "Please note that Pi-Apps has NOT been freshly downloaded, because $DIRECTORY already exists."
fi
