name: Publish image
on:
  push:
    paths:
      - 'boxes/**'
  workflow_dispatch:

jobs:
  generate-matrix:
    name: Generate job matrices
    runs-on: host
    outputs:
      boxes: ${{ steps.changed-files.outputs.all_changed_files }}
      boxes-count: ${{ steps.changed-files.outputs.all_changed_files_count }}
      timestamp: ${{ steps.timestamp.outputs.timestamp }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: List changed files
        id: changed-files
        uses: tj-actions/changed-files@v45.0.3
        with:
          matrix: true
          diff_relative: true
          dir_names: true
          dir_names_exclude_current_dir: true
          dir_names_max_depth: 2
          files: boxes/**
      - name: Get timestamp
        id: timestamp
        run: |
          echo "timestamp=$(date +'%Y-%m-%d_%H-%M')" >> $GITHUB_OUTPUT
      - name: Output changes
        run: |
          echo 'Files changed: ${{ steps.changed-files.outputs.all_changed_files_count }}'
          echo 'List: ${{ steps.changed-files.outputs.all_changed_files }}'

  create-docker-images:
    needs: generate-matrix
    runs-on: host
    strategy:
      matrix:
        # box: ${{ needs.generate-matrix.outputs.boxes }} FIXME: this doesn't work yet in forgejo-runner
        box:
          - path: "boxes/devbox"
            name: "devbox"
    if: contains(needs.generate-matrix.outputs.boxes, matrix.box.path)
    steps:
      - name: Print variables
        run: |
          echo 'Building image in context "${{ matrix.box.path }}" as tag "${{matrix.box.name}}:${{ needs.generate-matrix.outputs.timestamp }}"'

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

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          registry: git.alecodes.page
          username: ${{ vars.CONTAINER_REGISTRY_USER }}
          password: ${{ secrets.CONTAINER_REGISTRY_TOKEN }}

      - name: Build and push
        uses: docker/build-push-action@v6
        with:
          platforms: linux/amd64,linux/arm64
          push: true
          context: "{{defaultContext}}:${{ matrix.box.path }}"
          tags: |
            git.alecodes.page/alecodes/${{ matrix.box.name }}:latest
            git.alecodes.page/alecodes/${{matrix.box.name}}:${{ needs.generate-matrix.outputs.timestamp }}
