#!/usr/bin/env bash

# COLOURS
red='\033[0;31m'
green='\033[0;32m'
yellow='\033[1;33m'
blue='\033[0;34m'
cyan='\033[0;36m'
nc='\033[0m'

# LOGGING
log_info() { printf "${blue}[info]${nc} %s\n" "$1"; }
log_success() { printf "${green}[ok]${nc} %s\n" "$1"; }
log_warn() { printf "${yellow}[warn]${nc} %s\n" "$1"; }
log_err() { printf "${red}[err]${nc} %s\n" "$1"; }

# ENVIRONMENT
check_deps() {
  local tools=(adb fastboot apktool uber-apk-signer fzf)
  for t in "${tools[@]}"; do
    if ! command -v "$t" &>/dev/null; then
      log_warn "$t missing"
    fi
  done
}

# DEVICE MANAGEMENT
cmd_info() {
  printf "${cyan}DEVICE INFORMATION${nc}\n"
  printf "model:    %s\n" "$(adb shell getprop ro.product.model)"
  printf "android:  %s\n" "$(adb shell getprop ro.build.version.release)"

  local bat=$(adb shell dumpsys battery | grep level | cut -d: -f2 | tr -d ' ')
  local stat=$(adb shell dumpsys battery | grep 'AC powered' | cut -d: -f2 | tr -d ' ')
  [[ "$stat" == "true" ]] && charge="charging" || charge="discharging"

  printf "battery:  %s%% (%s)\n" "$bat" "$charge"

  if adb shell su -c "echo 'rooted'" &>/dev/null; then
    printf "root:     ${green}yes${nc}\n"
  else
    printf "root:     ${red}no${nc}\n"
  fi
}

cmd_wifi() {
  local port=${1:-5555}
  local ip=$(adb shell ip addr show wlan0 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1)
  if [ -z "$ip" ]; then
    log_err "wifi ip not detected"
    return 1
  fi
  adb tcpip $port
  sleep 2
  adb connect "$ip:$port"
  log_success "connected to $ip:$port"
}

# PACKAGE MANAGEMENT
cmd_nuke() {
  local pkg=$(adb shell pm list packages | cut -d: -f2 | fzf --prompt="nuke > " --height=40%)
  if [ -n "$pkg" ]; then
    read -p "confirm nuke $pkg? (y/n): " confirm
    if [[ "$confirm" =~ ^[Yy]$ ]]; then
      adb shell pm uninstall -k --user 0 "$pkg"
      log_success "nuked $pkg"
    fi
  fi
}

# APK ENGINEERING
cmd_pull() {
  local pkg=${1:-$(adb shell pm list packages | cut -d: -f2 | fzf --prompt="pull > ")}
  [ -z "$pkg" ] && return
  local path=$(adb shell pm path "$pkg" | head -n 1 | cut -d: -f2 | tr -d '\r')
  log_info "pulling $pkg..."
  adb pull "$path" "./$pkg.apk"
}

cmd_scrot() {
  local file="scrot_$(date +%Y%m%d_%H%M%S).png"
  adb shell screencap -p /sdcard/temp.png
  adb pull /sdcard/temp.png "./$file" >/dev/null
  adb shell rm /sdcard/temp.png
  log_success "saved: $file"
}

# MAIN ROUTER
usage() {
  printf "${cyan}ARCH-DROID TOOL (ADBX)${nc}\n"
  printf "usage: adbx <command> [args]\n\n"
  printf "DEVICE\n"
  printf "  check     verify tools\n"
  printf "  list      list devices\n"
  printf "  info      show battery/root\n"
  printf "  wifi      wireless adb\n\n"
  printf "PACKAGES\n"
  printf "  nuke      interactive uninstall\n"
  printf "  freeze    disable app\n"
  printf "  melt      enable app\n\n"
  printf "FILES\n"
  printf "  pull      extract apk\n"
  printf "  sign      sign apk\n"
  printf "  scrot     screenshot\n"
  exit 1
}

case "$1" in
check) check_deps ;;
list)
  adb devices -l
  fastboot devices
  ;;
info) cmd_info ;;
wifi) cmd_wifi "$2" ;;
nuke) cmd_nuke ;;
pull) cmd_pull "$2" ;;
scrot) cmd_scrot ;;
*) usage ;;
esac
