name: Tests

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
  schedule:
    - cron:  '0 0 * * 0'

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
  cancel-in-progress: true

env:
  PYPROJ_FULL_COVERAGE: YES
  DEBIAN_FRONTEND: noninteractive

jobs:
  linting:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-python@v5
        with:
            python-version: '3.11'
      - uses: pre-commit/action@v3.0.1
      - name: Install mypy
        run: |
          python -m pip install mypy types-certifi
      - name: mypy
        run: |
          mypy pyproj

  docker_tests:
    needs: linting
    runs-on: ubuntu-latest
    name: Docker | python=${{ matrix.python-version }} | PROJ=${{ matrix.proj-version }}
    container: ghcr.io/osgeo/proj:${{ matrix.proj-version }}
    strategy:
      fail-fast: false
      matrix:
        python-version: ['3.11', '3.12', '3.13']
        proj-version: ['9.6.0']
        include:
          - python-version: '3.11'
            proj-version: '9.5.1'
          - python-version: '3.11'
            proj-version: '9.4.1'
    steps:
      - uses: actions/checkout@v5

      - name: Update
        run: |
          apt-get update
          apt-get -y install software-properties-common
          add-apt-repository -y ppa:deadsnakes/ppa
          apt-get update

      - name: Set up Python ${{ matrix.python-version }}
        run: |
          apt-get install -y --no-install-recommends \
            python${{ matrix.python-version }} \
            python${{ matrix.python-version }}-dev \
            python${{ matrix.python-version }}-venv \
            python3-pip \
            g++

      - name: Install dependencies
        run: |
          python${{ matrix.python-version }} -m venv testenv
          . testenv/bin/activate
          python -m pip install --upgrade pip
          python -m pip install -r requirements-dev.txt
          python -m pip install -e .
          python -m pip install -r requirements-test.txt

      - name: Test
        shell: bash
        run: |
          . testenv/bin/activate
          python -m pytest --cov-report term-missing --cov=pyproj --cov-report xml

      - name: Test Network
        shell: bash
        env:
          PROJ_NETWORK: ON
        run: |
          . testenv/bin/activate
          python -m pytest

      - name: Test Grids
        shell: bash
        run: |
          . testenv/bin/activate
          projsync --quiet --bbox -175,0,-50,85
          python -m pytest

  conda_tests:
    needs: linting
    name: Conda ${{ matrix.os }} | ${{ matrix.python-implementation }}=${{ matrix.python-version }} | PROJ=${{ matrix.proj-version }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: true
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        python-version: ['3.11', '3.12', '3.13']
        python-implementation: [python]
        proj-version: ['*']
        # DISABLED UNTIL CONDA-FORGE PYPY SUPPORTS PYTHON 3.11+
        # include:
          # - os: ubuntu-latest
          #   python-version: '*'
          #   python-implementation: pypy
          #   proj-version: '*'
    steps:
      - uses: actions/checkout@v5

      - name: Setup Conda
        uses: mamba-org/setup-micromamba@v2
        with:
          # https://github.com/mamba-org/setup-micromamba/issues/225
          micromamba-version: 1.5.10-0
          init-shell: bash
          environment-name: test
          create-args: >-
            ${{ matrix.python-implementation }}=${{ matrix.python-version }}
            cython
            proj=${{ matrix.proj-version }}
            numpy
            shapely
            xarray
            pandas

      - name: Install Env
        shell: bash
        run: |
          if [ "${{ matrix.python-implementation }}" = "pypy" ]; then
            sed -i.bak '/xarray/d' requirements-test.txt;
            sed -i.bak '/pandas/d' requirements-test.txt;
          fi;
          micromamba run -n test python -m pip install -e .
          micromamba run -n test python -m pip install -r requirements-test.txt

      - name: Check and Log Environment
        shell: bash
        run: |
          micromamba run -n test python -V
          micromamba run -n test pyproj -v
          micromamba info

      - name: Install pylint
        shell: bash
        if: matrix.python-implementation == 'python'
        run: |
          micromamba run -n test python -m pip install pylint

      - name: pylint
        shell: bash
        if: matrix.python-implementation == 'python'
        run: |
          micromamba run -n test python -m pylint pyproj

      - name: Test with Coverage
        shell: bash
        if: matrix.python-implementation == 'python'
        run: |
          micromamba run -n test python -m pytest --cov-report term-missing --cov=pyproj --cov-report xml

      - name: Test
        shell: bash
        if: matrix.python-implementation == 'pypy'
        env:
          PROJ_NETWORK: OFF
        run: |
          micromamba run -n test python -m pytest

      - name: Test Network
        shell: bash
        env:
          PROJ_NETWORK: ON
        run: |
          micromamba run -n test python -m pytest

      - name: Test Grids
        shell: bash
        env:
          PROJ_NETWORK: OFF
        run: |
          micromamba run -n test projsync --quiet --bbox -175,0,-50,85
          micromamba run -n test python -m pytest

      - name: Test Build docs
        shell: bash
        if: contains(matrix.os, 'ubuntu') && matrix.python-implementation == 'python'
        run: |
          micromamba run -n test python -m pip install -r requirements-docs.txt
          micromamba run -n test sphinx-build -b html docs/ docs/_build/
          micromamba run -n test sphinx-build -b man docs/ docs/_build/

      - uses: codecov/codecov-action@v5
