#!/bin/bash

#This script contains various dirty fixes to keep Pi-Apps running smoothly as it matures.
#It repairs mistakes that some apps have made, as well as fixing other system issues. Some apps have been removed or renamed.

#This script is executed by the updater script as well as the main Pi-Apps installation script.

#This script uses the 'runonce' function - it avoids running any of these fixes more than once.
#If a runonce entry is modified, then it will be run once more.

#Set DIRECTORY variable if necessary
if [ -z "$DIRECTORY" ];then
  DIRECTORY="$(readlink -f "$(dirname "$(dirname "$0")")")"
fi

#Get pi-apps api functions if necessary
if ! command -v runonce >/dev/null ;then
  set -a #make all functions in the api available to subprocesses
  source "${DIRECTORY}/api"
fi

#add ~/Desktop /opt /usr/local/bin and /usr/local/share/applications if not present
runonce <<"EOF"
  if [ -f "$HOME/Desktop" ]; then
    rm -f "$HOME/Desktop"
    mkdir -p "$HOME/Desktop"
  elif [ ! -d "$HOME/Desktop" ]; then
    mkdir -p "$HOME/Desktop"
  fi
  if [ ! -d /opt ]; then
    sudo_popup mkdir /opt
  fi
  if [ ! -d /usr/local/bin ]; then
    sudo_popup mkdir -p /usr/local/bin
  fi
  if [ ! -d /usr/local/share/applications ]; then
    sudo_popup mkdir -p /usr/local/share/applications
  fi
  #Pi-Apps tries to avoid unnecessary reboots at all cost. desktop launchers can be installed to /usr/local/share/applications, which is often not searched by default if /usr/local/share did not exist on boot.
  #This path is added to $XDG_DATA_DIRS on the next reboot, but we don't want to wait for that!
  #If XDG_DATA_DIRS is missing /usr/local/share, then bind-mount /usr/local/share/applications to /usr/share/applications
  if [[ "$XDG_DATA_DIRS" != */usr/local/share* ]] && [ -z "$(ls /usr/share/applications/usr-local-temporary)" ];then
    sudo_popup mkdir -p /usr/share/applications/usr-local-temporary
    sudo_popup mount --bind /usr/local/share/applications /usr/share/applications/usr-local-temporary
  fi
EOF

#generate settings
runonce <<"EOF"
  if [ "$(ls "$DIRECTORY/data/settings" 2>/dev/null | wc -l)" -le 2 ];then
    "${DIRECTORY}/settings" refresh
  fi
EOF

#regenerate package-app status for one-time migration
runonce <<"EOF"
  IFS=$'\n'
  for app in $(list_apps package) ;do
    rm -f "${DIRECTORY}/data/status/${app}" || exit 1
  done
  
  refresh_all_pkgapp_status
EOF

# remove deprecated apps (only when running in a visible terminal)
case $(ps -o stat= -p $$) in
  *+*) # Running in foreground
runonce <<"EOF"
  #remove deprecated apps
  remove_deprecated_app "FreeCAD (precompiled)"
  remove_deprecated_app "Chromium Media Edition"
  remove_deprecated_app "Cordless"
  remove_deprecated_app "Retropie"
  remove_deprecated_app "Raspi2png"
  remove_deprecated_app "Falkon"
  remove_deprecated_app "FreeCAD"
  remove_deprecated_app "LinuxCNC"
  remove_deprecated_app "Steam" "32"
  remove_deprecated_app "Cawbird"
  remove_deprecated_app "Email Checker"
  remove_deprecated_app "Pi-Apps Terminal Plugin (python)"
  remove_deprecated_app "Sysmon"
  remove_deprecated_app "BlockPi"
  remove_deprecated_app "TBOPlayer"
EOF
  ;;
esac

