name: Continuous Integration

on:
  workflow_call:
  pull_request:
  push:
    branches:
      - master

permissions:
  contents: read

jobs:
  lint:
    name: 🎨 Linters
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false
      - name: Set up Python
        uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
        with:
          python-version: '3'
      - name: Install nox
        run: python -m pip install nox
      - name: Pre-commit checks
        run: nox -s lint

  tests:
    name: ✅ Tests
    runs-on: ubuntu-22.04

    strategy:
      fail-fast: false
      matrix:
        python-version:
          - "3.7"
          - "3.8"
          - "3.9"
          - "3.10"
          - "3.11"
          - "3.12"
          - "3.13"
          - "3.14"

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
        with:
          python-version: ${{ matrix.python-version }}
          allow-prereleases: true
      - name: Install dependencies
        run: python -m pip install nox
      - name: Run tests
        run: nox -s test-${{ matrix.python-version }}
      - name: "Upload artifact"
        uses: "actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02"
        with:
          name: coverage-data-${{ matrix.python-version }}
          path: ".coverage.*"
          include-hidden-files: true
          if-no-files-found: error

  detection_coverage:

    needs:
      - tests

    name: 📈 Detection Coverage
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false
      - name: Set up Python
        uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
        with:
          python-version: '3'
      - name: Install dependencies
        run: python -m pip install nox
      - name: Coverage WITH preemptive
        run: nox -s coverage -- --coverage 97 --with-preemptive
      - name: Coverage WITHOUT preemptive
        run: nox -s coverage -- --coverage 95
      - name: "Upload artifact"
        uses: "actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02"
        with:
          name: coverage-data-using-internal-coverage
          path: ".coverage.*"
          include-hidden-files: true
          if-no-files-found: error

  integration_test:

    needs:
      - tests

    name: 🔗 Integration Tests
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        downstream_project:
          - niquests
          - requests

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false
      - name: Set up Python
        uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
        with:
          python-version: '3'
      - name: Install dependencies
        run: pip install nox
      - name: Integration Tests with Requests
        run: nox -s downstream_${{ matrix.downstream_project }}

  chardet_bc:

    name: ⏪ Chardet Backward-Compatibility Test
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false
      - name: Set up Python
        uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
        with:
          python-version: '3'
      - name: Install dependencies
        run: pip install nox
      - name: BC Coverage
        run: nox -s backward_compatibility -- --coverage 80

  mypyc_test:

    name: ⚡ MypyC Tests

    needs:
      - tests

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

    strategy:
      fail-fast: false
      matrix:
        python-version:
          - "3.8"
          - "3.9"
          - "3.10"
          - "3.11"
          - "3.12"
          - "3.13"
          - "3.14"
        os: [ ubuntu-latest, macos-latest, windows-latest ]
        include:
          - python-version: "3.7"
            os: ubuntu-22.04
          - python-version: "3.7"
            os: macos-13
          - python-version: "3.7"
            os: windows-latest
    env:
      PYTHONIOENCODING: utf8  # only needed for Windows (console IO output encoding)
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
        with:
          python-version: ${{ matrix.python-version }}
          allow-prereleases: true
      - name: Install nox
        run: pip install nox
      - name: Run tests with mypyc enabled
        run: nox -s test_mypyc-${{ matrix.python-version }}
      - name: "Upload artifact"
        uses: "actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02"
        with:
          name: coverage-data-mypyc-${{ matrix.os }}-${{ matrix.python-version }}
          path: ".coverage.*"
          include-hidden-files: true
          if-no-files-found: error

  coverage:
    if: always()
    runs-on: "ubuntu-latest"
    needs:
      - tests
      - mypyc_test
      - detection_coverage
    steps:
      - name: "Checkout repository"
        uses: "actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683"

      - name: "Setup Python"
        uses: "actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065"
        with:
          python-version: "3.x"

      - name: "Install coverage"
        run: "python -m pip install --upgrade coverage"

      - name: "Download artifact"
        uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
        with:
          pattern: coverage-data*
          merge-multiple: true

      - name: "Combine & check coverage"
        run: |
          python -m coverage combine
          python -m coverage html --skip-covered --skip-empty
          python -m coverage report --ignore-errors --show-missing --fail-under=92

      - name: "Upload report"
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
        with:
          name: coverage-report
          path: htmlcov

  performance:
    name: ⚡ Performance Test
    runs-on: ubuntu-latest

    needs: coverage

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false
      - name: Set up Python
        uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
        with:
          python-version: '3'
      - name: Install dependencies
        run: pip install nox
      - name: Performance Measurement
        run: nox -s performance
