name: Nix - GA Runner

on:
  push:
    branches: ["dev", "candidate", "release"]
  pull_request:
    branches: ["dev", "candidate", "release"]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  build-job:
    runs-on: ubuntu-latest
    outputs:
      artifact_name: ${{ steps.set-artifact-name.outputs.artifact_name }}
    strategy:
      fail-fast: false
      matrix:
        compiler: [gcc]
        configuration: [Debug]
        include:
          - compiler: gcc
            cc: gcc-11
            cxx: g++-11
            compiler_id: gcc-11
    env:
      build_dir: .build
      # Bump this number to invalidate all caches globally.
      CACHE_VERSION: 1
      MAIN_BRANCH_NAME: dev
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install build dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y ninja-build ${{ matrix.cc }} ${{ matrix.cxx }} ccache
          # Install specific Conan version needed
          pip install --upgrade "conan<2"

      - name: Configure ccache
        uses: ./.github/actions/xahau-configure-ccache
        with:
          max_size: 2G
          hash_dir: true
          compiler_check: content

      - name: Configure Conan
        run: |
          conan profile new default --detect || true # Ignore error if profile exists
          conan profile update settings.compiler.cppstd=20 default
          conan profile update settings.compiler=${{ matrix.compiler }} default
          conan profile update settings.compiler.libcxx=libstdc++11 default
          conan profile update env.CC=/usr/bin/${{ matrix.cc }} default
          conan profile update env.CXX=/usr/bin/${{ matrix.cxx }} default
          conan profile update conf.tools.build:compiler_executables='{"c": "/usr/bin/${{ matrix.cc }}", "cpp": "/usr/bin/${{ matrix.cxx }}"}' default

          # Set correct compiler version based on matrix.compiler
          if [ "${{ matrix.compiler }}" = "gcc" ]; then
            conan profile update settings.compiler.version=11 default
          elif [ "${{ matrix.compiler }}" = "clang" ]; then
            conan profile update settings.compiler.version=14 default
          fi
          # Display profile for verification
          conan profile show default

      - name: Check environment
        run: |
          echo "PATH:"
          echo "${PATH}" | tr ':' '\n'
          which conan && conan --version || echo "Conan not found"
          which cmake && cmake --version || echo "CMake not found"
          which ${{ matrix.cc }} && ${{ matrix.cc }} --version || echo "${{ matrix.cc }} not found"
          which ${{ matrix.cxx }} && ${{ matrix.cxx }} --version || echo "${{ matrix.cxx }} not found"
          which ccache && ccache --version || echo "ccache not found"
          echo "---- Full Environment ----"
          env

      - name: Install dependencies
        uses: ./.github/actions/xahau-ga-dependencies
        with:
          configuration: ${{ matrix.configuration }}
          build_dir: ${{ env.build_dir }}
          compiler-id: ${{ matrix.compiler_id }}
          cache_version: ${{ env.CACHE_VERSION }}
          main_branch: ${{ env.MAIN_BRANCH_NAME }}

      - name: Build
        uses: ./.github/actions/xahau-ga-build
        with:
          generator: Ninja
          configuration: ${{ matrix.configuration }}
          build_dir: ${{ env.build_dir }}
          cc: ${{ matrix.cc }}
          cxx: ${{ matrix.cxx }}
          compiler-id: ${{ matrix.compiler_id }}
          cache_version: ${{ env.CACHE_VERSION }}
          main_branch: ${{ env.MAIN_BRANCH_NAME }}

      - name: Set artifact name
        id: set-artifact-name
        run: |
          ARTIFACT_NAME="build-output-nix-${{ github.run_id }}-${{ matrix.compiler }}-${{ matrix.configuration }}"
          echo "artifact_name=${ARTIFACT_NAME}" >> "$GITHUB_OUTPUT"
          echo "Using artifact name: ${ARTIFACT_NAME}"

      - name: Debug build directory
        run: |
          echo "Checking build directory contents: ${{ env.build_dir }}"
          ls -la ${{ env.build_dir }} || echo "Build directory not found or empty"

      - name: Run tests
        run: |
          # Ensure the binary exists before trying to run
          if [ -f "${{ env.build_dir }}/rippled" ]; then
            ${{ env.build_dir }}/rippled --unittest --unittest-jobs $(nproc)
          else
             echo "Error: rippled executable not found in ${{ env.build_dir }}"
             exit 1
          fi