name: Publish Release

on:
  workflow_dispatch:
  push:
    tags:
      - v**

jobs:
  pypi:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: set up Python
        uses: actions/setup-python@v2
        with:
          python-version: "3.x"
      - name: set up Poetry
        uses: abatilo/actions-poetry@v2.0.0
        with:
          poetry-version: "1.3.1"
      - name: get version
        id: get_version
        run: echo "VERSION=$(echo ${GITHUB_REF/refs\/tags\//})" >> $GITHUB_ENV
      - name: set version
        run: poetry version ${{ env.VERSION }}
      - name: publish
        env:
          POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_API_TOKEN }}
        run: poetry publish --build
      - name: Create GitHub release entry
        uses: actions/create-release@v1
        id: create_release
        with:
          draft: false
          prerelease: false
          release_name: ${{ env.VERSION }}
          tag_name: ${{ env.VERSION }}
        env:
          GITHUB_TOKEN: ${{ github.token }}
      - name: verify
        shell: bash
        run: for i in {1..100}; do python -m pip install 'nicegui==${{ env.VERSION }}' && break || sleep 2; done

  docker:
    needs: pypi
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Prepare
        id: prep
        run: |
          DOCKER_IMAGE=${{ secrets.DOCKER_USERNAME }}/${GITHUB_REPOSITORY#*/}
          VERSION=latest
          SHORTREF=${GITHUB_SHA::8}

          # If this is git tag, use the tag name as a docker tag
          if [[ $GITHUB_REF == refs/tags/* ]]; then
            VERSION=${GITHUB_REF#refs/tags/v}
          fi
          TAGS="${DOCKER_IMAGE}:${VERSION},${DOCKER_IMAGE}:${SHORTREF}"

          # If the VERSION looks like a version number, assume that
          # this is the most recent version of the image and also
          # tag it 'latest'.
          if [[ $VERSION =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
            TAGS="$TAGS,${DOCKER_IMAGE}:latest"
          fi

          # Set output parameters.
          echo ::set-output name=tags::${TAGS}
          echo ::set-output name=docker_image::${DOCKER_IMAGE}
          echo ::set-output name=version::${VERSION}
      - name: Set up QEMU
        uses: docker/setup-qemu-action@master
        with:
          platforms: all
      - name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@master
        with:
          install: true
      - name: Build
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./release.dockerfile
          platforms: linux/amd64,linux/arm64
          push: true
          tags: ${{ steps.prep.outputs.tags }}
          build-args: VERSION=${{ steps.prep.outputs.version }}

      # Uploading the README.md is not a core feature of docker/build-push-action yet
      - name: Update README
        uses: christian-korneck/update-container-description-action@v1
        env:
          DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
          DOCKER_PASS: ${{ secrets.DOCKER_PASSWORD }}
        with:
          destination_container_repo: zauberzeug/nicegui
          provider: dockerhub
          short_description: "Web Based User Interface für Python with Buttons, Dialogs, Markdown, 3D Scences and Plots"