#remove old apps and migrate chromium downgrading apps to the new "Downgrade Chromium" app
runonce <<"EOF"
  #rework chromium downgrading apps to one single new app: 'Downgrade Chromium'
  rm -rf "${DIRECTORY}/apps/Back to Chromium v86"
  rm -rf "${DIRECTORY}/apps/Back to Chromium v78"
  if [ "$(cat "${DIRECTORY}/data/status/Back to Chromium v78" 2>/dev/null)" == installed ] || [ "$(cat "${DIRECTORY}/data/status/Back to Chromium v86" 2>/dev/null)" == installed ];then
    echo "installed" > "${DIRECTORY}/data/status/Downgrade Chromium"
  fi
  
  #rename 'Turbo Scratch' app to 'Turbowarp'
  rm -rf "${DIRECTORY}/apps/Turbo Scratch"
  mv -f "${DIRECTORY}/data/status/Turbo Scratch" "${DIRECTORY}/data/status/Turbowarp" 2>/dev/null
  
  #rename 'Pi-Apps Terminal Plugin' app to 'Pi-Apps Terminal Plugin (python)'
  rm -rf "${DIRECTORY}/apps/Pi-Apps Terminal Plugin"
  mv -f "${DIRECTORY}/data/status/Pi-Apps Terminal Plugin" "${DIRECTORY}/data/status/Pi-Apps Terminal Plugin (python)" 2>/dev/null
  
  #rename 'Whatsapp' app to 'WhatsApp'
  rm -rf "${DIRECTORY}/apps/Whatsapp"
  mv -f "${DIRECTORY}/data/status/Whatsapp" "${DIRECTORY}/data/status/WhatsApp" 2>/dev/null
  
  #rename 'Sonic Pi 3.2' to 'Sonic Pi'
  rm -rf "${DIRECTORY}/apps/Sonic Pi 3.2"
  mv -f "${DIRECTORY}/data/status/Sonic Pi 3.2" "${DIRECTORY}/data/status/Sonic Pi" 2>/dev/null
  
  
  #rename 'Min Browser' to 'Min'
  rm -rf "${DIRECTORY}/apps/Min Browser"
  mv -f "${DIRECTORY}/data/status/Min Browser" "${DIRECTORY}/data/status/Min" 2>/dev/null
  
  #rename 'Pale Moon Browser' to 'Pale Moon'
  rm -rf "${DIRECTORY}/apps/Pale Moon Browser"
  mv -f "${DIRECTORY}/data/status/Pale Moon Browser" "${DIRECTORY}/data/status/Pale Moon" 2>/dev/null
  
  #rename 'Puffin Browser Demo' to 'Puffin'
  rm -rf "${DIRECTORY}/apps/Puffin Browser Demo"
  mv -f "${DIRECTORY}/data/status/Puffin Browser Demo" "${DIRECTORY}/data/status/Puffin" 2>/dev/null
  
  #rename 'Quartz Browser' to 'Quartz'
  rm -rf "${DIRECTORY}/apps/Quartz Browser"
  mv -f "${DIRECTORY}/data/status/Quartz Browser" "${DIRECTORY}/data/status/Quartz" 2>/dev/null
  
  #rename 'Tor Browser' to 'Tor'
  rm -rf "${DIRECTORY}/apps/Tor Browser"
  mv -f "${DIRECTORY}/data/status/Tor Browser" "${DIRECTORY}/data/status/Tor" 2>/dev/null
  
  #rename 'KeePassX' to 'KeePassXC'
  rm -rf "${DIRECTORY}/apps/KeePassX"
  mv -f "${DIRECTORY}/data/status/KeePassX" "${DIRECTORY}/data/status/KeePassXC" 2>/dev/null

  #rename 'TeamViewer Host' to 'TeamViewer'
  if [ -f "${DIRECTORY}/data/status/TeamViewer Host" ] && [ $(cat "${DIRECTORY}/data/status/TeamViewer Host") == "installed" ]; then
    # installed
    rm -rf "${DIRECTORY}/apps/TeamViewer Host"  "${DIRECTORY}/apps/TeamViewer"
    mv -f "${DIRECTORY}/data/status/TeamViewer Host" "${DIRECTORY}/data/status/TeamViewer"
  else
    # not installed
    rm -rf "${DIRECTORY}/apps/TeamViewer Host"
  fi

  #rename 'Minecraft Java' to 'Minecraft Java Lunar'
  if [ -f "${DIRECTORY}/data/status/Minecraft Java" ] && [ $(cat "${DIRECTORY}/data/status/Minecraft Java") == "installed" ]; then
    # installed
    mv -f "${DIRECTORY}/data/status/Minecraft Java" "${DIRECTORY}/data/status/Minecraft Java Lunar"
    rm -rf "${DIRECTORY}/apps/Minecraft Java Lunar"
    mv -f "${DIRECTORY}/apps/Minecraft Java" "${DIRECTORY}/apps/Minecraft Java Lunar"
  else
    # not installed
    rm -rf "${DIRECTORY}/apps/Minecraft Java"
  fi
  
  #rename 'Brave Browser' to 'Brave'
  rm -rf "${DIRECTORY}/apps/Brave Browser"
  mv -f "${DIRECTORY}/data/status/Brave Browser" "${DIRECTORY}/data/status/Brave" 2>/dev/null
  
  #rename 'Discord' to 'Webcord'
  rm -rf "${DIRECTORY}/apps/Discord"
  mv -f "${DIRECTORY}/data/status/Discord" "${DIRECTORY}/data/status/Webcord" 2>/dev/null
  
  #rename 'Geekbench' to 'Geekbench 5'
  if [ -f "${DIRECTORY}/data/status/Geekbench" ] && [ $(cat "${DIRECTORY}/data/status/Geekbench") == "installed" ]; then
    # installed
    mv -f "${DIRECTORY}/data/status/Geekbench" "${DIRECTORY}/data/status/Geekbench 5"
    rm -rf "${DIRECTORY}/apps/Geekbench 5"
    mv -f "${DIRECTORY}/apps/Geekbench" "${DIRECTORY}/apps/Geekbench 5"
  else
    # not installed
    rm -rf "${DIRECTORY}/apps/Geekbench"
  fi
  true
