# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#    https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
name: "Java Platform compatibility"

on:
  push:
    branches: [ "develop", "plc4j" ]
    paths:
      - plc4j**
      - pom.xml
  pull_request:
    paths:
      - plc4j**
      - pom.xml
  workflow_dispatch:
    inputs:
      forceUpdates:
        description: "Forces a snapshot update"
        required: false
        default: 'false'

env:
  DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}

jobs:
  test:
    strategy:
      matrix:
        java: [ 21 ]
        os: [ ubuntu-latest, macos-latest, windows-latest ]
      fail-fast: false
    runs-on: ${{ matrix.os }}
    steps:
      - name: Install libpcap for Linux
        if: matrix.os == 'ubuntu-latest'
        run: sudo apt-get install libpcap-dev

      - name: Install libpcap for macos
        if: matrix.os == 'macos-latest'
        run: brew install libpcap

      - name: Checkout repository
        uses: actions/checkout@v7

      - name: Setup Java
        uses: actions/setup-java@v5
        with:
          distribution: 'adopt'
          java-package: jdk
          java-version: ${{ matrix.java }}

      - name: Cache local Maven repository
        uses: actions/cache@v6
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Set Platform options
        id: platform_opts
        uses: actions/github-script@v9.0.0
        env:
          OS: ${{ matrix.os }}
        with:
          script: |
            const { OS } = process.env
            if (OS.includes("windows")) {
              core.setOutput('platform_opts', ``)
            } else if (OS.includes("macos")) {
              core.setOutput('platform_opts', `-Djna.library.path="$(find /usr/local/Cellar/libpcap/ -name lib)"`)
            } else if (OS.includes("ubuntu")) {
              core.setOutput('platform_opts', ``)
            } else {
              core.setOutput('platform_opts', ``)
            }

      - name: Calculate platform suffix
        id: platform_suffix
        uses: actions/github-script@v9.0.0
        env:
          OS: ${{ matrix.os }}
        with:
          script: |
            const { OS } = process.env
            if (OS.includes("windows")) {
              core.setOutput('platform_suffix', `.cmd`)
            } else {
              core.setOutput('platform_suffix', ``)
            }

      - name: Set extra options
        id: extra_options
        uses: actions/github-script@v9.0.0
        env:
          FORCE_UPDATE: ${{ github.event.inputs.forceUpdates }}
        with:
          script: |
            const { FORCE_UPDATE } = process.env
            if (FORCE_UPDATE.includes("true")) {
              core.setOutput('extra_options', `-U`)
            } else {
              core.setOutput('extra_options', ``)
            }

      # Note: due to github has no concept of recovering from a fail even if we have our fallback below we append a second un-parallel run behind this to be sure that it works with all checks. Only if that fails too we are ok with a "red" (which should be yellow) cross indicating a problem
      - name: Run mvnw
        run: |
          ./mvnw${{ steps.platform_suffix.outputs.platform_suffix }} ${{ steps.extra_options.outputs.extra_options }} -B -Pwith-java ${{ steps.platform_opts.outputs.platform_opts }} install

      - name: Upload Test Report (first failure)
        uses: actions/upload-artifact@v7
        if: failure()
        with:
          name: "java-test-report-first-failure-${{ matrix.os }}-java-${{ matrix.java }}"
          path: |
            **/surefire-reports/TEST-*.xml
            **/failsafe-reports/TEST-*.xml

      - name: Upload Test Report
        uses: actions/upload-artifact@v7
        if: success() || failure()
        with:
          name: "java-test-report-${{ matrix.os }}-java-${{ matrix.java }}"
          path: |
            **/surefire-reports/TEST-*.xml
            **/failsafe-reports/TEST-*.xml
