name: Generate requirements files with pip-compile.

on:
  workflow_dispatch:

jobs:
  generate_requirements:
    name: Generate requirements files for ${{ matrix.os }} platform.
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os:
          - ubuntu-latest
          - windows-latest
          - macos-latest
    steps:
      - name: Checkout the repository.
        uses: actions/checkout@v3

      - name: Set up Python 3.8.
        uses: actions/setup-python@v4
        with:
          python-version: '3.8'

      - name: Install dependencies
        run: |
          python -m pip install -U pip
          python -m pip install -U pip-tools

      - name: Generate requirements files.
        id: compile_requirements
        run: |
          python .github/workflows/scripts/compile_requirements.py

      - name: Upload requirements files.
        uses: actions/upload-artifact@v3
        with:
          name: ${{ steps.compile_requirements.outputs.sys_platform }}
          path: requirements/${{ steps.compile_requirements.outputs.sys_platform }}-*.txt

  merge_requirements:
    name: Merge requirements files.
    needs: generate_requirements
    runs-on: ubuntu-latest
    steps:
      - name: Checkout the repository.
        uses: actions/checkout@v3

      - name: Set up Python 3.8.
        uses: actions/setup-python@v4
        with:
          python-version: '3.8'

      - name: Install dependencies
        run: |
          python -m pip install -U "packaging>=22.0"

      - name: Download Windows requirements.
        uses: actions/download-artifact@v3
        with:
          name: win32
          path: requirements
      - name: Download Linux requirements.
        uses: actions/download-artifact@v3
        with:
          name: linux
          path: requirements
      - name: Download macOS requirements.
        uses: actions/download-artifact@v3
        with:
          name: darwin
          path: requirements

      - name: Merge requirements files.
        run: |
          python .github/workflows/scripts/merge_requirements.py

      - name: Upload merged requirements files.
        uses: actions/upload-artifact@v3
        with:
          name: merged
          path: |
            requirements/base.txt
            requirements/extra-*.txt
