name: CI
on:
  push:
    branches:
      - master

  # Routinely check that tests pass with new versions of dependencies.
  schedule:
    # Every day at 17:42 UTC / 9:42 Seattle (winter) / 10:42 Seattle (summer)
    - cron: "42 17 * * *"

  pull_request:

  workflow_dispatch:

jobs:
  pytest-cram:
    name: test (python=${{ matrix.python-version }} biopython=${{ matrix.biopython-version || 'latest' }})
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version:
          - '3.8'
          - '3.9'
          - '3.10'
          - '3.11'
        biopython-version:
          # list of Biopython versions with support for a new Python version
          # from https://github.com/biopython/biopython/blob/master/NEWS.rst
          - '1.80' # first to support Python 3.10 and 3.11
          - ''     # latest
    defaults:
      run:
        shell: bash -l {0}
    env:
      COVERAGE_FILE: ${{ github.workspace }}/.coverage@python=${{ matrix.python-version }},biopython=${{ matrix.biopython-version || 'latest' }}
      COVERAGE_RCFILE: ${{ github.workspace }}/.coveragerc
    steps:
    - uses: actions/checkout@v4

    - name: Set cache key
      run: echo "DATE=$(date +'%Y-%m-%d')" >> "$GITHUB_ENV"

    # While it may be tempting to install Augur using Conda to avoid hardcoding
    # the list of dependencies here, installing just the dependencies not
    # available on PyPI allows us to test against dependencies installed by pip,
    # which may have slightly different versions compared to Conda counterparts.
    - name: Install dependencies from Conda
      uses: mamba-org/setup-micromamba@v1
      with:
        create-args: mafft raxml fasttree iqtree vcftools biopython=${{ matrix.biopython-version }} python=${{ matrix.python-version }}
        condarc: |
          channels:
            - conda-forge
            - bioconda
          channel_priority: strict
        cache-environment: true
        cache-environment-key: ${{ env.DATE }}
        environment-name: augur

    # Replace the Conda Augur installation with the local version.
    - run: pip install .[dev]
    - run: conda info
    - run: conda list
    - run: pytest -c pytest.python3.ini --cov=augur
    - run: cram tests/
      env:
        AUGUR: coverage run -a ${{ github.workspace }}/bin/augur
    # Only upload coverage for one job
    - if: matrix.python-version == '3.11' && matrix.biopython-version == ''
      uses: actions/upload-artifact@v4
      with:
        name: coverage
        path: "${{ env.COVERAGE_FILE }}"

  # TODO: Use the central pathogen-repo-ci workflow¹. Currently, this is not
  # possible because it only supports "stock" docker and conda runtimes.
  # ¹ https://github.com/nextstrain/.github/blob/-/.github/workflows/pathogen-repo-ci.yaml
  pathogen-repo-ci:
    runs-on: ubuntu-latest
    continue-on-error: true
    env:
      repodata_use_zst: true
    strategy:
      matrix:
        include:
          - { pathogen: avian-flu, build-args: auspice/flu_avian_h5n1_ha.json }
          - { pathogen: ebola }
          - { pathogen: lassa }
          - { pathogen: mumps }
          - {
              pathogen: ncov,
              build-args: all_regions -j 2 --profile nextstrain_profiles/nextstrain-ci,
            }
          - { pathogen: rsv }
          - {
              pathogen: seasonal-flu,
              build-args: --configfile profiles/ci/builds.yaml -p,
            }
          - { pathogen: tb }

          # Disable some pathogens until pathogen-repo-ci supports custom build directories
          # See issue https://github.com/nextstrain/.github/issues/63
          # - { pathogen: mpox }
          # - { pathogen: zika }

    name: pathogen-repo-ci (${{ matrix.pathogen }})
    defaults:
      run:
        shell: bash -l {0}
    steps:
      - uses: actions/checkout@v4
        with:
          path: ./augur

      - name: Set cache key
        run: echo "DATE=$(date +'%Y-%m-%d')" >> "$GITHUB_ENV"

      # Set up a Conda environment that replicates Nextstrain's Conda runtime.
      - name: Install nextstrain-base from Conda
        uses: mamba-org/setup-micromamba@v1
        with:
          create-args: nextstrain-base
          condarc: |
            channels:
              - nextstrain
              - conda-forge
              - bioconda
            channel_priority: strict
          cache-environment: true
          cache-environment-key: ${{ env.DATE }}
          environment-name: augur

      # Replace the Conda Augur installation with the local version.
      - run: pip install ./augur

      - uses: actions/checkout@v4
        with:
          repository: nextstrain/${{ matrix.pathogen }}
          path: ./pathogen-repo

      - name: Copy example data
        working-directory: ./pathogen-repo
        run: |
          if [[ -d example_data ]]; then
            mkdir -p data/
            cp -r -v example_data/* data/
          else
            echo No example data to copy.
          fi

      - run: nextstrain build --ambient ./pathogen-repo ${{ matrix.build-args }}

      - if: always()
        uses: actions/upload-artifact@v4
        with:
          name: output-${{ matrix.pathogen }}
          path: |
            ./pathogen-repo/auspice/
            ./pathogen-repo/results/
            ./pathogen-repo/benchmarks/
            ./pathogen-repo/logs/
            ./pathogen-repo/.snakemake/log/

  codecov:
    if: github.repository == 'nextstrain/augur'
    needs: [pytest-cram]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
      - run: pip install coverage

      - uses: actions/download-artifact@v4
        with:
          name: coverage

      - run: coverage combine .coverage@*
      - run: coverage xml

      - uses: codecov/codecov-action@v3
        with:
          fail_ci_if_error: false

  build-docs:
    uses: nextstrain/.github/.github/workflows/docs-ci.yaml@master
    with:
      docs-directory: docs/
      pip-install-target: .[dev]
