name: Java CI with Maven

on:
  workflow_dispatch:
  push:
    branches: [ "main", "dev", "cleanup" ]
    tags:
      - 'v*.*.*'
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'
        cache: maven
    - name: Build with Maven
      run: mvn -B package
      working-directory: main
    - name: Upload built JAR
      uses: actions/upload-artifact@v4
      with:
        name: package
        path: main/target/*.jar
    - name: Generate dependency graph
      run: mvn -B -f main/pom.xml com.github.ferstl:depgraph-maven-plugin:4.0.1:graph
    - name: Upload dependency graph artifact
      uses: actions/upload-artifact@v4
      with:
        name: dependency-graph
        path: main/target/**

  build-windows:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'
        cache: maven
    - name: Build with Maven (Skip Tests)
      run: mvn -B package -DskipTests
      working-directory: main
    - name: Create JPackage App Image
      shell: pwsh
      run: |
        New-Item -ItemType Directory -Force -Path "dist"
        jpackage --name "DTSS" `
          --input main/target `
          --main-jar main-1.0-SNAPSHOT.jar `
          --dest dist `
          --type app-image `
          --win-console
    - name: Inject java.exe
      shell: pwsh
      run: |
        $javaPath = (Get-Command java).Source
        Copy-Item -Path $javaPath -Destination "dist/DTSS/runtime/bin/"
    - name: Zip Windows Release
      shell: pwsh
      run: |
        Compress-Archive -Path "dist/DTSS" -DestinationPath "dist/DTSS-Windows.zip"
    - name: Upload Windows Artifact
      uses: actions/upload-artifact@v4
      with:
        name: windows-package
        path: dist/DTSS-Windows.zip

  publish-release:
    runs-on: ubuntu-latest
    needs: [build, build-windows]
    if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' || github.ref == 'refs/heads/main'
    permissions:
      contents: write
    steps:
    - name: Download Linux JAR
      uses: actions/download-artifact@v4
      with:
        name: package
        path: main/target/
    - name: Download Windows Zip
      uses: actions/download-artifact@v4
      with:
        name: windows-package
        path: windows-dist/
    - name: Create GitHub Release
      uses: softprops/action-gh-release@v2
      with:
        tag_name: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || 'snapshot-build' }}
        name: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || 'Manual Snapshot Build' }}
        draft: false
        prerelease: true
        make_latest: false
        files: |
          main/target/*.jar
          windows-dist/*.zip
