name: Build MagiskOnWSA
on:
    workflow_dispatch:
        inputs:
            arch:
                description: "WSA Architecture"
                required: true
                default: "x86_64"
                type: choice
                options:
                    - x86_64
                    - ARM64
            release_type:
                description: "WSA Release Channel"
                required: true
                default: "Dev Channel"
                type: choice
                options:
                    - General Availability Channel
                    - Release Preview Channel
                    - Beta Channel
                    - Dev Channel
            magisk_ver:
                description: "Magisk Version"
                required: true
                default: "Stable"
                type: choice
                options:
                    - None
                    - Stable
                    - Beta
                    - Canary
                    - Debug
                    - Custom
            magisk_url:
                description: "Custom Magisk APK/ZIP URL"
                required: false
                type: string
            gapps_var:
                description: "GApps Variant"
                required: true
                default: "MindTheGapps"
                type: choice
                options:
                    - None
                    - Pico
                    - Full
                    - MindTheGapps
                    - Custom (OpenGApps)
                    - Custom (MindTheGapps)
            gapps_url:
                description: "Custom GApps ZIP URL"
                required: false
                type: string
            remove_amazon:
                description: "Remove Amazon AppStore"
                required: true
                default: true
                type: boolean
            # nofix_props:
            #     description: Props Remain Unfixed
            #     required: true
            #     default: false
            #     type: boolean
            # skip_download_wsa:
            #     description: Skip WSA Download
            #     required: true
            #     default: false
            #     type: boolean
            compression:
                description: "Compression Algorithm"
                required: true
                default: "ZIP"
                type: choice
                options:
                    - ZIP
                    - 7-Zip
                    - XZ
            tag:
                description: "Release Tag Name"
                required: true
                default: "WSA"
                type: string
            prerelease:
                description: "Release as Prerelease"
                required: false
                default: false
                type: boolean

permissions:
    contents: write

