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@v4

      - name: Validate Gradle Wrapper
        uses: gradle/wrapper-validation-action@v3

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

      - name: Set up JDK 1.8
        uses: actions/setup-java@v4
        with:
          java-version: 8
          distribution: 'temurin'

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

      - 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@v4
        with:
          name: jar
          path: master/server/build/*.jar
          if-no-files-found: error

      - name: Upload icons
        uses: actions/upload-artifact@v4
        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@v4
        with:
          name: scripts
          path: scripts.tar.gz
          if-no-files-found: error

  bundle:
    strategy:
      fail-fast: false
      matrix:
        os:
          - debian-all
          - linux-assets
          - linux-x64
          - macOS-x64
          - macOS-arm64
          - windows-x64
          - windows-x86

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

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

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

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

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

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

      - name: Checkout Preview branch
        uses: actions/checkout@v4
        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@v2
        with:
          token: ${{ secrets.DEPLOY_PREVIEW_TOKEN }}
          repository: "Suwayomi/Suwayomi-Server-preview"
          tag_name:  ${{ steps.GenTagName.outputs.value }}
          files: release/*

