name: Publish Docker image to Dockerhub

on:
  workflow_dispatch:
  push:
    branches:
      - 'master'
    tags:
      - '*.*.*'
    # don't trigger if just updating docs
    paths-ignore:
      - 'README.md'
      - '.github/**'
      - 'flatpak/**'
  # use release instead of tags once version is correctly parsed
  # https://github.com/docker/metadata-action/issues/422
  # https://github.com/docker/metadata-action/issues/240
#  release:
#    types: [ published ]

jobs:

  push_to_registry:
    name: Build and push container images
    if: github.event_name != 'pull_request'
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: Debug
        run: echo $JSON
        env:
          JSON: ${{ toJSON(github) }}

      - name: Set git state to ENV
        id: vars
        # https://dev.to/hectorleiva/github-actions-and-creating-a-short-sha-hash-8b7
        # short sha available under env.COMMIT_SHORT_SHA
        run: |
          calculatedSha=$(git rev-parse --short HEAD)
          branchName=$(git rev-parse --abbrev-ref HEAD)
          echo "COMMIT_SHORT_SHA=$calculatedSha" >> $GITHUB_ENV
          echo "COMMIT_BRANCH=$branchName" >> $GITHUB_ENV

      - name: Check App Version
        env:
          # use release instead of tags once version is correctly parsed
          #APP_VERSION: ${{ github.event.release.tag_name }}

          # https://github.com/actions/runner/issues/409#issuecomment-752775072
          # https://stackoverflow.com/a/69919067/1469797
          APP_VERSION: ${{ contains(github.ref, 'refs/tags/') && github.ref_name || format('{0}-{1}', env.COMMIT_BRANCH, env.COMMIT_SHORT_SHA ) }}
        run: |
          echo $APP_VERSION

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@v5
        with:
         # generate Docker tags based on the following events/attributes
         # https://github.com/docker/metadata-action/issues/247#issuecomment-1511259674 for NOT is default branch, eventually
         tags: |
            type=edge

            # maybe re-enable branch-named tags in the futures
            #type=ref,event=branch,enable=${{ !endsWith(github.ref, 'master') }}
            
            # tag non-prelease as latest -- has a higher priority than regular tag so it shows first in registries
            type=match,pattern=\d.\d.\d$,priority=901
            
            # tag all semver (include pre-release)
            type=semver,pattern={{version}}
        #  flavor: |
        #    latest=false

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        id: qemu
        if: ${{ !env.NO_DOCKER_BUILD }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        if: ${{ steps.qemu.outcome == 'success' }}
        continue-on-error: true

      - name: Build and push Docker image
        if: ${{ steps.qemu.outcome == 'success' }}
        env:
          # use release instead of tags once version is correctly parsed
          #APP_VERSION: ${{ github.event.release.tag_name }}

          # https://github.com/actions/runner/issues/409#issuecomment-752775072
          # https://stackoverflow.com/a/69919067/1469797
          APP_VERSION: ${{ contains(github.ref, 'refs/tags/') && github.ref_name || format('{0}-{1}', env.COMMIT_BRANCH, env.COMMIT_SHORT_SHA ) }}
        uses: docker/build-push-action@v5
        with:
          context: .
          # https://github.com/docker/build-push-action/issues/1026#issue-2041857786
          build-args: |
            APP_BUILD_VERSION=${{env.APP_VERSION}}
          push: false
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          platforms: linux/amd64,linux/arm64
