# This is a basic workflow to help you get started with Actions

name: Build and deploy 

# Controls when the action will run. 
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    tags:
      - '*' # This doesn't mean that it HAS to have a tag, only that the workflow triggers when we push a tag
    branches: [ master ]
  pull_request:
    branches: [ master ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # On push events only, if it's a "Update X" commit, it's probably something done through the UI - 
    #  so an .md or yaml change, and not something we need to rebuild over
    # We can't simply put !startsWith - see https://github.community/t/expression-syntax-for-not-startswith/17040
    if: github.event_name != 'push' || startsWith(github.event.commits[0].message, 'Update ') != true
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2

      - uses: actions/setup-java@v1
        with:
          java-version: '11'

      - name: Compile kotlin and build classes
        run: ./gradlew classes
        
      - name: Run code checks
        run: ./gradlew check

      - name: Run unit tests
        run: ./gradlew tests:test


# RELEASE
      
      - name: Get release tag # We can then get the tag using ${{steps.tag.outputs.tag}} as below
        if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
        id: tag
        uses: dawidd6/action-get-tag@v1 
      

      - name: Read release.md and use it as a body of new release. This will fail for patch releases, since they have no readme.
        continue-on-error: true
        if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') 
        id: read_release
        shell: bash
        run: |
          ## To test this in Windows PS:  cat .\changelog.md | wsl grep -Pzo --color '\\#{2}.3.15.7[^\\#]*?\\#{2}' | wsl head -n -2
          r=$(grep -Pzo '\#{2}.${{steps.tag.outputs.tag}}[^\#]*\#' changelog.md)  # grep to get only our release
          r=$(echo "$r" | head -n -2 | tail -n +3) 
          
          ## See https://trstringer.com/github-actions-multiline-strings/
          
          echo "--- Set variable manually in github env ---"

          echo "RELEASE_BODY<<EOF" >> $GITHUB_ENV
          echo "$r" >> $GITHUB_ENV
          echo "EOF" >> $GITHUB_ENV
          
        
## ANDROID        
        
      - name: Prepare .aab (for Google Play) and .apk (for Github) files
        continue-on-error: true
        if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') 
        shell: bash
        run: |
          mkdir whatsNewDirectory
          echo "${{ env.RELEASE_BODY }}" > whatsNewDirectory/whatsnew-en-US
          ./gradlew :android:bundleRelease
          ./gradlew :android:assembleRelease

      - name: Sign AAB for Google Play upload
        uses: r0adkll/sign-android-release@v1
        if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
        with:
          releaseDirectory: android/build/outputs/bundle/release
          signingKeyBase64: ${{ secrets.BUNDLE_SIGNING_KEY_BASE64 }}
          alias: ${{ secrets.BUNDLE_SIGNING_KEY_ALIAS }}
          keyStorePassword: ${{ secrets.BUNDLE_SIGNING_KEYSTORE_PASSWORD }}
          keyPassword: ${{ secrets.BUNDLE_SIGNING_KEY_PASSWORD }}

      - name: Upload AAB to google play
        if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
        continue-on-error: true
        uses: r0adkll/upload-google-play@v1.0.15
        with:
          serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON  }}
          packageName: com.unciv.app
          releaseFiles: android/build/outputs/bundle/release/Unciv-release.aab
          track: production
          userFraction: 0.1
          whatsNewDirectory: whatsNewDirectory


      - name: Sign APK for Github upload
        uses: r0adkll/sign-android-release@v1
        continue-on-error: true
        if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
        with:
          releaseDirectory: android/build/outputs/apk/release
          signingKeyBase64: ${{ secrets.BUNDLE_SIGNING_KEY_BASE64 }}
          alias: ${{ secrets.BUNDLE_SIGNING_KEY_ALIAS }}
          keyStorePassword: ${{ secrets.BUNDLE_SIGNING_KEYSTORE_PASSWORD }}
          keyPassword: ${{ secrets.BUNDLE_SIGNING_KEY_PASSWORD }}


      - name: Move APK to deploy folder
        continue-on-error: true
        if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
        shell: bash
        run: |
          mkdir deploy
          ls android/build/outputs/apk/release
          mv android/build/outputs/apk/release/Unciv-release-unsigned-signed.apk deploy/Unciv-signed.apk

## DESKTOP
      
      - name: Upload to itch.io
        continue-on-error: true
        if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') 
        env:
          BUTLER_API_KEY: ${{ secrets.BUTLER_API_KEY }}
        run: |
          wget -q -O butler.zip https://broth.itch.ovh/butler/linux-amd64/LATEST/archive/default
          unzip butler.zip
          chmod +x butler

          wget -q -O packr-all-4.0.0.jar https://github.com/libgdx/packr/releases/download/4.0.0/packr-all-4.0.0.jar
          wget -q -O jre-linux-64.tar.gz https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9/OpenJDK11U-jre_x64_linux_hotspot_11.0.11_9.tar.gz
          ./gradlew desktop:packrLinux64
          ./butler push deploy/Unciv-Linux64.zip yairm210/unciv:Linux64     --userversion ${{steps.tag.outputs.tag}}
          ./gradlew desktop:zipLinuxFilesForJar

          wget -q -O jdk-windows-32.zip https://github.com/ojdkbuild/ojdkbuild/releases/download/java-1.8.0-openjdk-1.8.0.252-2.b09-x86/java-1.8.0-openjdk-1.8.0.252-2.b09.ojdkbuild.windows.x86.zip
          ./gradlew desktop:packrWindows32
          ./butler push deploy/Unciv-Windows32.zip yairm210/unciv:Windows32 --userversion ${{steps.tag.outputs.tag}}

          #  MacOS bundles correctly but does not run as intended, see https://github.com/yairm210/Unciv/issues/4970
          #  Disabled until this can be checked by sommeone who actually has a Mac computer
          #  wget -q -O jre-macOS.tar.gz https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9/OpenJDK11U-jre_x64_mac_hotspot_11.0.11_9.tar.gz
          #  ./gradlew desktop:packrMacOS
          #  ./butler push deploy/Unciv-MacOS.zip yairm210/unciv:MacOS --userversion ${{steps.tag.outputs.tag}}

          wget -q -O jdk-windows-64.zip https://github.com/ojdkbuild/ojdkbuild/releases/download/java-1.8.0-openjdk-1.8.0.232-1.b09/java-1.8.0-openjdk-1.8.0.232-1.b09.ojdkbuild.windows.x86_64.zip
          ./gradlew desktop:packrWindows64
          ./butler push deploy/Unciv-Windows64.zip yairm210/unciv:Windows64 --userversion ${{steps.tag.outputs.tag}}

          mv desktop/build/libs/Unciv.jar deploy/Unciv.jar
          

      - name: Upload binaries to Github release
        if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
        continue-on-error: true
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: deploy/*
          tag: ${{ github.ref }}
          overwrite: true
          file_glob: true
            # <--- Use environment variables that was created earlier - see https://github.com/svenstaro/upload-release-action
            # Single-quotes do not solve the multiline problem.
          body: |
            ## ${{steps.tag.outputs.tag}}

            ${{ env.RELEASE_BODY }}


      - name: Post announcement on Discord
        continue-on-error: true
        ## On patch releases, don't notify Discord
        if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') && env.RELEASE_BODY != ''
        env:
          DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
        uses: Ilshidur/action-discord@0.3.2
        with: 
          args: | # See https://discordjs.guide/miscellaneous/parsing-mention-arguments.html#how-discord-mentions-work
            <@&663705024265715743>
            *${{steps.tag.outputs.tag}} rolling out!*

            ${{ env.RELEASE_BODY }}
