name: Publish Docker image to registries

on:
  push:
    branches:
      - release-*

  release:
    types: [published]

  workflow_dispatch:
    inputs:
      tag:
        description: "Tag version to be used for Docker image"
        required: true
        default: "v3.8.0"

# env:
#   GO_VERSION: "1.21"

jobs:
  publish-docker-images:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          path: main-repo

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

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: ./main-repo
          load: true
          tags: "openim/openim-server:local"

      - name: Checkout compose repository
        uses: actions/checkout@v4
        with:
          repository: "openimsdk/openim-docker"
          path: "compose-repo"

      - name: Get Internal IP Address
        id: get-ip
        run: |
          IP=$(hostname -I | awk '{print $1}')
          echo "The IP Address is: $IP"
          echo "::set-output name=ip::$IP"

      - name: Update .env to use the local image
        run: |
          sed -i 's|OPENIM_SERVER_IMAGE=.*|OPENIM_SERVER_IMAGE=openim/openim-server:local|' ${{ github.workspace }}/compose-repo/.env
          sed -i 's|MINIO_EXTERNAL_ADDRESS=.*|MINIO_EXTERNAL_ADDRESS=http://${{ steps.get-ip.outputs.ip }}:10005|' ${{ github.workspace }}/compose-repo/.env

      - name: Start services using Docker Compose
        run: |
          cd ${{ github.workspace }}/compose-repo
          docker compose up -d
          sleep 60

      - name: Check openim-server health
        run: |
          timeout=300
          interval=30
          elapsed=0
          while [[ $elapsed -le $timeout ]]; do
            if ! docker exec openim-server mage check; then
              echo "openim-server is not ready, waiting..."
              sleep $interval
              elapsed=$(($elapsed + $interval))
            else
              echo "Health check successful"
              exit 0
            fi
          done
          echo "Health check failed after 5 minutes"
          exit 1

      - name: Check openim-chat health
        if: success()
        run: |
          if ! docker exec openim-chat mage check; then
              echo "openim-chat check failed"
              exit 1
            else
              echo "Health check successful"
              exit 0
            fi


      - name: Extract metadata for Docker #  (tags, labels) 
        if: success()
        id: meta
        uses: docker/metadata-action@v5.5.1
        with:
          images: |
            openim/openim-server
            ghcr.io/openimsdk/openim-server
            registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-server

          # generate Docker tags based on the following events/attributes
          tags: |
            type=ref,event=tag
            type=schedule
            type=ref,event=branch
            type=ref,event=pr
            type=semver,pattern={{version}}
            type=semver,pattern=v{{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=semver,pattern={{major}}
            type=sha

      - name: Log in to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Log in to Aliyun Container Registry
        uses: docker/login-action@v2
        with:
          registry: registry.cn-hangzhou.aliyuncs.com
          username: ${{ secrets.ALIREGISTRY_USERNAME }}
          password: ${{ secrets.ALIREGISTRY_TOKEN }}

      - name: Build and push Docker images
        uses: docker/build-push-action@v5
        with:
          context: ./main-repo
          push: true
          platforms: linux/amd64,linux/arm64
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
