name: Coverage Report - dev

on:
  workflow_dispatch: # Trigger from UI for selected branch
  schedule:
    - cron: "0 0 * * *" # Every day at midnight UTC

permissions:
  contents: read

env:
  UV_VERSION: 0.9.17

jobs:
  unit-coverage:
    runs-on: ubuntu-latest
    steps:
      - name: Install minimal stable
        uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable
        with:
          components: llvm-tools-preview
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          # If scheduled by cron, run for dev branch, Otherwise specified branch (for workflow dispatch & push)
          ref: ${{ github.event_name == 'schedule' && 'dev' || github.ref_name }}
          fetch-depth: 0
      - name: Install Protoc
        uses: ./.github/actions/setup-protoc
      - name: Install nextest
        uses: taiki-e/install-action@3a0adc33ab45d7b9b9da91822dd2b3c0151704be # nextest
      - name: Install llvm-cov
        run: cargo install cargo-llvm-cov && sudo apt install -y lcov
      - name: Run unit tests with coverage
        run: RUN_PER_PACKAGE=true tools/unit-test-coverage.sh
      - name: Upload unit test coverage artifact
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        with:
          name: unit-test-coverage
          path: unit-test-coverage.lcov
          retention-days: 1

  integration-coverage:
    runs-on: ubuntu-latest
    steps:
      - name: Install minimal stable
        uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable
        with:
          components: llvm-tools-preview
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          # If scheduled by cron, run for dev branch, Otherwise specified branch (for workflow dispatch & push)
          ref: ${{ github.event_name == 'schedule' && 'dev' || github.ref_name }}
          fetch-depth: 0
      - name: Install Protoc
        uses: ./.github/actions/setup-protoc
      - name: Install nextest
        uses: taiki-e/install-action@3a0adc33ab45d7b9b9da91822dd2b3c0151704be # nextest
      - name: Install llvm-cov
        run: cargo install cargo-llvm-cov && sudo apt install -y lcov
      - name: Install dependencies
        run: sudo apt-get install clang
      - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
        with:
          python-version: '3.13'
      - name: Install uv and Python dependencies
        run: |
          curl -LsSf https://astral.sh/uv/$UV_VERSION/install.sh | sh
          echo "$HOME/.local/bin" >> $GITHUB_PATH
          uv --project tests lock --check
          uv --project tests sync
      - name: Run integration tests with coverage
        run: tools/integration-test-coverage.sh
      - name: Upload integration test coverage artifact
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        with:
          name: integration-test-coverage
          path: integration-test-coverage.lcov
          retention-days: 1

  merge-and-upload:
    needs: [unit-coverage, integration-coverage]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          # If scheduled by cron, run for dev branch, Otherwise specified branch (for workflow dispatch & push)
          ref: ${{ github.event_name == 'schedule' && 'dev' || github.ref_name }}
          fetch-depth: 0 # Fetch all history for all tags and branches
      - name: Install lcov
        run: sudo apt install -y lcov
      - name: Download unit test coverage
        uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
        with:
          name: unit-test-coverage
      - name: Download integration test coverage
        uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
        with:
          name: integration-test-coverage
      - name: Merge coverage reports
        run: lcov -a unit-test-coverage.lcov -a integration-test-coverage.lcov -o merged.lcov
      - name: Upload coverage data to Codecov
        uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
        with:
          files: merged.lcov
          override_branch: ${{ github.event_name == 'schedule' && 'dev' || github.ref_name }}
          token: ${{ secrets.CODECOV_TOKEN }}
          verbose: true
