name: Build N-API Native Addons

on:
  push:
    branches: [main, napi, develop]
    paths:
      - 'packages/agentic-jujutsu/**'
      - '.github/workflows/build-native.yml'
  pull_request:
    branches: [main, develop]

env:
  CARGO_TERM_COLOR: always
  RUST_BACKTRACE: 1

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        settings:
          # macOS builds
          - host: macos-latest
            target: x86_64-apple-darwin
            build: |
              rustup target add x86_64-apple-darwin
              cargo build --release --target x86_64-apple-darwin
          - host: macos-latest
            target: aarch64-apple-darwin
            build: |
              rustup target add aarch64-apple-darwin
              cargo build --release --target aarch64-apple-darwin

          # Linux builds
          - host: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            build: |
              cargo build --release --target x86_64-unknown-linux-gnu
          - host: ubuntu-latest
            target: aarch64-unknown-linux-gnu
            build: |
              sudo apt-get update
              sudo apt-get install -y gcc-aarch64-linux-gnu
              rustup target add aarch64-unknown-linux-gnu
              cargo build --release --target aarch64-unknown-linux-gnu

          # Windows builds
          - host: windows-latest
            target: x86_64-pc-windows-msvc
            build: |
              cargo build --release --target x86_64-pc-windows-msvc
          - host: windows-latest
            target: i686-pc-windows-msvc
            build: |
              rustup target add i686-pc-windows-msvc
              cargo build --release --target i686-pc-windows-msvc

    name: Build ${{ matrix.settings.target }}
    runs-on: ${{ matrix.settings.host }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Setup Rust toolchain
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: stable
          targets: ${{ matrix.settings.target }}

      - name: Cache cargo registry
        uses: actions/cache@v3
        with:
          path: ~/.cargo/registry
          key: ${{ runner.os }}-${{ matrix.settings.target }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}

      - name: Cache cargo index
        uses: actions/cache@v3
        with:
          path: ~/.cargo/git
          key: ${{ runner.os }}-${{ matrix.settings.target }}-cargo-git-${{ hashFiles('**/Cargo.lock') }}

      - name: Cache target directory
        uses: actions/cache@v3
        with:
          path: packages/agentic-jujutsu/target
          key: ${{ runner.os }}-${{ matrix.settings.target }}-cargo-build-${{ hashFiles('**/Cargo.lock') }}

      - name: Install dependencies
        working-directory: packages/agentic-jujutsu
        run: npm ci

      - name: Build native addon
        working-directory: packages/agentic-jujutsu
        run: ${{ matrix.settings.build }}

      - name: List build artifacts
        working-directory: packages/agentic-jujutsu
        shell: bash
        run: |
          echo "=== Build artifacts ==="
          ls -lh target/${{ matrix.settings.target }}/release/ || true
          find target/${{ matrix.settings.target }}/release -name "*.node" -o -name "*.so" -o -name "*.dylib" -o -name "*.dll" || true

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: bindings-${{ matrix.settings.target }}
          path: |
            packages/agentic-jujutsu/target/${{ matrix.settings.target }}/release/*.node
            packages/agentic-jujutsu/target/${{ matrix.settings.target }}/release/*.so
            packages/agentic-jujutsu/target/${{ matrix.settings.target }}/release/*.dylib
            packages/agentic-jujutsu/target/${{ matrix.settings.target }}/release/*.dll
          if-no-files-found: warn

  test-bindings:
    needs: build
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          path: packages/agentic-jujutsu/artifacts

      - name: Install dependencies
        working-directory: packages/agentic-jujutsu
        run: npm ci

      - name: Run tests
        working-directory: packages/agentic-jujutsu
        run: npm test
        continue-on-error: true

  verify-build:
    needs: build
    runs-on: ubuntu-latest

    steps:
      - name: Download all artifacts
        uses: actions/download-artifact@v4
        with:
          path: artifacts

      - name: Verify all platforms built
        run: |
          echo "=== Verifying build artifacts ==="
          ls -R artifacts/

          # Count platform builds
          PLATFORM_COUNT=$(ls -1 artifacts/ | wc -l)
          echo "Built for $PLATFORM_COUNT platforms"

          if [ $PLATFORM_COUNT -lt 5 ]; then
            echo "WARNING: Expected at least 5 platform builds, got $PLATFORM_COUNT"
          else
            echo "SUCCESS: All platforms built successfully"
          fi
