# ----------------------------------------------------------------------------
# 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:
      - code-generation/**
      - protocols/**
      - plc4j**
      - pom.xml
  pull_request:
    paths:
      - code-generation/**
      - protocols/**
      - plc4j**
      - pom.xml
  workflow_dispatch:
    inputs:
      forceUpdates:
        description: "Forces a snapshot update"
        required: false
        default: 'false'

env:
  GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GE_ACCESS_TOKEN }}

jobs:
  test:
    strategy:
      matrix:
        # 8 not anymore supported for building
        java: [ 11, 17, 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@v4

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

      - name: Cache local Maven repository
        uses: actions/cache@v4
        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@v7.0.1
        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@v7.0.1
        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@v7.0.1
        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', ``)
            }

#      - name: Initialize CodeQL
#        uses: github/codeql-action/init@v3
#        with:
#          languages: java

      # 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 -P'with-java,enable-all-checks,update-generated-code' ${{ steps.platform_opts.outputs.platform_opts }} install

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

      - name: Run mvnv without BacNet regression tests
        if: ${{ failure() }}
        run: ./mvnw${{ steps.platform_suffix.outputs.platform_suffix }} ${{ steps.extra_options.outputs.extra_options }} -B -P'with-java,skip-bacnet-regression-test,update-generated-code' ${{ steps.platform_opts.outputs.platform_opts }} install

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

#      - name: Perform CodeQL Analysis
#        uses: github/codeql-action/analyze@v3
