name: Sync E2E Tests

on:
  pull_request:
    branches: ["main"]
    paths:
      - "donut-sync/**"
      - "src-tauri/src/sync/**"
      - "scripts/sync-test-harness.mjs"
      - ".github/workflows/sync-e2e.yml"
  push:
    branches: ["main"]
    paths:
      - "donut-sync/**"
      - "src-tauri/src/sync/**"
      - "scripts/sync-test-harness.mjs"
  workflow_call:
  workflow_dispatch:

permissions:
  contents: read

jobs:
  rust-sync-e2e:
    name: Rust Sync E2E Tests
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-22.04]

    runs-on: ${{ matrix.os }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v7.0.0

      - name: Install pnpm
        uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 #v6.0.9
        with:
          run_install: false

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: "22"
          cache: "pnpm"

      - name: Install Rust
        uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 #master
        with:
          toolchain: stable

      - name: Cache Rust dependencies
        uses: swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 #v2.9.1
        with:
          workspaces: "src-tauri"

      - name: Install Tauri dependencies (Ubuntu only)
        if: matrix.os == 'ubuntu-22.04'
        run: |
          sudo apt-get update
          sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libxdo-dev

      - name: Install dependencies
        run: pnpm install --frozen-lockfile

      - name: Run Rust sync e2e tests with harness
        run: node scripts/sync-test-harness.mjs

  donut-sync-e2e:
    name: donut-sync Node.js E2E Tests
    runs-on: ubuntu-22.04

    steps:
      - name: Checkout repository
        uses: actions/checkout@v7.0.0

      - name: Start MinIO
        run: |
          docker run -d --name minio \
            -p 8987:9000 \
            -e MINIO_ROOT_USER=minioadmin \
            -e MINIO_ROOT_PASSWORD=minioadmin \
            minio/minio:latest server /data

          # Wait for MinIO to be ready
          for i in {1..30}; do
            if curl -sf http://127.0.0.1:8987/minio/health/live; then
              echo "MinIO is ready"
              break
            fi
            echo "Waiting for MinIO... ($i/30)"
            sleep 2
          done

      - name: Install pnpm
        uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 #v6.0.9
        with:
          run_install: false

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: "22"
          cache: "pnpm"

      - name: Install dependencies
        run: pnpm install --frozen-lockfile

      - name: Run donut-sync Node.js e2e tests
        working-directory: donut-sync
        env:
          SYNC_TOKEN: test-sync-token
          S3_ENDPOINT: http://127.0.0.1:8987
          S3_ACCESS_KEY_ID: minioadmin
          S3_SECRET_ACCESS_KEY: minioadmin
          S3_BUCKET: donut-sync-test
          S3_FORCE_PATH_STYLE: "true"
        run: pnpm test:e2e
