name: Publish Docker Image

on:
  workflow_call:
    secrets:
      ACTIONS_TOKEN:
        required: true
      GHCR_TOKEN:
        required: true
    inputs:
      release:
        required: true
        type: string
      registry:
        required: true
        type: string
      actions_username:
        required: true
        type: string
      ghcr_username:
        required: true
        type: string

jobs:
  publish:
    name: Publish Docker Images
    runs-on: ubuntu-latest
    steps:
      - name: Update Docker configuration
        continue-on-error: true
        run: |
          mkdir -p /etc/default
          mkdir -p /etc/docker
          touch -a /etc/default/docker
          touch -a /etc/docker/daemon.json
          echo "DOCKER_OPTS=\"--insecure-registry ${{ inputs.registry }}\"" >> /etc/default/docker
          echo "{\"insecure-registries\": [\"${{ inputs.registry }}\"]}" > /etc/docker/daemon.json

      - name: Get repo name
        id: split
        run: echo "repo=${REPO##*/}" >> "$GITEA_OUTPUT"
        env:
          REPO: ${{ gitea.repository }}

      - name: Check out repository
        uses: actions/checkout@v4.2.2
        with:
          fetch-depth: 0
          ref: ${{ inputs.release }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Log in to Gitea Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ inputs.registry }}
          username: ${{ inputs.actions_username }}
          password: ${{ secrets.ACTIONS_TOKEN }}

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ inputs.ghcr_username }}
          password: ${{ secrets.GHCR_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@v5
        with:
          tags: type=semver,pattern=v{{version}},value=${{ inputs.release }}
          images: |
            ghcr.io/${{ inputs.ghcr_username }}/${{ steps.split.outputs.repo }}
            ${{ inputs.registry }}/${{ gitea.repository }}

      - name: Print metadata
        run: |
          printf "Annotations:\n${{ steps.meta.outputs.annotations }}"
          echo ""
          printf "Labels:\n${{ steps.meta.outputs.labels }}"
          echo ""
          printf "Tags:\n${{ steps.meta.outputs.tags }}"

      - name: Build images
        uses: docker/build-push-action@v6
        with:
          context: .
          push: false
          load: true
          annotations: ${{ steps.meta.outputs.annotations }}
          labels: ${{ steps.meta.outputs.labels }}
          tags: ${{ steps.meta.outputs.tags }}

      - name: Push images
        run: |
          strtags="${{ steps.meta.outputs.tags }}"
          readarray -t lines <<<"$strtags"
          for element in "${lines[@]}"; do docker push "$element"; done
          unset strtags lines