name: Test Python
on:
  workflow_dispatch:
  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-wheels:
    name: "Build and test Manylinux 2014 x86_64 wheels"
    runs-on: ubuntu-20.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:
          - cp38-cp38
          - cp39-cp39
          - cp310-cp310
          - cp311-cp311
          - cp312-cp312
    steps:
      - name: "Checkout"
        uses: actions/checkout@v3
        with:
          submodules: true
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable

      - name: "Generate bdk.py and binaries"
        run: bash ./scripts/generate-linux.sh

      - name: "Build wheel"
        # Specifying the plat-name argument is necessary to build a wheel with the correct name,
        # see issue #350 for more information
        run: ${PYBIN}/python setup.py bdist_wheel --plat-name manylinux_2_17_x86_64 --verbose

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

      - name: "Run tests"
        run: ${PYBIN}/python -m unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose

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

  build-macos-arm64-wheels:
    name: "Build and test macOS arm64 wheels"
    runs-on: macos-13
    defaults:
      run:
        working-directory: bdk-python
    strategy:
      matrix:
        python:
          - "3.8"
          - "3.9"
          - "3.10"
          - "3.11"
          - "3.12"
    steps:
      - name: "Checkout"
        uses: actions/checkout@v3
        with:
          submodules: true

      - name: "Install Python"
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python }}

      - name: "Generate bdk.py and binaries"
        run: bash ./scripts/generate-macos-arm64.sh

      - name: "Build wheel"
        # Specifying the plat-name argument is necessary to build a wheel with the correct name,
        # see issue #350 for more information
        run: python3 setup.py bdist_wheel --plat-name macosx_11_0_arm64 --verbose

      # You can't install the arm64 wheel on the CI, so we skip these steps and simply test that the wheel builds
      # - name: "Install wheel and run tests"
      #   run: |
      #     pip3 install ./dist/*.whl
      #     python3 -m unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose

      - name: "Upload artifact test"
        uses: actions/upload-artifact@v3
        with:
          name: bdkpython-macos-arm64-${{ matrix.python }}
          path: /Users/runner/work/bdk-ffi/bdk-ffi/bdk-python/dist/*.whl

  build-macos-x86_64-wheels:
    name: "Build and test macOS x86_64 wheels"
    runs-on: macos-13
    defaults:
      run:
        working-directory: bdk-python
    strategy:
      matrix:
        python:
          - "3.8"
          - "3.9"
          - "3.10"
          - "3.11"
          - "3.12"
    steps:
      - name: "Checkout"
        uses: actions/checkout@v3
        with:
          submodules: true
      - uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python }}

      - name: "Generate bdk.py and binaries"
        run: bash ./scripts/generate-macos-x86_64.sh

      - name: "Build wheel"
        # Specifying the plat-name argument is necessary to build a wheel with the correct name,
        # see issue #350 for more information
        run: python3 setup.py bdist_wheel --plat-name macosx_11_0_x86_64 --verbose

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

      - name: "Run tests"
        run: python3 -m unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose

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

  build-windows-wheels:
    name: "Build and test Windows wheels"
    runs-on: windows-2022
    defaults:
      run:
        working-directory: bdk-python
    strategy:
      matrix:
        python:
          - "3.8"
          - "3.9"
          - "3.10"
          - "3.11"
          - "3.12"
    steps:
      - name: "Checkout"
        uses: actions/checkout@v3
        with:
          submodules: true

      - name: "Install Python"
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python }}

      - name: "Generate bdk.py and binaries"
        run: bash ./scripts/generate-windows.sh

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

      - name: "Upload artifact test"
        uses: actions/upload-artifact@v3
        with:
          name: bdkpython-windows-${{ matrix.python }}
          path: D:\a\bdk-ffi\bdk-ffi\bdk-python\dist\*.whl

      - name: "Install dependencies"
        run: Get-ChildItem 'D:\a\bdk-ffi\bdk-ffi\bdk-python\dist\*.whl' | ForEach-Object {pip install $_.FullName}
        shell: powershell

      - name: "Run tests"
        run: python -m unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose
