name: Publish Docker Images

on:
  workflow_dispatch:
    inputs:
      zrok-version:
        description: zrok release tag to publish as a Docker image
        type: string
        required: true
  release:
    types:
      - released  # excludes "prereleased" which is included in "published" to
                  # avoid prematurely releasing semver tagged container images

jobs:
  publish-docker-images:
    runs-on: ubuntu-latest
    env:
      RELEASE_REF: ${{ inputs.zrok-version || github.ref }}
    steps:
      # compose the semver string without leading "refs/tags" or "v" so we can predict the
      # release artifact filename
      - name: Set zrok Version Semver from Tag Ref
        id: semver
        run: |
          zrok_semver=${RELEASE_REF#refs/tags/}
          echo "zrok_semver=${zrok_semver#v}" >> $GITHUB_OUTPUT

      - name: Checkout Workspace
        uses: actions/checkout@v3

      - name: Create the Release Arch Dirs
        run: |
          for TGZ in dist/{amd,arm}64/linux/; do
            mkdir -pv ${TGZ}
          done

      - name: Download Linux AMD64 Release Artifact
        uses: dsaltares/fetch-gh-release-asset@master
        with:
          version: tags/v${{ steps.semver.outputs.zrok_semver }}
          file: zrok_${{ steps.semver.outputs.zrok_semver }}_linux_amd64.tar.gz
          target: dist/amd64/linux/zrok_${{ steps.semver.outputs.zrok_semver }}_linux_amd64.tar.gz

      - name: Download Linux ARM64 Release Artifact
        uses: dsaltares/fetch-gh-release-asset@master
        with:
          version: tags/v${{ steps.semver.outputs.zrok_semver }}
          file: zrok_${{ steps.semver.outputs.zrok_semver }}_linux_arm64.tar.gz
          target: dist/arm64/linux/zrok_${{ steps.semver.outputs.zrok_semver }}_linux_arm64.tar.gz

      - name: Unpack the Release Artifacts
        run: |
          for TGZ in dist/{amd,arm}64/linux; do
            tar -xvzf ${TGZ}/zrok_*.tar.gz -C ${TGZ}
          done

      - name: Set Up QEMU
        uses: docker/setup-qemu-action@v2
        with:
          platforms: amd64,arm64

      - name: Set Up Docker BuildKit
        id: buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_HUB_API_USER }}
          password: ${{ secrets.DOCKER_HUB_API_TOKEN }}

      - name: Set Up Container Image Tags for zrok CLI Container
        env:
          RELEASE_REPO: openziti/zrok
          ZROK_VERSION: ${{ steps.semver.outputs.zrok_semver }}
        id: tagprep_cli
        run: |
          DOCKER_TAGS=""
          DOCKER_TAGS="${RELEASE_REPO}:${ZROK_VERSION},${RELEASE_REPO}:latest"
          echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}"
          echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT

      # this is the CLI image with the Linux binary for each
      # arch that was downloaded in ./dist/
      - name: Build & Push Multi-Platform CLI Container Image to Hub
        uses: docker/build-push-action@v3
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: ${{ github.workspace }}/
          file: ${{ github.workspace }}/docker/images/zrok/Dockerfile
          platforms: linux/amd64,linux/arm64
          tags: ${{ steps.tagprep_cli.outputs.DOCKER_TAGS }}
          build-args: |
            DOCKER_BUILD_DIR=./docker/images/zrok
            ARTIFACTS_DIR=./dist
          push: true

      # - name: Set Up Container Image Tags for zrok Controller Container
      #   env:
      #     RELEASE_REPO: openziti/zrok-controller
      #     ZROK_VERSION: ${{ steps.semver.outputs.zrok_semver }}
      #   id: tagprep_ctrl
      #   run: |
      #     DOCKER_TAGS=""
      #     DOCKER_TAGS="${RELEASE_REPO}:${ZROK_VERSION},${RELEASE_REPO}:latest"
      #     echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}"
      #     echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT

      # # This is a use-case image based on the minimal CLI image. It needs the
      # # ZROK_VERSION env var so it can build from the versioned image that
      # # we pushed in the prior step.
      # - name: Build & Push Multi-Platform Controller Container Image to Hub
      #   uses: docker/build-push-action@v3
      #   with:
      #     builder: ${{ steps.buildx.outputs.name }}
      #     context: ${{ github.workspace }}/docker/images/zrok-controller/
      #     platforms: linux/amd64,linux/arm64
      #     tags: ${{ steps.tagprep_ctrl.outputs.DOCKER_TAGS }}
      #     build-args: |
      #       ZROK_VERSION=${{ env.ZROK_VERSION }}
      #     push: true

      # - name: Set Up Container Image Tags for zrok Frontend Container
      #   env:
      #     RELEASE_REPO: openziti/zrok-frontend
      #     ZROK_VERSION: ${{ steps.semver.outputs.zrok_semver }}
      #   id: tagprep_frontend
      #   run: |
      #     DOCKER_TAGS=""
      #     DOCKER_TAGS="${RELEASE_REPO}:${ZROK_VERSION},${RELEASE_REPO}:latest"
      #     echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}"
      #     echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT

      # - name: Build & Push Multi-Platform Frontend Container Image to Hub
      #   uses: docker/build-push-action@v3
      #   with:
      #     builder: ${{ steps.buildx.outputs.name }}
      #     context: ${{ github.workspace }}/docker/images/zrok-frontend/
      #     platforms: linux/amd64,linux/arm64
      #     tags: ${{ steps.tagprep_frontend.outputs.DOCKER_TAGS }}
      #     build-args: |
      #       ZROK_VERSION=${{ env.ZROK_VERSION }}
      #     push: true

      # - name: Set Up Container Image Tags for zrok Share Container
      #   env:
      #     RELEASE_REPO: openziti/zrok-share
      #     ZROK_VERSION: ${{ steps.semver.outputs.zrok_semver }}
      #   id: tagprep_share
      #   run: |
      #     DOCKER_TAGS=""
      #     DOCKER_TAGS="${RELEASE_REPO}:${ZROK_VERSION},${RELEASE_REPO}:latest"
      #     echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}"
      #     echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT

      # - name: Build & Push Multi-Platform zrok Share Container Image to Hub
      #   uses: docker/build-push-action@v3
      #   with:
      #     builder: ${{ steps.buildx.outputs.name }}
      #     context: ${{ github.workspace }}/docker/images/zrok-share/
      #     platforms: linux/amd64,linux/arm64
      #     tags: ${{ steps.tagprep_share.outputs.DOCKER_TAGS }}
      #     build-args: |
      #       ZROK_VERSION=${{ env.ZROK_VERSION }}
      #     push: true

      # - name: Set Up Container Image Tags for zrok Access Container
      #   env:
      #     RELEASE_REPO: openziti/zrok-access
      #     ZROK_VERSION: ${{ steps.semver.outputs.zrok_semver }}
      #   id: tagprep_access
      #   run: |
      #     DOCKER_TAGS=""
      #     DOCKER_TAGS="${RELEASE_REPO}:${ZROK_VERSION},${RELEASE_REPO}:latest"
      #     echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}"
      #     echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT

      # - name: Build & Push Multi-Platform zrok Access Container Image to Hub
      #   uses: docker/build-push-action@v3
      #   with:
      #     builder: ${{ steps.buildx.outputs.name }}
      #     context: ${{ github.workspace }}/docker/images/zrok-access/
      #     platforms: linux/amd64,linux/arm64
      #     tags: ${{ steps.tagprep_access.outputs.DOCKER_TAGS }}
      #     build-args: |
      #       ZROK_VERSION=${{ env.ZROK_VERSION }}
      #     push: true
