[ $# -eq 0 ] && echo "core: Need 1 arguments (see 'core --help')" && exit 1
source /data/adb/modules/ts_enhancer_extreme/libraries/util_functions.sh
PATH="/data/adb/modules/ts_enhancer_extreme/libraries:$PATH"
CONFLICT="
Yurikey
safetynet-fix
vbmeta-fixer
integrity_box
SukiSU_module
Reset_BootHash
Tricky_store-bm
Hide_Bootloader
ShamikoManager
Tricky_Store-xiaoyi
tricky_store_assistant
extreme_hide_bootloader
wjw_hiderootauxiliarymod
"
RMRFCONFLICT="
TA_utl
.TA_utl
"
OFSCONFLICT="
$CONFLICT
$RMRFCONFLICT
"
if [ ! "$OVERLAYFS" = "TRUE" ]; then
  functions_cn WAY="下一次启动时被移除."
  functions_en WAY="upon the next boot."
else
  functions_cn WAY="两次重新启动后被移除."
  functions_en WAY="after two reboots."
fi
functions_cn DES="此模块与TS-Enhancer-Extreme模块证实冲突,已被添加移除标签,将在$WAY"
functions_en DES="This module has been confirmed to conflict with the TS-Enhancer-Extreme module. It has been tagged for removal and will be removed $WAY"

help() {
echo "Tsee cli

Usage: core <Arguments> <Extra arguments>

Arguments:
  --stealkeybox
  --tsdaemonstop
  --tsdaemonstart
  --tsdaemonstate
  --passpropstate
  --passhashstate
  --conflictappcheck
  --conflictmodcheck [Extra <-b> / <-m> / <-o> ]
  --packagelistupdate [Extra <-s> ]
  --securitypatchpropsync
  --securitypatchdatefetch

Options:
  -h, --help
  -V, --version"
}

version() {
echo "tseed 0.6.1"
}

skipmode() {
{ pm list packages -3 | sed 's/^package://'; } > "$TSCONFIG/target.txt"
}

bootmode() {
functions_cn BOOTDES="此模块与TS-Enhancer-Extreme模块证实冲突,已被添加移除标签,将在下一次启动时被移除."
functions_en BOOTDES="This module has been confirmed to conflict with the TS-Enhancer-Extreme module. It has been tagged for removal and will be removed upon the next boot."
if [ ! "$OVERLAYFS" = "TRUE" ]; then
  for MODULE in $CONFLICT; do
    [ -d "$MODULESDIR/$MODULE" ] && {
      conflictdes_all "$BOOTDES"
      touch "$MODULESDIR/$MODULE/update"
      touch "$MODULESDIR/$MODULE/disable"
      touch "$MODULESDIR/$MODULE/remove"
      rm -f "$MODULESUPDATEDIR/uninstall.sh"
      rm -f "$MODULESDIR/$MODULE/uninstall.sh"
    }
  done
  for RMRFMODULE in $RMRFCONFLICT; do
    [ -d "$MODULESDIR/$RMRFMODULE" ] && {
      (cd "$MODULESDIR/$RMRFMODULE"; ./uninstall.sh)
      rm -rf "$MODULESDIR/$RMRFMODULE"
    }
  done
else
  for MODULE in $OFSCONFLICT; do
    [ -d "$MODULESDIR/$MODULE" ] && {
      conflictdes_all "$BOOTDES"
      touch "$MODULESDIR/$MODULE/update"
      touch "$MODULESDIR/$MODULE/disable"
      touch "$MODULESDIR/$MODULE/remove"
    }
  done
fi
}

overlayfsmode() {
for MODULE in $OFSCONFLICT; do
  [ -d "$MODULESDIR/$MODULE" ] && {
    conflictdes_all "$DES"
    touch "$MODULESDIR/$MODULE/disable"
    touch "$MODULESDIR/$MODULE/remove"
  }
done
}

magicmountmode() {
for MODULE in $CONFLICT; do
  [ -d "$MODULESDIR/$MODULE" ] && {
    conflictdes_all "$DES"
    touch "$MODULESDIR/$MODULE/disable"
    touch "$MODULESDIR/$MODULE/remove"
    rm -rf "$MODULESUPDATEDIR/$MODULE"
  }
done
for RMRFMODULE in $RMRFCONFLICT; do
  [ -d "$MODULESDIR/$RMRFMODULE" ] && {
    (cd "$MODULESDIR/$RMRFMODULE"; ./uninstall.sh)
    rm -rf "$MODULESDIR/$RMRFMODULE"
  }
done
}

conflictmodcheck() {
if [ ! "$OVERLAYFS" = "TRUE" ]; then
  magicmountmode
else
  overlayfsmode
fi
}

conflictappcheck() {
APPCONFLICT="
com.lingqian.appbl
com.topmiaohan.hidebllist
"
for PACKAGE in $APPCONFLICT; do
  if pm path $PACKAGE > /dev/null 2>&1; then
    pm uninstall $PACKAGE > /dev/null 2>&1
  fi
done
}

passpropstate() {
check_missing_match_prop() {
  local NAME=$1
  local EXPECTED=$2
  local VALUE=$(getprop $NAME)
  [ -z $VALUE ] || [ $VALUE = $EXPECTED ] || resetprop $NAME $EXPECTED
  [ -z $VALUE ] && resetprop $NAME $EXPECTED
}
contains_reset_prop() {
  local NAME=$1
  local CONTAINS=$2
  local NEWVAL=$3
  [[ "$(getprop $NAME)" = *"$CONTAINS"* ]] && resetprop $NAME $NEWVAL
}
check_missing_prop() {
  local NAME=$1
  local EXPECTED=$2
  local VALUE=$(getprop $NAME)
  [ -z $VALUE ] && resetprop $NAME $EXPECTED
}
check_reset_prop() {
  local NAME=$1
  local EXPECTED=$2
  local VALUE=$(getprop $NAME)
  [ -z $VALUE ] || [ $VALUE = $EXPECTED ] || resetprop $NAME $EXPECTED
}
vbmeta_size=$(busybox blockdev --getbsz "/dev/block/by-name/vbmeta$(getprop ro.boot.slot_suffix)"); [ -n "$vbmeta_size" ] || vbmeta_size="4096"
resetprop -w sys.boot_completed 0
resetprop "sys.usb.adb.disabled" " "
check_missing_match_prop "ro.boot.vbmeta.device_state" "locked"
check_missing_match_prop "ro.boot.verifiedbootstate" "green"
check_missing_match_prop "ro.boot.veritymode" "enforcing"
check_missing_match_prop "ro.boot.warranty_bit" "0"
check_missing_match_prop "ro.boot.flash.locked" "1"
contains_reset_prop "vendor.boot.bootmode" "recovery" "unknown"
contains_reset_prop "ro.boot.bootmode" "recovery" "unknown"
contains_reset_prop "ro.bootmode" "recovery" "unknown"
check_missing_prop "ro.boot.vbmeta.invalidate_on_error" yes
check_missing_prop "ro.boot.vbmeta.size" "$vbmeta_size"
check_missing_prop "ro.boot.vbmeta.hash_alg" "sha256"
check_missing_prop "ro.boot.vbmeta.avb_version" "1.2"
check_reset_prop "vendor.boot.vbmeta.device_state" "locked"
check_reset_prop "vendor.boot.verifiedbootstate" "green"
check_reset_prop "ro.secureboot.lockstate" "locked"
check_reset_prop "ro.boot.realmebootstate" "green"
check_reset_prop "ro.vendor.boot.warranty_bit" "0"
check_reset_prop "sys.oem_unlock_allowed" "0"
check_reset_prop "ro.boot.realme.lockstate" "1"
check_reset_prop "ro.build.tags" "release-keys"
check_reset_prop "ro.crypto.state" "encrypted"
check_reset_prop "ro.vendor.warranty_bit" "0"
check_reset_prop "ro.force.debuggable" "0"
check_reset_prop "ro.build.type" "user"
check_reset_prop "ro.warranty_bit" "0"
check_reset_prop "ro.debuggable" "0"
check_reset_prop "ro.kernel.qemu" ""
check_reset_prop "ro.adb.secure" "1"
check_reset_prop "ro.secure" "1"
}

passhashstate() {
HASH=$(head -n1 "$TSEECONFIG/boothash.txt")
if [ -n "$HASH" ] && [ ${#HASH} -eq 64 ]; then
  resetprop -n ro.boot.vbmeta.digest "$(echo "$HASH" | tr '[:upper:]' '[:lower:]')"
fi
}

tsdaemonstop() {
kill -9 $(pidof TrickyStore) 2>/dev/null
}

tsdaemonstart() {
chmod 755 "$TARGET_SCRIPT"
(
  cd "$(dirname "$TARGET_SCRIPT")" || exit 1
  exec ./"$(basename "$TARGET_SCRIPT")"
)
}

tsdaemonstate() {
if pidof TrickyStore >/dev/null; then
  echo "true"
else
  echo "false"
fi
}

packagelistupdate() {
{ pm list packages -3 | sed 's/^package://' | grep -vFf "$USR"; cat "$SYS"; } > "$TSCONFIG/target.txt"
}

stealkeybox() {
MAINLINK="https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/main/.extra"
SPARELINK="https://raw.gitmirror.com/KOWX712/Tricky-Addon-Update-Target-List/main/.extra"
echo "- Crawl"
if crawl "$MAINLINK" > "$TMPDIR/keybox.hex" || crawl "$SPARELINK" > "$TMPDIR/keybox.hex"; then
  echo "- Success"
else
  echo "- Failed"
  exit 1
fi
sleep 0.1s && echo ""
echo "- Decode"
if printf "$(cat "$TMPDIR/keybox.hex" | sed 's/\(..\)/\\x\1/g')" > "$TMPDIR/keybox.bin"; then
  echo "- Success"
else
  echo "- Failed"
fi
sleep 0.1s && echo ""
echo "- Write"
mv "$TSCONFIG/keybox.xml" "$TSCONFIG/keybox.xml.bak"
if echo "$(cat "$TMPDIR/keybox.bin" | tr -d '\0' | base64 -d)" > "$TSCONFIG/newkeybox.xml"; then
  mv "$TSCONFIG/newkeybox.xml" "$TSCONFIG/keybox.xml"
  echo "- Success"
else
  mv "$TSCONFIG/keybox.xml.bak" "$TSCONFIG/keybox.xml"
  echo "- Failed"
fi
rm -f "$TMPDIR/keybox.hex"
rm -f "$TMPDIR/keybox.bin"
}

securitypatchpropsync() {
RAW=$(grep -oE '^[0-9]{8}$' "$SP")
if [ -n "$RAW" ]; then
  DATE="${RAW:0:4}-${RAW:4:2}-${RAW:6:2}"
  resetprop ro.vendor.build.security_patch "$DATE"
  resetprop ro.build.version.security_patch "$DATE"
  kill -9 $(pidof com.google.android.gms.unstable) 2>/dev/null
fi
}

securitypatchdatefetch() {
DATE=$(crawl "https://source.android.com/docs/security/bulletin/pixel" | sed -n 's/.*<td>\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)<\/td>.*/\1/p' | head -n 1)
if [ -n "$DATE" ]; then
  DATE=${DATE//-/}
  printf "%s" "$DATE" > /data/adb/tricky_store/security_patch.txt
  exit 0
elif ! ping -c 1 -W 5 "source.android.com" >/dev/null 2>&1; then
  exit 1
fi
}

case "$1:$2" in
  "--packagelistupdate:-s") skipmode; exit 0 ;;
  "--conflictmodcheck:-b") bootmode; exit 0 ;;
  "--conflictmodcheck:-o") overlayfsmode; exit 0 ;;
  "--conflictmodcheck:-m") magicmountmode; exit 0 ;;
esac
for ARG in "$@"; do
  case "$ARG" in
    -h|--help) help; exit ;;
    -V|--version) version; exit ;;
    --stealkeybox) stealkeybox ;;
    --passpropstate) passpropstate ;;
    --passhashstate) passhashstate ;;
    --tsdaemonstop) tsdaemonstop ;;
    --tsdaemonstart) tsdaemonstart ;;
    --tsdaemonstate) tsdaemonstate ;;
    --conflictappcheck) conflictappcheck ;;
    --conflictmodcheck) conflictmodcheck ;;
    --packagelistupdate) packagelistupdate ;;
    --securitypatchpropsync) securitypatchpropsync ;;
    --securitypatchdatefetch) securitypatchdatefetch ;;
    *) echo "core: Unknown argument '$ARG'"; help; exit 2 ;;
  esac
done
exit 0