name: Test Python
on:
  push:
    paths:
      - "bdk-ffi/**"
      - "bdk-python/**"
  pull_request:
    paths:
      - "bdk-ffi/**"
      - "bdk-python/**"

# We use manylinux2014 because older CentOS versions used by 2010 and 1 have a very old glibc version, which
# makes it very hard to use GitHub's javascript actions (checkout, upload-artifact, etc).
# They mount their own nodejs interpreter inside your container, but since that's not statically linked it
# tries to load glibc and fails because it requires a more recent version.

jobs:
  build-manylinux2014-x86_64-wheel:
    name: "Build and test Manylinux 2014 x86_64 wheels"
    runs-on: ubuntu-22.04
    defaults:
      run:
        working-directory: bdk-python
    container:
      image: quay.io/pypa/manylinux2014_x86_64
      env:
        PLAT: manylinux2014_x86_64
        PYBIN: "/opt/python/${{ matrix.python }}/bin"
    strategy:
      matrix:
        python:
          # - cp36-cp36m
          # - cp37-cp37m
          # - cp38-cp38
          # - cp39-cp39
          - cp310-cp310
    steps:
      - name: "Checkout"
        uses: actions/checkout@v2
        with:
          submodules: true
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable

      - name: "Install requirements"
        run: ${PYBIN}/pip install -r requirements.txt

      - name: "Generate bdk.py"
        run: bash generate.sh

      - name: "Build wheel"
        run: ${PYBIN}/python setup.py bdist_wheel --verbose

      - name: "Install wheel"
        run: ${PYBIN}/pip install ./dist/*.whl

      - name: "Run tests"
        run: ${PYBIN}/python -m unittest tests/test_bdk.py --verbose

      - name: "Upload artifact test"
        uses: actions/upload-artifact@v2
        with:
          name: bdkpython-manylinux2014-x86_64-${{ matrix.python }}
          path: /home/runner/work/bdk-ffi/bdk-ffi/bdk-python/dist/*.whl

  build-macos-universal-wheel:
    name: "Build and test macOS wheels"
    runs-on: macos-12
    defaults:
      run:
        working-directory: bdk-python
    strategy:
      matrix:
        python:
          # - '3.7'
          # - '3.8'
          # - '3.9'
          - '3.10'
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          submodules: true
      - uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python }}

      - name: "Generate bdk.py"
        run: | 
          python3 --version
          rustup target add aarch64-apple-darwin
          pip3 install --user -r requirements.txt
          bash generate.sh

      - name: "Build wheel"
        env:
          ARCHFLAGS: "-arch x86_64 -arch arm64"
        run: python3 setup.py bdist_wheel --verbose

      - name: "Install wheel"
        run: pip3 install ./dist/*.whl

      - name: "Run tests"
        run: python3 -m unittest tests/test_bdk.py --verbose

  build-windows-wheel:
    name: "Build and test Windows wheels"
    runs-on: windows-2022
    defaults:
      run:
        working-directory: bdk-python
    strategy:
      matrix:
        python:
          # - '3.7'
          # - '3.8'
          # - '3.9'
          - '3.10'
    steps:
      - name: "Checkout"
        uses: actions/checkout@v2
        with:
          submodules: true
      - uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python }}

      - name: "Generate bdk.py"
        run: |
          python --version
          pip install --user -r requirements.txt
          bash generate.sh

      - name: "Build wheel"
        run: python setup.py bdist_wheel --verbose

      # TODO: On Windows the pip install ./dist/*.whl step fails with the following error:
      # Run pip install ./dist/*.whl
      # WARNING: Requirement './dist/*.whl' looks like a filename, but the file does not exist
      # ERROR: *.whl is not a valid wheel filename.*.whl is not a valid wheel name
      # So we skip the installing and the tests and simply test that the wheel builds

      # - name: Install wheel
      #   run: pip install ./dist/*.whl
      # - name: Run tests
      #   run: python -m unittest tests/test_bdk.py --verbose
