name: Publish Docker Images

on:
  workflow_dispatch:  # Manual trigger for testing
  release:
    types: [published]

env:
  REGISTRY: ghcr.io
  IMAGE_BASE: ghcr.io/massgen

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    strategy:
      matrix:
        variant: [standard, sudo]
        platform: [linux/amd64, linux/arm64]
      fail-fast: false

    steps:
      - name: Free disk space
        run: |
          echo "=== Before cleanup ==="
          df -h /
          sudo rm -rf /usr/share/dotnet
          sudo rm -rf /usr/local/lib/android
          sudo rm -rf /opt/ghc
          sudo rm -rf /opt/hostedtoolcache/CodeQL
          sudo docker system prune -af
          echo "=== After cleanup ==="
          df -h /

      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

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

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract version tag
        id: version
        run: |
          if [[ "${{ github.event_name }}" == "release" ]]; then
            echo "tag=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT
          else
            echo "tag=latest" >> $GITHUB_OUTPUT
          fi

      - name: Set image name and dockerfile
        id: image-config
        run: |
          if [[ "${{ matrix.variant }}" == "sudo" ]]; then
            echo "dockerfile=massgen/docker/Dockerfile.sudo" >> $GITHUB_OUTPUT
            echo "image_name=${{ env.IMAGE_BASE }}/mcp-runtime-sudo" >> $GITHUB_OUTPUT
          else
            echo "dockerfile=massgen/docker/Dockerfile" >> $GITHUB_OUTPUT
            echo "image_name=${{ env.IMAGE_BASE }}/mcp-runtime" >> $GITHUB_OUTPUT
          fi

      - name: Build and push image (${{ matrix.variant }}, ${{ matrix.platform }})
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ${{ steps.image-config.outputs.dockerfile }}
          push: true
          platforms: ${{ matrix.platform }}
          cache-from: type=gha,scope=${{ matrix.variant }}-${{ matrix.platform }}
          cache-to: type=gha,mode=max,scope=${{ matrix.variant }}-${{ matrix.platform }}
          tags: |
            ${{ steps.image-config.outputs.image_name }}:latest-${{ matrix.platform == 'linux/amd64' && 'amd64' || 'arm64' }}
            ${{ steps.image-config.outputs.image_name }}:${{ steps.version.outputs.tag }}-${{ matrix.platform == 'linux/amd64' && 'amd64' || 'arm64' }}

  create-manifests:
    needs: build-and-push
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    strategy:
      matrix:
        variant: [standard, sudo]

    steps:
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract version tag
        id: version
        run: |
          if [[ "${{ github.event_name }}" == "release" ]]; then
            echo "tag=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT
          else
            echo "tag=latest" >> $GITHUB_OUTPUT
          fi

      - name: Set image name
        id: image-config
        run: |
          if [[ "${{ matrix.variant }}" == "sudo" ]]; then
            echo "image_name=${{ env.IMAGE_BASE }}/mcp-runtime-sudo" >> $GITHUB_OUTPUT
          else
            echo "image_name=${{ env.IMAGE_BASE }}/mcp-runtime" >> $GITHUB_OUTPUT
          fi

      - name: Create and push multi-arch manifest for latest
        run: |
          docker buildx imagetools create -t ${{ steps.image-config.outputs.image_name }}:latest \
            ${{ steps.image-config.outputs.image_name }}:latest-amd64 \
            ${{ steps.image-config.outputs.image_name }}:latest-arm64

      - name: Create and push multi-arch manifest for version tag
        run: |
          docker buildx imagetools create -t ${{ steps.image-config.outputs.image_name }}:${{ steps.version.outputs.tag }} \
            ${{ steps.image-config.outputs.image_name }}:${{ steps.version.outputs.tag }}-amd64 \
            ${{ steps.image-config.outputs.image_name }}:${{ steps.version.outputs.tag }}-arm64
