# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle

name: Java CI with Gradle

on:
  push:
    branches: [ "v2.x.x" ]
  pull_request:
    branches: [ "v2.x.x" ]
  release:
    types: [published]
    branches: [ "v2.x.x" ]

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: write

    env:
      MODRINTH_VERSIONS: '["1.21.x", "26.1.x", "26.2.x"]'
      MODRINTH_PLATFORMS: '["spigot", "paper", "purpur", "folia"]'

    steps:
      - uses: actions/checkout@v6
      - name: Set up JDKs
        uses: actions/setup-java@v5
        with:
          java-version: |
            21
          distribution: 'temurin'
          cache: gradle

      # Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
      # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@v6

      - name: Make gradlew executable
        run: chmod +x ./gradlew

      # Setup paperweight cache
      - name: Cache paperweight
        uses: actions/cache@v6
        with:
          path: |
            ./*/.gradle/caches/paperweight
          key: paperweight-submodules-${{ runner.os }}-${{ hashFiles('nms/*/build.gradle*') }}
          restore-keys: |
            paperweight-submodules-${{ runner.os }}-

      - name: Get small commit hash
        if: ${{ github.event_name != 'release' && success() }}
        run: echo "SMALL_COMMIT_HASH=$(git rev-parse --short ${{ github.sha }})" >> $GITHUB_ENV

      - name: Build with Gradle Wrapper
        run: ./gradlew build --parallel --stacktrace

      # only submit dependency on push
      - name: Generate and submit dependency graph
        uses: gradle/actions/dependency-submission@v6
        if: ${{ github.event_name == 'push' && success() }}
        continue-on-error: true

      # Get the names of the online and offline jars
      # grep -v "offline" to exclude offline jar as the regex would catch it otherwise
      - name: Get file name for jars
        run: |
          ONLINE_JAR_PATH=$(ls build/libs/CustomAnvil-*.jar | grep -v "offline")
          OFFLINE_JAR_PATH=$(ls build/libs/CustomAnvil-*-offline.jar)
          
          echo "ONLINE_JAR_NAME=$(basename $ONLINE_JAR_PATH)" >> $GITHUB_ENV
          echo "OFFLINE_JAR_NAME=$(basename $OFFLINE_JAR_PATH)" >> $GITHUB_ENV

      # upload the named jars as artifact
      - name: Upload online JAR artifact
        uses: actions/upload-artifact@v7
        with:
          path: build/libs/${{ env.ONLINE_JAR_NAME }}
          archive: false

      - name: Upload offline JAR file
        uses: actions/upload-artifact@v7
        with:
          path: build/libs/${{ env.OFFLINE_JAR_NAME }}
          archive: false

      - name: Summarize tests results
        uses: jeantessier/test-summary-action@v1
        if: ${{ always() }}

      # upload the jar to release
      - name: Upload jar to release
        if: ${{ github.event_name == 'release' && success() }}
        uses: softprops/action-gh-release@v3
        with:
          files: |
            build/libs/${{ env.ONLINE_JAR_NAME }}
            build/libs/${{ env.OFFLINE_JAR_NAME }}

      - name: Hangar release
        if: ${{ (github.event_name != 'release' || github.event_name != 'push') && github.repository_owner == 'alexcrea' && success() }}
        env:
          HANGAR_API_TOKEN: ${{ secrets.HANGAR_API_TOKEN }}
          RELEASE_CHANGELOG: ${{ github.event.release.body }}
        run: ./gradlew publishAllPublicationsToHangar --stacktrace

      - name: Modrinth publish alpha
        if: ${{ github.event_name == 'push' && github.repository_owner == 'alexcrea' && success() }}
        uses: cloudnode-pro/modrinth-publish@v2
        with:
          token: ${{ secrets.MODRINTH_TOKEN }}
          project: S75Ueiq9
          name: dev-${{ env.SMALL_COMMIT_HASH }}
          version: dev-${{ env.SMALL_COMMIT_HASH }}
          loaders: ${{ env.MODRINTH_PLATFORMS }}
          game-versions: ${{ env.MODRINTH_VERSIONS }}
          channel: alpha
          files: build/libs/${{ env.ONLINE_JAR_NAME }}
          changelog: ${{ github.event.head_commit.message }}

      - name: Modrinth publish release
        if: ${{ github.event_name == 'release' && github.repository_owner == 'alexcrea' && success() }}
        uses: cloudnode-pro/modrinth-publish@v2
        with:
          token: ${{ secrets.MODRINTH_TOKEN }}
          project: S75Ueiq9
          name: ${{ github.event.release.name }}
          version: ${{ github.event.release.tag_name }}${{ github.event.release.prerelease && '-pre' || '' }}
          loaders: ${{ env.MODRINTH_PLATFORMS }}
          game-versions: ${{ env.MODRINTH_VERSIONS }}
          channel: ${{ github.event.release.prerelease == false && 'release' || 'beta' }}
          files: build/libs/${{ env.ONLINE_JAR_NAME }}
          changelog: ${{ github.event.release.body }}

      - name: Send release note to discord
        if: ${{ github.event_name == 'release' && github.repository_owner == 'alexcrea' && success() }}
        uses: tsickert/discord-webhook@v7.0.0
        with:
          webhook-url: ${{ secrets.RELEASE_WEBHOOK_URL }}
          content: |
            ${{ github.event.release.prerelease == false && '<@&1338546156325568642>' || '<@&1352296092989001768>' }}
            # New ${{ github.event.release.prerelease && 'beta ' || '' }}version of custom anvil ! <:CustomAnvil:1262550667986342001>([Modrinth](https://modrinth.com/plugin/customanvil), [Hangar](https://hangar.papermc.io/alexcrea/CustomAnvil) and [GitHub](${{ github.event.release.html_url }}) links)
            -# note: automated release. spigot is not uploaded yet.

            ${{ github.event.release.body }}
