name: CI

on:
  push:
    branches:
      - 'main'
    paths-ignore:
      - '.github/**/*.md'
  pull_request:
    branches:
      - 'main'
    paths-ignore:
      - '.github/**/*.md'
  workflow_dispatch:

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        java: [ '17', '21', 'profile-j21' ]
        maven: [ '3.9.9' ]
        os: [ 'ubuntu-24.04' ]
    name: Build (Java ${{ matrix.java }}, ${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout
        if: github.head_ref == ''
        uses: actions/checkout@v4

      - name: Checkout merge
        if: github.head_ref != ''
        uses: actions/checkout@v4
        with:
          ref: refs/pull/${{github.event.pull_request.number}}/merge

      - name: Set up Cache
        uses: actions/cache@v4
        with:
          path: |
            ~/.m2/repository
            !~/.m2/repository/org/openhab
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Set up Java ${{ matrix.java }}
        uses: actions/setup-java@v4
        if: ${{ matrix.java != 'profile-j21' }}
        with:
          distribution: 'temurin'
          java-version: ${{ matrix.java }}

      - name: Set up Java ${{ matrix.java }}
        uses: actions/setup-java@v4
        if: ${{ matrix.java == 'profile-j21' }}
        with:
          distribution: 'temurin'
          java-version: ${{ 21 }}

      - name: Set up Maven ${{ matrix.maven }}
        uses: stCarolas/setup-maven@v5
        with:
          maven-version: ${{ matrix.maven }}

      - name: Register Problem Matchers
        if: ${{ matrix.java == '17' }}
        id: problem_matchers
        run: |
          echo "::add-matcher::.github/openhab-compile-problems.json"

      - name: Build
        if: ${{ matrix.java != 'profile-j21' }}
        id: build
        run: './.github/scripts/maven-build'
        env:
          MAVEN_OPTS: >-
            -Xmx2g
            -Dmaven.wagon.http.retryHandler.count=5
            -Dmaven.wagon.httpconnectionManager.ttlSeconds=25
            -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn

      - name: Build
        if: ${{ matrix.java == 'profile-j21' }}
        id: build-j21
        run: './.github/scripts/maven-build clean verify -B -T 1.5C -U -Pj21'
        env:
          MAVEN_OPTS: >-
            -Xmx2g
            -Dmaven.wagon.http.retryHandler.count=5
            -Dmaven.wagon.httpconnectionManager.ttlSeconds=25
            -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn

      - name: Upload Build Log
        if: ${{ always() && ((steps.build.outcome == 'success') || (steps.build.outcome == 'failure') || (steps.build-j21.outcome == 'success') || (steps.build-j21.outcome == 'failure')) }}
        uses: actions/upload-artifact@v4
        with:
          name: build-log-java-${{ matrix.java }}-${{ matrix.os }}
          path: build.log

      - name: Upload SAT Summary Report
        if: ${{ matrix.java == '17' && always() && ((steps.build.outcome == 'success') || (steps.build.outcome == 'failure')) }}
        uses: actions/upload-artifact@v4
        with:
          name: sat-summary-report
          path: target/summary_report.html

      - name: Report SAT Errors as Annotations
        if: ${{ matrix.java == '17' && always() && ((steps.build.outcome == 'success') || (steps.build.outcome == 'failure')) }}
        uses: ghys/checkstyle-github-action@main
        with:
          title: CheckStyle Violations
          path: '**/checkstyle-result.xml'
          mode: inline

      - name: Verify Changed Files
        uses: tj-actions/verify-changed-files@v20
        id: verify-changed-files

      - name: Fail on Changed Files
        if: steps.verify-changed-files.outputs.changed_files != ''
        env:
          CHANGED_FILES: ${{ steps.verify-changed-files.outputs.changed_files }}
        run: |
          echo "::error::Files have changed: $CHANGED_FILES"
          exit 1
