name: Main

on:
  push:
    branches:
      - main
  pull_request:
    types: [opened, synchronize, reopened, ready_for_review]

jobs:
  # todo needs check-ts and test-ts too!
  checks:
    runs-on: ubuntu-latest
    steps:
      - name: Check out
        uses: actions/checkout@v4

      - uses: actions/cache@v3
        with:
          path: ~/.cache/pre-commit
          key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}

      - uses: actions/setup-node@v4
        with:
          node-version: 22

      - name: Install Claude Code CLI
        run: npm install -g @anthropic-ai/claude-code

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true
          cache-dependency-glob: "uv.lock"

      - name: "Set up Python"
        uses: actions/setup-python@v5
        with:
          python-version-file: "pyproject.toml"

      - name: Install the project
        run: uv sync --all-extras --dev

      - name: Install bun
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Install ts deps
        run: npm -C humanlayer-ts install && npm -C hlyr install && npm -C humanlayer-ts-vercel-ai-sdk install

      - name: Build hld SDK
        run: cd hld/sdk/typescript && bun install && bun run build

      - name: Install wui deps
        run: bun install --cwd=humanlayer-wui

      - uses: actions/setup-go@v5
        with:
          go-version: stable

      # TODO: Update this, let's just pull the binary?
      - name: Install golangci-lint
        run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

      - name: Install mockgen
        run: go install go.uber.org/mock/mockgen@latest

      - name: Install Rust
        uses: dtolnay/rust-toolchain@1.83.0
        with:
          components: rustfmt,clippy

      - name: Cache and install Tauri system dependencies
        if: runner.os == 'Linux'
        uses: awalsh128/cache-apt-pkgs-action@latest
        with:
          packages: libwebkit2gtk-4.1-dev build-essential curl wget file libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev
          version: 1.0

      - name: Build CLI
        run: npm -C hlyr run build

      - name: Generate Go mocks
        run: make -C hld mocks

      - name: Run checks
        run: make check

  tests:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.11"]
      fail-fast: false
    steps:
      - name: Check out
        uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: "npm"
          cache-dependency-path: humanlayer-ts/package-lock.json

      - name: Install Claude Code CLI
        run: npm install -g @anthropic-ai/claude-code

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true
          cache-dependency-glob: "uv.lock"

      - name: Set up Python ${{ matrix.python-version }}
        run: uv python install ${{ matrix.python-version }}

      - name: Install ts deps
        run: npm -C humanlayer-ts install && npm -C hlyr install && npm -C humanlayer-ts-vercel-ai-sdk install

      - uses: actions/setup-go@v5
        with:
          go-version: stable

      - name: Install mockgen
        run: go install go.uber.org/mock/mockgen@latest

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Cache and install Tauri system dependencies
        if: runner.os == 'Linux'
        uses: awalsh128/cache-apt-pkgs-action@latest
        with:
          packages: libwebkit2gtk-4.1-dev build-essential curl wget file libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev
          version: 1.0

      - name: Build CLI
        run: npm -C hlyr run build

      - name: Generate Go mocks
        run: make -C hld mocks

      - name: Install bun
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Build hld SDK
        run: cd hld/sdk/typescript && bun install && bun run build

      - name: Install wui deps
        run: bun install --cwd=humanlayer-wui

      - name: Test
        run: make test

      - name: Upload Test Results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: pytest-results-${{ matrix.python-version }}
          path: |
            junit.xml
            coverage.xml

  # for now leaving these commented out as they weren't passing (tsup or something was a related bug, want this merged more than I want in CI (Do we even want it
          # in CI anyway?
  # e2e-test:
  #   runs-on: ubuntu-latest
  #   steps:
  #     - name: Check out
  #       uses: actions/checkout@v4
  #
  #     - name: Set up Go
  #       uses: actions/setup-go@v5
  #       with:
  #         go-version: '1.21'
  #
  #     - name: Install Bun
  #       uses: oven-sh/setup-bun@v2
  #       with:
  #         bun-version: latest
  #
  #     - name: Install Node.js
  #       uses: actions/setup-node@v4
  #       with:
  #         node-version: 22
  #
  #     - name: Build binaries
  #       run: |
  #         make -C hld build
  #         make -C hlyr build
  #
  #     - name: Build TypeScript SDK
  #       run: |
  #         cd hld/sdk/typescript
  #         bun install
  #         bun run build
  #
  #     - name: Run E2E tests
  #       env:
  #         CI: true
  #         HUMANLAYER_TEST_TIMEOUT_MULTIPLIER: 2
  #       run: make -C hld e2e-test
  #
  #     - name: Upload test artifacts on failure
  #       if: failure()
  #       uses: actions/upload-artifact@v4
  #       with:
  #         name: e2e-test-artifacts-${{ github.run_id }}
  #         path: /tmp/hld-e2e-*/