jobs:
    build:
        runs-on: ubuntu-latest
        steps:
            - name: Checkout
              uses: actions/checkout@v3
            - name: Install Dependencies
              working-directory: ./scripts
              run: |
                  sudo apt update && sudo apt -y install setools lzip wine winetricks patchelf e2fsprogs python3-pip aria2 p7zip-full attr xz-utils unzip
                  python3 -m pip install requests
                  cp -r ../wine/.cache/* ~/.cache
                  winetricks msxml6
            - name: Build MagiskOnWSA
              working-directory: ./scripts
              run: |
                  DOWNLOAD_DIR=../download
                  DOWNLOAD_CONF_NAME=download.list
                  mkdir -p "$DOWNLOAD_DIR"

                  declare -A opts=( ["ARCH,x86_64"]="x64" ["ARCH,ARM64"]="arm64" ["RELEASE_TYPE,General Availability Channel"]="retail" ["RELEASE_TYPE,Release Preview Channel"]="RP" ["RELEASE_TYPE,Beta Channel"]="WIS" ["RELEASE_TYPE,Dev Channel"]="WIF" ["MAGISK_VER,Stable"]="stable" ["MAGISK_VER,Beta"]="beta" ["MAGISK_VER,Canary"]="canary" ["MAGISK_VER,Debug"]="debug" ["MAGISK_VER,Custom"]="--magisk-custom" ["GAPPS_VAR,None"]="none" ["GAPPS_VAR,Pico"]="pico" ["GAPPS_VAR,Full"]="full" ["REMOVE_AMAZON,true"]="--remove-amazon" ["NOFIX_PROPS,true"]="--nofix-props" ["SKIP_DOWNLOAD_WSA,true"]="--skip-download-wsa" ["COMPRESSION,ZIP"]="zip" ["COMPRESSION,7-Zip"]="7z" ["COMPRESSION,XZ"]="xz" )

                  ARCH="${opts[ARCH,${{ inputs.arch }}]}"

                  RELEASE_TYPE="${opts[RELEASE_TYPE,${{ inputs.release_type }}]}"

                  if [[ "${{ inputs.magisk_ver }}" != "None" ]]; then
                      ROOT_SOL="magisk"
                      if [[ "${{ inputs.magisk_ver }}" != "Custom" ]]; then
                          MAGISK_VER="${opts[MAGISK_VER,${{ inputs.magisk_ver }}]}"
                      else
                          echo -e "${{ inputs.magisk_url }}\n out=magisk-debug.zip" > "$DOWNLOAD_DIR"/"$DOWNLOAD_CONF_NAME"

                          if ! aria2c --no-conf --log-level=info --log="$DOWNLOAD_DIR/aria2_custom_magisk_download.log" -x16 -s16 -j5 -c -R -m0 --async-dns=false --check-integrity --continue --allow-overwrite --conditional-get -d"$DOWNLOAD_DIR" -i"$DOWNLOAD_DIR"/"$DOWNLOAD_CONF_NAME"; then
                              echo "Magisk download error!"
                              exit 1
                          fi
                          CUSTOM_MAGISK="${opts[MAGISK_VER,Custom]}"
                          MAGISK_VER="${opts[MAGISK_VER,Debug]}"
                      fi
                  else
                      ROOT_SOL="none"
                      MAGISK_VER="${opts[MAGISK_VER,Stable]}"
                  fi

                  if [[ "${{ inputs.arch }}" == "x86_64" ]]; then
                      GAPPS_VAR="${opts[GAPPS_VAR,${{ inputs.gapps_var }}]}"
                  else
                      # TODO: keep it 11.0 since official opengapps does not support 12+ yet
                      # As soon as opengapps is available for 12+, we need to get the sdk/release from build.prop and download the corresponding version
                      if [[ "${{ inputs.gapps_var }}" != "None" ]]; then
                          GAPPS_VAR="${opts[GAPPS_VAR,Pico]}"
                      else
                          GAPPS_VAR="${opts[GAPPS_VAR,${{ inputs.gapps_var }}]}"
                      fi
                  fi

                  if [[ "${{ inputs.gapps_var }}" != "None" ]]; then
                      if [[ "${{ inputs.gapps_var }}" != *"MindTheGapps"* ]]; then
                          GAPPS_BRAND="OpenGApps"
                          if [[ "${{ inputs.gapps_var }}" == "Custom (OpenGApps)" ]]; then
                              if [[ -z "${${{ inputs.gapps_url }}+x}" ]]; then
                                  GAPPS_VARIANT_MAP=(
                                      "super"
                                      "stock"
                                      "full"
                                      "mini"
                                      "micro"
                                      "nano"
                                      "pico"
                                      "tvstock"
                                      "tvmini"
                                  )

                                  for file in "$DOWNLOAD_DIR"/OpenGApps-"$ARCH"-*.zip; do
                                      GAPPS_VAR=${file%%\.*}
                                      GAPPS_VAR=${GAPPS_VAR##*-}
                                      list_count=${#GAPPS_VARIANT_MAP[@]}
                                      for i in "${GAPPS_VARIANT_MAP[@]}"; do
                                          if [[ "$GAPPS_VAR" == "$i" ]]; then
                                              echo "INFO: GApps Variant: $GAPPS_VAR"
                                              valid_gapps_var="true"
                                              break
                                          fi
                                          ((list_count--))
                                          if (("$list_count" <= 0)); then
                                              echo "Invalid GApps Variant: $GAPPS_VAR"
                                          fi
                                      done
                                      if [[ "$valid_gapps_var" == "true" ]]; then
                                          break
                                      fi
                                  done
                                  if [[ "$valid_gapps_var" != "true" ]]; then
                                      echo "Missing OpenGApps file!"
                                      exit 1
                                  fi
                                  echo "opengapps_var=${GAPPS_VAR^}" >> $GITHUB_ENV
                              else
                                  GAPPS_VAR="pico"
                                  echo -e "${{ inputs.gapps_url }}\n out=OpenGApps-"$ARCH"-"$GAPPS_VAR".zip" > -i"$DOWNLOAD_DIR"/"$DOWNLOAD_CONF_NAME"
                                  if ! aria2c --no-conf --log-level=info --log="$DOWNLOAD_DIR/aria2_gapps_download.log" -x16 -s16 -j5 -c -R -m0 --async-dns=false --check-integrity --continue --allow-overwrite --conditional-get -d"$DOWNLOAD_DIR" -i"$DOWNLOAD_DIR"/"$DOWNLOAD_CONF_NAME"; then
                                      echo "OpenGApps download error!"
                                      exit 1
                                  fi
                                  echo "opengapps_var=custom" >> $GITHUB_ENV
                              fi
                          fi
                      else
                          GAPPS_VAR="pico"
                          GAPPS_BRAND="MindTheGapps"
                          if [[ "${{ inputs.gapps_var }}" == "Custom (MindTheGapps)" ]]; then
                              if [[ -n "${${{ inputs.gapps_url }}+x}" ]]; then
                                  echo -e "${{ inputs.gapps_url }}\n out=MindTheGapps-"$ARCH".zip" > -i"$DOWNLOAD_DIR"/"$DOWNLOAD_CONF_NAME"

                                  if ! aria2c --no-conf --log-level=info --log="$DOWNLOAD_DIR/aria2_gapps_download.log" -x16 -s16 -j5 -c -R -m0 --async-dns=false --check-integrity --continue --allow-overwrite --conditional-get -d"$DOWNLOAD_DIR" -i"$DOWNLOAD_DIR"/"$DOWNLOAD_CONF_NAME"; then
                                      echo "MindTheGapps download error!"
                                      exit 1
                                  fi
                              fi
                          fi
                      fi
                  else
                      GAPPS_VAR="pico"
                      GAPPS_BRAND="none"
                  fi

                  REMOVE_AMAZON="${opts[REMOVE_AMAZON,${{ inputs.remove_amazon }}]}"

                  NOFIX_PROPS="${opts[NOFIX_PROPS,${{ inputs.nofix_props }}]}"

                  SKIP_DOWNLOAD_WSA="${opts[SKIP_DOWNLOAD_WSA,${{ inputs.skip_download_wsa }}]}"

                  COMPRESSION="--compress --compress-format ${opts[COMPRESSION,${{ inputs.compression }}]}"

                  if [[ "${{ inputs.gapps_var }}" == "Custom"* ]]; then
                      echo "Generate Download Links"
                      python3 generateWSALinks.py "$ARCH" "$RELEASE_TYPE" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME"
                      if [[ "${{ inputs.magisk_ver }}" != "Custom" ]]; then
                          python3 generateMagiskLink.py "$MAGISK_VER" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME"
                      fi

                      echo "Download Artifacts"
                      if ! aria2c --no-conf --log-level=info --log="$DOWNLOAD_DIR/aria2_download.log" -x16 -s16 -j5 -c -R -m0 --async-dns=false --check-integrity --continue --allow-overwrite --conditional-get -d"$DOWNLOAD_DIR" -i"$DOWNLOAD_DIR"/"$DOWNLOAD_CONF_NAME"; then
                          echo "Artifact download error!"
                          exit 1
                      fi
                      OFFLINE="--offline"
                  fi

                  COMMAND_LINE=(--arch "$ARCH" --release-type "$RELEASE_TYPE" --root-sol "$ROOT_SOL" --magisk-ver "$MAGISK_VER" "$CUSTOM_MAGISK" --gapps-brand "$GAPPS_BRAND" --gapps-variant "$GAPPS_VAR" "$COMPRESSION" "$REMOVE_AMAZON" "$NOFIX_PROPS" "$SKIP_DOWNLOAD_WSA" "$OFFLINE")
                  echo "COMMAND_LINE=${COMMAND_LINE[*]}"

                  chmod +x ./build.sh
                  ./build.sh $(echo "${COMMAND_LINE[@]}")
            - name: Generate Release Asset Name
              working-directory: ./output
              run: |
                  declare -A magisk_vers=( ["Stable"]="stable" ["Beta"]="beta" ["Canary"]="canary" ["Debug"]="debug" )

                  if [[ "${{ inputs.magisk_ver }}" == "None" ]]; then
                      magiskVer=""
                  elif [[ "${{ inputs.magisk_ver }}" == "Custom" ]]; then
                      magiskVer="_Magisk-Custom"
                  else
                      magiskVer="_Magisk-${{ env.MAGISK_VERSION }}"
                  fi
                  export magiskVer

                  if [[ "${{ inputs.gapps_var }}" == "None" ]]; then
                      gappsVar=""
                  elif [[ "${{ inputs.gapps_var }}" == *"MindTheGapps"* ]]; then
                      gappsVar="_MindTheGapps"
                  elif [[ "${{ inputs.gapps_var }}" == "Custom (OpenGApps)" ]]; then
                      gappsVar="_OpenGApps-${{ env.opengapps_var }}"
                  else
                      gappsVar="_OpenGApps-${{ inputs.gapps_var }}"
                  fi
                  export gappsVar

                  if [[ "${{ inputs.remove_amazon }}" == "true" ]]; then
                      amazon=""
                  else
                      amazon="_Amazon-AppStore"
                  fi
                  export amazon

                  echo "release_asset_name=WSA_${{ env.WSA_VER }}_${{ inputs.arch }}$magiskVer$gappsVar${amazon}" >> $GITHUB_ENV
                  find . -maxdepth 1 -type f -name 'WSA.*' -exec bash -c 'mv "$1" "WSA_${{ env.WSA_VER }}_${{ inputs.arch }}${magiskVer}${gappsVar}${amazon}${1##*WSA}"' _ {} \;
            - name: Upload Asset
              uses: softprops/action-gh-release@v1
              with:
                  files: ./output/${{ env.release_asset_name }}.*
                  name: WSA
                  tag_name: ${{ inputs.tag }}
                  prerelease: ${{ inputs.prerelease }}