name: C/C++ CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      CC: gcc
    steps:
      - name: Check out repository
        uses: actions/checkout@v5

      - name: Install PostgreSQL build dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends build-essential ca-certificates wget gnupg lsb-release clang

          # Find available postgresql-server-dev-N packages and install the highest version available
          available_versions=$(apt-cache pkgnames 'postgresql-server-dev-*' \
            | grep -E '^postgresql-server-dev-[0-9]+$' \
            | sed -E 's/^postgresql-server-dev-([0-9]+)$/\1/' \
            | sort -nr)

          if [ -n "$available_versions" ]; then
            chosen=$(echo "$available_versions" | head -n1)
            echo "Installing postgresql-server-dev-$chosen"
            sudo apt-get install -y --no-install-recommends postgresql-server-dev-"$chosen"
          else
            echo "No numbered postgresql-server-dev packages found in default repos"
            for v in 16 15 14 13 12; do
              if apt-cache show postgresql-server-dev-$v >/dev/null 2>&1; then
                echo "Found postgresql-server-dev-$v in apt; installing"
                sudo apt-get install -y --no-install-recommends postgresql-server-dev-$v
                break
              fi
            done
          fi

          if ! command -v pg_config >/dev/null 2>&1; then
            echo "No suitable postgresql-server-dev package found in default repos — adding PGDG repository"
            wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo tee /etc/apt/trusted.gpg.d/pgdg.asc >/dev/null
            echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
            sudo apt-get update

            for v in 16 15 14 13 12; do
              if apt-cache show postgresql-server-dev-$v >/dev/null 2>&1; then
                echo "Installing postgresql-server-dev-$v from PGDG"
                sudo apt-get install -y --no-install-recommends postgresql-server-dev-$v
                break
              fi
            done
          fi

          if ! command -v pg_config >/dev/null 2>&1; then
            echo "pg_config not found after installing dev packages — aborting"
            apt-cache policy postgresql-common postgresql-server-dev-* || true
            exit 1
          fi
          pg_config --version

          # Ensure a clang-19 binary exists (some build targets call clang-19)
          if ! command -v clang-19 >/dev/null 2>&1; then
            if command -v clang >/dev/null 2>&1; then
              echo "Creating /usr/bin/clang-19 symlink to installed clang"
              sudo ln -sf "$(command -v clang)" /usr/bin/clang-19
            fi
          fi

          # Ensure llvm-lto (used by thinlto) is available at the expected path
          if ! [ -x /usr/lib/llvm-19/bin/llvm-lto ]; then
            echo "Attempting to install LLVM 19 tools (provides llvm-lto)..."
            sudo apt-get install -y --no-install-recommends llvm-19 llvm-19-tools llvm-19-dev || true

            llvm_lto="$(command -v llvm-lto || command -v llvm-lto-19 || ls /usr/lib/llvm-*/bin/llvm-lto 2>/dev/null | head -n1 || true)"
            if [ -n "$llvm_lto" ]; then
              echo "Found llvm-lto at: $llvm_lto"
              target=/usr/lib/llvm-19/bin/llvm-lto
              sudo mkdir -p /usr/lib/llvm-19/bin
              if [ ! -e "$target" ] || [ "$(readlink -f "$llvm_lto")" != "$(readlink -f "$target")" ]; then
                echo "Linking llvm-lto to $target"
                sudo ln -sf "$llvm_lto" "$target" || true
              else
                echo "$target already points to the same file; skipping ln"
              fi
              ls -l "$target" || true
            else
              echo "llvm-lto not found after attempted install; aborting"
              apt-cache policy llvm-19 llvm-19-tools || true
              exit 1
            fi
          fi

      - name: Build extension with PGXS
        run: |
          export PG_CONFIG=$(which pg_config)
          echo "Using PG_CONFIG=$PG_CONFIG"
          pg_config --version
          echo "Installed PostgreSQL packages:"
          dpkg -l 'postgresql-*' postgresql-common || true
          make clean
          make USE_PGXS=1 PG_CONFIG="$PG_CONFIG" CC=gcc

      - name: Stage extension install
        run: |
          export PG_CONFIG=$(which pg_config)
          make install USE_PGXS=1 PG_CONFIG="$PG_CONFIG" DESTDIR="$GITHUB_WORKSPACE/install" CC=gcc

  test:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Check out repository
        uses: actions/checkout@v5

      - name: Show Docker Compose version
        run: docker compose version

      - name: Run Docker-based pgTAP suite
        run: docker compose -f docker/docker-compose.test.yml up --build --abort-on-container-exit --exit-code-from test-runner

      - name: Dump Docker logs on failure
        if: failure()
        run: docker compose -f docker/docker-compose.test.yml logs --no-color

      - name: Tear down test stack
        if: always()
        run: docker compose -f docker/docker-compose.test.yml down -v --remove-orphans
