name: CI build

on:
  push:
    branches:
      - master

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

jobs:
  check_wrapper:
    name: Validate Gradle Wrapper
    runs-on: ubuntu-latest
    steps:
      - name: Clone repo
        uses: actions/checkout@v6

      - name: Validate Gradle Wrapper
        uses: gradle/actions/wrapper-validation@v5

  build:
    name: Build Jar
    needs: check_wrapper
    runs-on: ubuntu-latest
    steps:
      - name: Checkout master branch
        uses: actions/checkout@v6
        with:
          ref: master
          path: master
          fetch-depth: 0

      - name: Set up JDK
        uses: actions/setup-java@v5
        with:
          java-version: 25
          distribution: 'zulu'

      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@v5

      - name: Copy CI gradle.properties
        run: |
          cd master
          mkdir -p ~/.gradle
          cp .github/runner-files/ci-gradle.properties ~/.gradle/gradle.properties

      - name: Build Jar
        env:
          ProductBuildType: "Preview"
        working-directory: master
        run: ./gradlew :server:shadowJar --stacktrace

      - name: Upload Jar
        uses: actions/upload-artifact@v7
        with:
          name: jar
          path: master/server/build/*.jar
          if-no-files-found: error

      - name: Upload icons
        uses: actions/upload-artifact@v7
        with:
          name: icon
          path: master/server/src/main/resources/icon
          if-no-files-found: error

      - name: Tar scripts dir to maintain file permissions
        run: tar -cvzf scripts.tar.gz -C master/ scripts/

      - name: Upload scripts.tar.gz
        uses: actions/upload-artifact@v7
        with:
          name: scripts
          path: scripts.tar.gz
          if-no-files-found: error

  jlink:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - os: ubuntu-latest
            name: linux-x64
          - os: windows-latest
            name: windows-x64
          - os: macos-15
            name: macOS-arm64
          - os: macos-15-intel
            name: macOS-x64
        os: [ubuntu-latest, windows-latest, macos-15, macos-15-intel]

    steps:
      - name: Set up JDK
        uses: actions/setup-java@v5
        with:
          java-version: 25
          distribution: 'zulu'

      - name: Package JDK
        run: jlink --add-modules java.base,java.compiler,java.datatransfer,java.desktop,java.instrument,java.logging,java.management,java.naming,java.prefs,java.scripting,java.se,java.security.jgss,java.security.sasl,java.sql,java.transaction.xa,java.xml,jdk.attach,jdk.crypto.ec,jdk.jdi,jdk.management,jdk.net,jdk.unsupported,jdk.unsupported.desktop,jdk.zipfs,jdk.accessibility --output suwa --strip-debug --no-man-pages --no-header-files --compress=2

      - name: Upload JRE package
        uses: actions/upload-artifact@v7
        with:
          name: ${{ matrix.name }}-jre
          path: suwa

  bundle:
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: debian-all
            jre: linux-x64
          - name: appimage
            jre: linux-x64
          - name: linux-assets
            jre: linux-assets
          - name: linux-x64
            jre: linux-x64
          - name: macOS-x64
            jre: macOS-x64
          - name: macOS-arm64
            jre: macOS-arm64
          - name: windows-x64
            jre: windows-x64
        name: [debian-all, appimage, linux-assets, linux-x64, macOS-x64, macOS-arm64, windows-x64]

    name: Make ${{ matrix.name }} release
    needs: [build, jlink]
    runs-on: ubuntu-latest
    steps:
      - name: Download Jar
        uses: actions/download-artifact@v8
        with:
          name: jar
          path: server/build

      - name: Download JRE
        uses: actions/download-artifact@v8
        if: matrix.name != 'linux-assets' && matrix.name != 'debian-all'
        with:
          name: ${{ matrix.jre }}-jre
          path: jre

      - name: Download icons
        uses: actions/download-artifact@v8
        with:
          name: icon
          path: server/src/main/resources/icon

      - name: Download scripts.tar.gz
        uses: actions/download-artifact@v8
        with:
          name: scripts

      - name: Make ${{ matrix.name }} release
        run: |
          mkdir upload
          tar -xvpf scripts.tar.gz
          scripts/bundler.sh -o upload/ ${{ matrix.name }}

      - name: Upload ${{ matrix.name }} release
        uses: actions/upload-artifact@v7
        with:
          name: ${{ matrix.name }}
          path: upload/*
          if-no-files-found: error

  release:
    needs: bundle
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v8
        with:
          name: jar
          path: release
      - uses: actions/download-artifact@v8
        with:
          name: debian-all
          path: release
      - uses: actions/download-artifact@v8
        with:
          name: appimage
          path: release
      - uses: actions/download-artifact@v8
        with:
          name: linux-assets
          path: release
      - uses: actions/download-artifact@v8
        with:
          name: linux-x64
          path: release
      - uses: actions/download-artifact@v8
        with:
          name: macOS-x64
          path: release
      - uses: actions/download-artifact@v8
        with:
          name: macOS-arm64
          path: release
      - uses: actions/download-artifact@v8
        with:
          name: windows-x64
          path: release

      - name: Checkout Preview branch
        uses: actions/checkout@v6
        with:
          repository: "Suwayomi/Suwayomi-Server-preview"
          ref: main
          path: preview
          token: ${{ secrets.DEPLOY_PREVIEW_TOKEN }}

      - name: Generate Tag Name
        id: GenTagName
        run: |
          cd release
          genTag=$(ls *.jar | sed -e's/Suwayomi-Server-\|.jar//g')
          echo "$genTag"
          echo "value=$genTag" >> $GITHUB_OUTPUT

      - name: Create Tag
        run: |
          TAG="${{ steps.GenTagName.outputs.value }}"
          echo "tag: $TAG"
          cd preview
          echo "{ \"latest\": \"$TAG\" }" > index.json
          git add index.json
          git config --global user.email \
            "github-actions[bot]@users.noreply.github.com"
          git config --global user.name "github-actions[bot]"
          git commit -m "Updated to $TAG"
          git push origin main

          git tag $TAG
          git push origin $TAG

      - name: Upload Preview Release
        uses: softprops/action-gh-release@v3
        with:
          token: ${{ secrets.DEPLOY_PREVIEW_TOKEN }}
          repository: "Suwayomi/Suwayomi-Server-preview"
          tag_name:  ${{ steps.GenTagName.outputs.value }}
          files: release/*

