name: Validate publishing functionality

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

permissions:
  contents: read

defaults:
  run:
    shell: pwsh

jobs:
  setup-java-publishing:
    name: Validate settings.xml
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, windows-latest, ubuntu-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@v7
        with:
          persist-credentials: false
      - name: setup-java
        uses: ./
        id: setup-java
        with:
          distribution: 'temurin'
          java-version: '11'
          server-id: maven
          server-username-env-var: MAVEN_USERNAME
          server-password-env-var: MAVEN_CENTRAL_TOKEN
          gpg-passphrase-env-var: MAVEN_GPG_PASSPHRASE
      - name: Validate settings.xml
        run: |
          $xmlPath = Join-Path $HOME ".m2" "settings.xml"
          Get-Content $xmlPath | ForEach-Object { Write-Host $_ }

          $content = [System.IO.File]::ReadAllText($xmlPath)
          $expected = @(
            '<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"'
            '  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
            '  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">'
            '  <interactiveMode>false</interactiveMode>'
            '  <servers>'
            '    <server>'
            '      <id>maven</id>'
            '      <username>${env.MAVEN_USERNAME}</username>'
            '      <password>${env.MAVEN_CENTRAL_TOKEN}</password>'
            '    </server>'
            '  </servers>'
            '</settings>'
          ) -join "`n"

          if ($content -ne $expected) {
            Write-Host "Expected settings.xml:"
            $expected -split "`n" | ForEach-Object { Write-Host $_ }
            throw "Generated XML file is incorrect"
          }

  test-publishing-overwrite:
    name: settings.xml is overwritten if flag is true
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, windows-latest, ubuntu-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@v7
        with:
          persist-credentials: false
      - name: Create fake settings.xml
        run: |
          $xmlDirectory = Join-Path $HOME ".m2"
          $xmlPath = Join-Path $xmlDirectory "settings.xml"
          New-Item -Path $xmlDirectory -ItemType Directory
          Set-Content -Path $xmlPath -Value "Fake_XML"
      - name: setup-java
        uses: ./
        id: setup-java
        with:
          distribution: 'temurin'
          java-version: '11'
          server-id: maven
          server-username-env-var: MAVEN_USERNAME
          server-password-env-var: MAVEN_CENTRAL_TOKEN
          gpg-passphrase-env-var: MAVEN_GPG_PASSPHRASE
      - name: Validate settings.xml is overwritten
        run: |
          $xmlPath = Join-Path $HOME ".m2" "settings.xml"
          Get-Content $xmlPath | ForEach-Object { Write-Host $_ }

          $content = Get-Content $xmlPath -Raw
          if ($content -notlike '*maven*') {
            throw "settings.xml file is not overwritten"
          }

  test-publishing-skip-overwrite:
    name: settings.xml is not overwritten if flag is false
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, windows-latest, ubuntu-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@v7
        with:
          persist-credentials: false
      - name: Create fake settings.xml
        run: |
          $xmlDirectory = Join-Path $HOME ".m2"
          $xmlPath = Join-Path $xmlDirectory "settings.xml"
          New-Item -Path $xmlDirectory -ItemType Directory
          Set-Content -Path $xmlPath -Value "Fake_XML"
      - name: setup-java
        uses: ./
        id: setup-java
        with:
          distribution: 'temurin'
          java-version: '11'
          server-id: maven
          server-username-env-var: MAVEN_USERNAME
          server-password-env-var: MAVEN_CENTRAL_TOKEN
          overwrite-settings: false
          gpg-passphrase-env-var: MAVEN_GPG_PASSPHRASE
      - name: Validate that settings.xml is not overwritten
        run: |
          $xmlPath = Join-Path $HOME ".m2" "settings.xml"
          $content = Get-Content -Path $xmlPath -Raw
          Write-Host $content

          if ($content -notlike "*Fake_XML*") {
            throw "settings.xml file was overwritten but it should not be"
          }

  test-publishing-custom-location:
    name: settings.xml in custom location
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, windows-latest, ubuntu-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@v7
        with:
          persist-credentials: false
      - name: setup-java
        uses: ./
        id: setup-java
        with:
          distribution: 'temurin'
          java-version: '11'
          server-id: maven
          server-username-env-var: MAVEN_USERNAME
          server-password-env-var: MAVEN_CENTRAL_TOKEN
          gpg-passphrase-env-var: MAVEN_GPG_PASSPHRASE
          settings-path: ${{ runner.temp }}
      - name: Validate settings.xml location
        run: |
          $path = Join-Path $env:RUNNER_TEMP "settings.xml"
          if (-not (Test-Path $path)) {
            throw "settings.xml file is not found in expected location"
          }