EOF

#rename xlunch setting to xlunch-dark
runonce <<"EOF"
  if [ "$(cat "${DIRECTORY}/data/settings/App List Style")" == xlunch ];then
    echo 'xlunch-dark' > "${DIRECTORY}/data/settings/App List Style"
  fi
EOF

#transition from box86-no-binfmt-restart package to box86
runonce <<"EOF"
  if dpkg -l box86-no-binfmt-restart &>/dev/null ;then
    sudo_popup bash -c 'dpkg --remove box86-no-binfmt-restart'
    rm -f "${DIRECTORY}/data/status/Box86"
    "${DIRECTORY}/manage" uninstall Box86
    "${DIRECTORY}/manage" install Box86
  fi
  
  #if box86 is supposedly installed, but box86 command not found, reinstall box86
  if [ "$(app_status Box86)" == 'installed' ] && ! command -v box86 >/dev/null;then
    rm -f "${DIRECTORY}/data/status/Box86"
    "${DIRECTORY}/manage" uninstall Box86
    "${DIRECTORY}/manage" install Box86
  fi
  true
EOF

#remove files from pi-apps folder that are no longer used
runonce <<"EOF"
  rm -f "${DIRECTORY}/etc/bitlylink"
  rm -rf "${DIRECTORY}/data/categories"
EOF

#change settings icon
runonce <<"EOF"
  [ -a "$HOME/.local/share/applications/pi-apps-settings.desktop" ] && sed -i "s/logo.png/settings.png/g" "$HOME/.local/share/applications/pi-apps-settings.desktop" || true
EOF

#Raspbian Buster systems have a bug where XDG_DATA_DIRS is overwritten as the Raspberry Pi desktop is loaded.
#This fixes it, as PiOS maintainers are unwilling to.
#See: https://github.com/Botspot/pi-apps/issues/1833
runonce <<"EOF"
  if [ -f /usr/bin/startlxde-pi ] && grep -q '/var/lib/menu-xdg"' /usr/bin/startlxde-pi ;then
    sudo_popup sed -i 's;/var/lib/menu-xdg";/var/lib/menu-xdg${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}";g' /usr/bin/startlxde-pi
  fi
