---
name: Python client checks, package build and deployment

on:
  workflow_dispatch:
  push:
    tags:
      - 'client-*'
    branches:
      - develop
      - master
    paths:
      - client/**
      - .github/workflows/python-client.yml
  pull_request:
    paths:
      - client/**
      - .github/workflows/python-client.yml

jobs:
  lint:
    name: Linting
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v4
      - run: pip install flake8 flake8-pyproject
      - name: Flake8 lint Python code
        run: (cd client && flake8 src/)

  mypy:
    name: Type checking
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v4
      - run: pip install mypy
      - name: Mypy type checking
        run: (cd client && mypy src/)

  package_and_deploy:
    name: Build and deploy Ethereum Client Python package
    runs-on: ubuntu-latest
    needs: [lint, mypy]
    steps:

      - name: Clone
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Build Python package
        run: |
          pip install --upgrade pip build twine
          cd client/
          python -m build;
          python -m twine check dist/*
          pip install .;
          echo "TAG_VERSION=$(python -c 'from ledger_app_clients.ethereum import __version__; print(__version__)')" >> "$GITHUB_ENV"

      - name: Check version against CHANGELOG
        if: startsWith(github.ref, 'refs/tags/')
        run: |
          CHANGELOG_VERSION=$(grep -Po '(?<=## \[)(\d+\.)+[^\]]' client/CHANGELOG.md | head -n 1)
          if [ "${{ env.TAG_VERSION }}" == "${CHANGELOG_VERSION}" ];
          then
              echo 'Package and CHANGELOG versions match!';
              exit 0;
          else
              echo "Tag '${{ env.TAG_VERSION }}' and CHANGELOG '${CHANGELOG_VERSION}' versions mismatch!";
              exit 1;
          fi

      - name: Publish Python package on pypi.org
        if: success() && github.event_name == 'push'
        run: (cd client && python -m twine upload --verbose dist/*)
        env:
          TWINE_USERNAME: __token__
          TWINE_PASSWORD: ${{ secrets.PYPI_PUBLIC_API_TOKEN  }}
          TWINE_NON_INTERACTIVE: 1
