#!/bin/bash
trap "kill 0" SIGINT # Kill all spawned subprocesses on ctrl^c
LOCATION=$(dirname "$0")
source "$LOCATION"/../common_tools

init_uninstalling(){
  echo "⏳ Getting third-party package list..."
  IGNORED_PACKAGES=( "com.microsoft.hockeyapp.testerapp" "io.crash.air" "de.codenauts.hockeyapp" "ar.core" "com.framerjs.android" "com.figma.mirror" "com.invisionapp.ifa" "com.android.chrome" "com.google.ar.core" "no.nordicsemi.android.mcp" "com.x8bit.bitwarden" )
  PACKAGES=($(adb -s "$SELECTED_DEVICE" shell pm list packages -f -3 | sed -e 's/.*=//' | sort))
}

uninstall_all(){
    for PKG in "${PACKAGES[@]}"
    do
      PKG=${PKG%$'\r'} #removes trailing \r
      uninstall_package "$PKG" &
    done
    wait
}

uninstall_package(){
  PACKAGE="$1"
  echo "${PACKAGES[*]}" | grep -w "$PACKAGE" &> /dev/null || { echo "🤷‍ Package \"$PACKAGE\" not installed"; return 1; }
  echo "${IGNORED_PACKAGES[*]}" | grep -w "$PACKAGE" &> /dev/null && { echo "❌ Package \"$PACKAGE\" is whitelisted"; return 1; }
  echo "🔥 Uninstalling \"$PACKAGE\"..."
  adb -s "$SELECTED_DEVICE" shell pm uninstall "$PACKAGE" &> /dev/null
}

select_option(){
    echo "📋 Choose package number:"
    select OPTION in "${PACKAGES_LISTED[@]}"
    do
     case $OPTION in
        *) PACKAGE=$OPTION;break; ;;
      esac
    done
    if [[ -z $PACKAGE ]]; then
      echo "❌ Invalid option picked, retry"
      select_option
    fi
}

filter_packages(){
    PACKAGES_LISTED=()
    for PKG in "${PACKAGES[@]}" #removes trailing \r
    do
      PKG=${PKG%$'\r'}
      echo "${IGNORED_PACKAGES[@]}" | grep -w "$PKG" &> /dev/null && { echo "⏩ Skipped \"$PKG\""; continue; }
      PACKAGES_LISTED+=("$PKG")
    done

    if [ ${#PACKAGES_LISTED[@]} -eq 0 ]; then
        echo "🤷‍ Nothing to uninstall"
        exit
    fi
}

handle_arguments(){
  if [[ -z "$2" ]]; then
    android_choose_device
  else
    SELECTED_DEVICE=$2
  fi

  init_uninstalling

  if [ -z "$1" ]; then
    filter_packages
    select_option
    uninstall_package "$PACKAGE"
  elif [[  "$1" == "-w" ]]; then
    if [[ -z "$2" ]]; then
      tput setaf 1
      should_proceed "💣 Delete all third-party apps on $SELECTED_DEVICE_MODEL - $SELECTED_DEVICE?"
      tput sgr0
    fi
    uninstall_all
  elif [[ -n "$1" ]]; then
    uninstall_package "$1"
  fi
}

handle_arguments "$@"
echo "✅ Done"