EOF

#Doom3 app by techcoder20 installed problematic SDL packages. (sdl2-image sdl2-mixer sdl2-ttf)
#Nothing else uses them, and they just cause problems with many other games, so remove them
runonce <<"EOF"
  if package_installed sdl2-image ;then
    list+='sdl2-image '
  fi
  if package_installed sdl2-mixer ;then
    list+='sdl2-mixer '
  fi
  if package_installed sdl2-ttf ;then
    list+='sdl2-ttf '
  fi
  
  if [ ! -z "$list" ]; then
    sudo_popup apt -y purge $list || exit 1
  fi
  true
EOF

#Fix PiKiss-GUI messing up folder permissions
runonce <<"EOF"
  if [ -d ~/.local/bin ] && [ "$(stat -c "%U %G" ~/.local/bin)" != "$USER $USER" ]; then
    sudo_popup chown $USER:$USER ~/.local/bin
  fi
EOF

#generate settings
runonce <<"EOF"
  if [ "$(ls "$DIRECTORY/data/settings" 2>/dev/null | wc -l)" -le 2 ];then
    echo "Generating default settings..."
  fi
  "${DIRECTORY}/settings" refresh
EOF

#remove old mcpi repositories
runonce <<"EOF"
  if [ -f /etc/apt/sources.list.d/Alvarito050506_mcpi-devs.list ];then
    sudo_popup rm -f /etc/apt/sources.list.d/Alvarito050506_mcpi-devs.list
  fi
  if [ -f /etc/apt/sources.list.d/mcpi-revival.list ];then
    sudo_popup rm -f /etc/apt/sources.list.d/mcpi-revival.list
    sudo_popup rm -f /etc/apt/trusted.gpg.d/mcpi-revival.gpg
  fi
EOF

#remove EOL Raspbian Addons repository
runonce <<"EOF"
  if [ -f /etc/apt/sources.list.d/rpirepo.list ];then
    sudo_popup rm -f /etc/apt/sources.list.d/rpirepo.list
    sudo_popup rm -f /usr/share/keyrings/raspbian-addons-archive-keyring.gpg
  fi
EOF

#remove old vivaldi repository
runonce <<"EOF"
  if [ -f /etc/apt/sources.list.d/vivaldi-archive.list ];then
    sudo_popup rm -f /etc/apt/sources.list.d/vivaldi-archive.list
    sudo_popup rm -f /usr/share/keyrings/vivaldi-browser.gpg
  fi
EOF

#update pi-apps .desktop icons
runonce <<"EOF"
#menu button

echo "Updating menu button..."
mkdir -p ~/.local/share/applications
if [ -f /etc/xdg/menus/lxde-pi-applications.menu ];then
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
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" yes

#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" yes

#settings menu button
echo "Updating Settings menu button..."
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

echo "Updating autostarted updater..."
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

EOF

#Fix mimeapps containing only boxy svg mimeapp entry without [Added associations] appearing first
runonce <<"EOF"
  if [ "$(head -n1 ~/.config/mimeapps.list)" == 'image/svg+xml;application/illustrator=boxy-svg.desktop;' ];then
    #remove first line from mimeapps.list
    sed -i 1d ~/.config/mimeapps.list
    
    #Add it back correctly
    echo "[Added Associations]
image/svg+xml;application/illustrator=boxy-svg.desktop;" >> ~/.config/mimeapps.list
  fi
EOF

#correct home ownership of gnupg repo
runonce <<"EOF"
  if [ -d ~/.gnupg ] && stat -c "%U %G" ~/.gnupg/* | grep -q "root"; then
    sudo_popup chown -R $USER:$USER ~/.gnupg
  fi
EOF

true
