#!/sbin/sh

#OUTFD=$1;

#echo "executing addon" >> $OUTFD

shift 1
destDir=$system/addon.d
dest=$destDir/$1".sh"
fileName=$1
shift 1
source=$1
mkdir -p "$destDir"
addonDir="/sdcard/NikGapps/addonLogs"
nikGappsAddonLogFile="$addonDir/NikGapps_"$fileName"_addon.log"
nikGappsTestLog="$addonDir/NikGapps.log"
beginswith() {
  case $2 in
  "$1"*)
    echo true
    ;;
  *)
    echo false
    ;;
  esac
}

run() {
  echo "#!/sbin/sh"
  echo "#"
  echo "# ADDOND_VERSION=2"
  echo "#"
  echo "# Addon.d script created from AFZC tool by Nikhil Menghani"
  echo "#"
  echo ""
  echo "V1_FUNCS=/tmp/backuptool.functions"
  echo "V2_FUNCS=/postinstall/system/bin/backuptool_ab.functions"
  echo "V3_FUNCS=/postinstall/tmp/backuptool.functions"
  echo "if [ -f \$V1_FUNCS ]; then"
  echo "  . \$V1_FUNCS"
  echo "  backuptool_ab=false"
  echo "elif [ -f \$V2_FUNCS ]; then"
  echo "  . \$V2_FUNCS"
  echo "elif [ -f \$V3_FUNCS ]; then"
  echo "  . \$V3_FUNCS"
  echo "else"
  echo "  return 1"
  echo "fi"
  echo ""
  echo "mkdir -p $addonDir"
  echo ""
  echo "initialize() {"
  echo "  ps | grep zygote | grep -v grep >/dev/null && BOOTMODE=true || BOOTMODE=false"
  echo "  \$BOOTMODE || ps -A 2>/dev/null | grep zygote | grep -v grep >/dev/null && BOOTMODE=true"
  echo "}"
  echo ""
  echo "initialize"
  echo ""
  echo "addToLog() {"
  echo "echo \"\$1\" >> $nikGappsAddonLogFile"
  echo "}"
  echo ""
  echo "addToLog \"Execute Log for $fileName with commands: \$@\""
  echo "# determine parent output fd and ui_print method"
  echo "  FD=1"
  echo "    # update-binary|updater <RECOVERY_API_VERSION> <OUTFD> <ZIPFILE>"
  echo "    OUTFD=\$(ps | grep -v 'grep' | grep -oE 'update(.*) 3 [0-9]+' | cut -d\" \" -f3)"
  echo "    [ -z \$OUTFD ] && OUTFD=\$(ps -Af | grep -v 'grep' | grep -oE 'update(.*) 3 [0-9]+' | cut -d\" \" -f3)"
  echo "    # update_engine_sideload --payload=file://<ZIPFILE> --offset=<OFFSET> --headers=<HEADERS> --status_fd=<OUTFD>"
  echo "    [ -z \$OUTFD ] && OUTFD=\$(ps | grep -v 'grep' | grep -oE 'status_fd=[0-9]+' | cut -d= -f2)"
  echo "    [ -z \$OUTFD ] && OUTFD=\$(ps -Af | grep -v 'grep' | grep -oE 'status_fd=[0-9]+' | cut -d= -f2)"
  echo "    test \"\$verbose\" -a \"\$OUTFD\" && FD=\$OUTFD"
  echo "  if [ -z \$OUTFD ]; then"
  echo "    ui_print() { echo \"\$1\"; test \"$nikGappsTestLog\" && echo \"\$1\" >> \"$nikGappsTestLog\"; }"
  echo "  else"
  echo "    ui_print() { echo -e \"ui_print \$1\nui_print\" >> /proc/self/fd/\$OUTFD; test \"$nikGappsTestLog\" && echo \"\$1\" >> \"$nikGappsTestLog\"; }"
  echo "  fi"
  echo ""
  echo ""
  echo "list_files() {"
  echo "cat <<EOF"

  OLD_IFS="$IFS"
  IFS="$(printf '%b_' ' \n')"
  IFS="${IFS%_}"
  g=$(grep "install" "$source" | cut -d= -f2)
  for i in $g; do
    echo "$i"
  done
  IFS="$OLD_IFS"

  echo "EOF"
  echo "}"
  echo ""
  echo "case \"\$1\" in"

  echo " backup)"
  echo "   addToLog \"Starting the backup\""
  echo "   list_files | while read FILE DUMMY; do"
  echo "     backup_file \$S/\"\$FILE\""
  echo "     addToLog \"Backing up \$S/\"\$FILE\"\""
  echo "   done"
  echo " ;;"
  echo " restore)"
  echo "   addToLog \"Starting the restore\""
  echo "   ui_print \"- Restoring $fileName\""
  echo "   addToLog \"Restoring $fileName\""
  echo "   list_files | while read FILE REPLACEMENT; do"
  echo "     R=\"\""
  echo "     [ -n \"\$REPLACEMENT\" ] && R=\"\$S/\$REPLACEMENT\""
  echo "     [ -f \"\$C/\$S/\$FILE\" ] && restore_file \$S/\"\$FILE\" \"\$R\""
  echo "     addToLog \"Restoring \$S/\$FILE\""
  echo "   done"
  echo " ;;"

  echo " pre-backup)"
  echo "   rm -rf \"$nikGappsAddonLogFile\""
  echo "   # keep GApps addon.d from executing unless GApps are actually installed"
  echo "   if [ ! -f /system/etc/g.prop ]; then"
  echo "     rm -f /postinstall/tmp/addon.d/69-gapps.sh"
  echo "   fi"
  echo " ;;"

  echo " post-backup)"
  echo "   # Stub"
  echo " ;;"

  echo " pre-restore)"
  echo "   # Stub"
  echo " ;;"

  echo " post-restore)"
  echo "  if [ -d \"/postinstall\" ]; then"
  echo "    P=\"/postinstall/system\""
  echo "  else"
  echo "    P=\"\$S\""
  echo "  fi"
  echo "   addToLog \"Running $fileName\""
  OLD_IFS="$IFS"
  IFS="$(printf '%b_' ' \n')"
  IFS="${IFS%_}"
  g=$(grep "delete" "$source" | cut -d= -f2)
  for i in $g; do
    echo "     ui_print \"x Deleting $i\""
    func_result="$(beginswith / "$i")"
    echo "     addToLog \"- Deleting $i with func_result: $func_result and system as \$S\""
    if [ "$func_result" == "true" ]; then
      echo "     addToLog \"x Deleting $i\""
      echo "     rm -rf \"$i\""
    else
      echo "     addToLog \"x Deleting \$S/$i\""
      echo "     rm -rf \"\$S/$i\""
      echo "     addToLog \"x Deleting \$S/product/$i\""
      echo "     rm -rf \"\$S/product/$i\""
      echo "     addToLog \"x Deleting /product/$i\""
#      echo "     mount -o rw -t auto /product"
      echo "     rm -rf \"/product/$i\""
    fi
  done
  IFS="$OLD_IFS"
  echo "   addToLog \"Running $fileName\""
  OLD_IFS="$IFS"
  IFS="$(printf '%b_' ' \n')"
  IFS="${IFS%_}"
  g=$(grep "debloat" "$source" | cut -d= -f2)
  for i in $g; do
    echo "     ui_print \"x Debloating $i\""
    func_result="$(beginswith / "$i")"
    echo "     addToLog \"- Debloating $i with func_result: $func_result and system as \$S and P as \$P\""
    if [ "$func_result" == "true" ]; then
      echo "     addToLog \"x Debloating $i\""
      echo "     rm -rf \"$i\""
    else
      echo "     addToLog \"x Debloating \$P/$i\""
      echo "     rm -rf \"\$P/$i\""
      echo "     addToLog \"x Debloating \$P/product/$i\""
      echo "     rm -rf \"\$P/product/$i\""
      echo "     addToLog \"x Debloating /product/$i\""
#      echo "     mount -o rw -t auto /product 2>/dev/null;"
      echo "     rm -rf \"/product/$i\""
    fi
  done
  IFS="$OLD_IFS"
  echo "  for i in \$(list_files); do"
  echo "    chown root:root \"\$P/\$i\""
  echo "    chmod 644 \"\$P/\$i\""
  echo "    chmod 755 \"\$(dirname \"\$P/\$i\")\""
  echo "  done"
  echo "  cp -f \"/tmp/recovery.log\" \"$addonDir/recovery.log\""
  echo " ;;"
  echo "esac"
}
rm -rf "$dest"
run >"$dest"
chmod 755 "$dest"
