name: Tests And Linting

on:
  pull_request:
  push:
    branches:
      - main

concurrency:
  group: test-${{ github.head_ref }}
  cancel-in-progress: true


jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Install uv
        uses: astral-sh/setup-uv@v7

      - name: Set up Python
        run: uv python install 3.12

      - name: Create virtual environment
        run: uv sync --all-extras --dev

      - name: Install Pre-Commit hooks
        run: uv run pre-commit install

      - name: Load cached Pre-Commit Dependencies
        id: cached-pre-commit-dependencies
        uses: actions/cache@v4
        with:
          path: ~/.cache/pre-commit/
          key: pre-commit|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }}

      - name: Execute Pre-Commit
        run: uv run pre-commit run --show-diff-on-failure --color=always --all-files
  mypy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Install uv
        uses: astral-sh/setup-uv@v7

      - name: Set up Python
        run: uv python install 3.13

      - name: Install dependencies
        run: uv sync --all-extras --dev

      - name: Run mypy
        run: uv run mypy

  pyright:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Install uv
        uses: astral-sh/setup-uv@v7

      - name: Set up Python
        run: uv python install 3.13

      - name: Install dependencies
        run: uv sync --all-extras --dev

      - name: Run pyright
        run: uv run pyright

  # # TODO(cofin)
  # # AttributeError: 'SuiteRequirements' object has no attribute 'computed_reflects_normally'
  slotscheck:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Install uv
        uses: astral-sh/setup-uv@v7

      - name: Set up Python
        run: uv python install 3.13

      - name: Install dependencies
        run: uv sync --all-extras --dev

      - name: Run slotscheck
        run: uv run slotscheck -m advanced_alchemy.config  -m advanced_alchemy.repository -m advanced_alchemy.service -m advanced_alchemy.extensions -m advanced_alchemy.base -m advanced_alchemy.types -m advanced_alchemy.operations

  test:
    name: "test (${{ matrix.python-version }}"
    strategy:
      fail-fast: true
      matrix:
        python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
    uses: ./.github/workflows/test.yml
    with:
      coverage: ${{ matrix.python-version == '3.13' }}
      python-version: ${{ matrix.python-version }}
  sonar:
    needs:
      - test
      - validate
    if: github.event.pull_request.head.repo.fork == false && github.repository_owner == 'litestar-org'
    runs-on: ubuntu-latest
    steps:
      - name: Check out repository
        uses: actions/checkout@v6
        with:
          fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
      - name: Download Artifacts
        uses: actions/download-artifact@v6
        with:
          name: coverage-xml

      - name: SonarCloud Scan
        uses: SonarSource/sonarqube-scan-action@v6
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

  codecov:
    needs:
      - test
      - validate
    runs-on: ubuntu-latest
    permissions:
      security-events: write
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-python@v6
        with:
          python-version: "3.13"

      - name: Download Artifacts
        uses: actions/download-artifact@v6
        with:
          name: coverage-xml
          path: coverage.xml
          merge-multiple: true

      # - name: Combine coverage files
      #   run: |
      #     python -Im pip install coverage covdefaults
      #     python -Im coverage combine
      #     python -Im coverage xml -i

      # - name: Fix coverage file name
      #   run: sed -i "s/home\/runner\/work\/advanced-alchemy\/advanced-alchemy/github\/workspace/g" coverage.xml

      - name: Upload coverage reports to Codecov
        uses: codecov/codecov-action@v5
        with:
          files: coverage.xml
          token: ${{ secrets.CODECOV_TOKEN }}
          slug: litestar-org/advanced-alchemy

  build-docs:
    needs:
      - validate
    if: github.event_name == 'pull_request'
    runs-on: ubuntu-latest
    steps:
      - name: Check out repository
        uses: actions/checkout@v6

      - name: Install Microsoft ODBC
        run: sudo ACCEPT_EULA=Y apt-get install msodbcsql18 -y

      - name: Install uv
        uses: astral-sh/setup-uv@v7

      - name: Set up Python
        run: uv python install 3.13

      - name: Install dependencies
        run: uv sync --all-extras --dev

      - name: Build docs
        run: uv run make docs

      - name: Check docs links
        env:
          LITESTAR_DOCS_IGNORE_MISSING_EXAMPLE_OUTPUT: 1
        run: uv run make docs-linkcheck

      - name: Save PR number
        run: |
          echo "${{ github.event.number }}" > .pr_number

      - name: Upload artifact
        uses: actions/upload-artifact@v5
        with:
          name: docs-preview
          path: |
            docs/_build/html
            .pr_number
          include-hidden-files: true
