name: Create android Play Store APK
on:
  push:
    branches: [master, release/*, test/git-actions]
    tags:
      - v*
  workflow_dispatch:
    inputs: {}

permissions:
  contents: write

jobs:
  build-android:
    runs-on: ubuntu-latest
    env:
      UNSPLASH_KEY: ${{ secrets.UNSPLASH_KEY }}
      UNSPLASH_CLIENT_ID: ${{ secrets.UNSPLASH_CLIENT_ID }}
    steps:
      - name: Checkout sources
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
      - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
        with:
          node-version: 20
      - name: Setup Java
        uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e # v5
        with:
          distribution: 'temurin'
          java-version: 21
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5
      #      - name: Build with Gradle
      #        run: ./gradlew build
      - name: Setup android-sdk
        uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3
        with:
          accept-android-sdk-licenses: true
          log-accepted-android-sdk-licenses: true #make accepting the android sdk license verbose

      - name: Get npm cache directory
        id: npm-cache-dir
        run: |
          echo "::set-output name=dir::$(npm config get cache)"
      - uses: actions/cache@8b402f58fbc84540c8b491a91e594a4576fec3d7 # v5
        id: npm-cache # use this to check for `cache-hit` ==> if: steps.npm-cache.outputs.cache-hit != 'true'
        with:
          path: ${{ steps.npm-cache-dir.outputs.dir }}
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-
      - name: Install npm Packages
        #  if: steps.npm-cache.outputs.cache-hit != 'true'
        run: npm i

      - name: Decode Keystore
        env:
          RELEASE_KEYSTORE_PASSWORD: ${{ secrets.DROID_KEYSTORE_PASSWORD }}
          RELEASE_KEYSTORE_ALIAS: ${{ secrets.DROID_KEYSTORE_ALIAS }}
          RELEASE_KEY_PASSWORD: ${{ secrets.DROID_KEY_PASSWORD }}
        run: |
          echo "${{ secrets.DROID_KEYSTORE_BASE_64 }}" | base64 --decode > keystore.jks

      - name: Build
        run: npm run dist:android:prod
        env:
          RELEASE_KEYSTORE_PASSWORD: ${{ secrets.DROID_KEYSTORE_PASSWORD }}
          RELEASE_KEYSTORE_ALIAS: ${{ secrets.DROID_KEYSTORE_ALIAS }}
          RELEASE_KEY_PASSWORD: ${{ secrets.DROID_KEY_PASSWORD }}

      - name: DEBUG
        run: |
          ls -la android/app/build/outputs
          ls -la android/app/build/outputs/apk
          ls -la android/app/build/outputs/apk/play
          ls -la android/app/build/outputs/apk/play/release

      # APK is now signed automatically by Gradle using signingConfig

      - name: 'Upload APK files'
        uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
        with:
          name: sup-android-release
          path: android/app/build/outputs/apk/**/*.apk

      - name: Wait for main release to be created
        if: startsWith(github.ref, 'refs/tags/v')
        run: |
          echo "Waiting for main release to be created..."
          for i in {1..40}; do
            if gh release view ${{ github.ref_name }} --repo ${{ github.repository }} >/dev/null 2>&1; then
              echo "Release found!"
              break
            fi
            echo "Waiting for release... (attempt $i/40)"
            sleep 30
          done

          # Fail if release still doesn't exist
          if ! gh release view ${{ github.ref_name }} --repo ${{ github.repository }} >/dev/null 2>&1; then
            echo "ERROR: Release ${{ github.ref_name }} was not created after 20 minutes"
            exit 1
          fi
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Upload APK to existing GitHub Release
        if: startsWith(github.ref, 'refs/tags/v')
        run: |
          for apk in android/app/build/outputs/apk/play/release/*.apk; do
            if [ -f "$apk" ]; then
              echo "Uploading $apk to release ${{ github.ref_name }}"
              gh release upload ${{ github.ref_name }} "$apk" --repo ${{ github.repository }}
            fi
          done
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Upload to Google Play Console
        if: startsWith(github.ref, 'refs/tags/v') && !contains(github.ref, '-')
        uses: r0adkll/upload-google-play@935ef9c68bb393a8e6116b1575626a7f5be3a7fb # v1.1.3
        with:
          serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
          packageName: com.superproductivity.superproductivity
          releaseFiles: android/app/build/outputs/apk/play/release/*.apk
          track: internal
          status: draft
          inAppUpdatePriority: 2
