name: Go Build Test

on:
  push:
  pull_request:
    paths-ignore:
      - '**/*.md'

  workflow_dispatch:

jobs:
  go-build:
    name: Test with go ${{ matrix.go_version }} on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    permissions:
      contents: write
      pull-requests: write
    strategy:
      matrix:
        os: [ubuntu-latest]
        go_version: ["1.21.x", "1.22.x"]

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

      - name: Set up Go ${{ matrix.go_version }}
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go_version }}

      - name: Get Server dependencies
        run: |
          go install github.com/magefile/mage@latest
          go mod tidy
          go mod download

      - name: Set up infra services
        uses: hoverkraft-tech/compose-action@v2.0.1
        # Uncomment and set the correct path to your docker-compose file
        with:
          compose-file: "./docker-compose.yml"

        # run: |
        #   sudo docker compose up -d
        #   sudo sleep 30  # Increased sleep time for better stability
        # timeout-minutes: 60 # Increased timeout for Docker setup


    # - 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
    #   run: |
    #     sed -i 's|externalAddress:.*|externalAddress: "http://${{ steps.get-ip.outputs.ip }}:10005"|' config/minio.yml
    #     cat config/minio.yml

      - name: Build and test Server Services
        run: |
          mage build
          mage start
          mage check

      - name: Checkout Chat repository
        uses: actions/checkout@v4
        with:
          repository: "openimsdk/chat"
          path: "chat-repo"

      - name: Get Chat dependencies
        run: |
          cd ${{ github.workspace }}/chat-repo
          go mod tidy
          go mod download
          go install github.com/magefile/mage@latest

      - name: Build and test Chat Services
        run: |
          cd ${{ github.workspace }}/chat-repo
          mage build
          mage start
          mage check

  go-test:
    name: Benchmark Test with go ${{ matrix.go_version }} on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    permissions:
      contents: write
    env:
      SDK_DIR: openim-sdk-core
      CONFIG_PATH: config/notification.yml
    #   pull-requests: write
    strategy:
      matrix:
        os: [ ubuntu-latest ]
        go_version: [ "1.22.x" ]

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

      - name: Checkout SDK repository
        uses: actions/checkout@v4
        with:
          repository: 'openimsdk/openim-sdk-core'
          path: ${{ env.SDK_DIR }}

      - name: Set up Go ${{ matrix.go_version }}
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go_version }}

      - name: Get Server dependencies
        run: |
          go install github.com/magefile/mage@latest
          go mod download

      - name: Install yq
        run: |
          sudo wget https://github.com/mikefarah/yq/releases/download/v4.34.1/yq_linux_amd64 -O /usr/bin/yq
          sudo chmod +x /usr/bin/yq

      - name: Modify Server Configuration
        run: |
          yq e '.groupCreated.isSendMsg = true' -i ${{ env.CONFIG_PATH }}
          yq e '.friendApplicationApproved.isSendMsg = true' -i ${{ env.CONFIG_PATH }}

      - name: Start Server Services
        run: |
          docker compose up -d
          mage build
          mage start
          mage check

      - name: Build test SDK core
        run: |
          cd ${{ env.SDK_DIR }}
          go mod tidy
          cd integration_test
          mkdir data
          go run main.go -lgr 0.8 -imf -crg -ckgn -ckcon -sem -ckmsn -u 20 -su 5 -lg 2 -cg 2 -cgm 3 -sm 10 -gm 10 -reg

  dockerfile-test:
    name: Build and Test Dockerfile
    runs-on: ubuntu-latest
    strategy:
      matrix:
        go_version: ["1.22"]

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Set up Go ${{ matrix.go_version }}
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go_version }}

      - name: Get dependencies
        run: |
          go mod tidy
          go mod download
          go install github.com/magefile/mage@latest

      - name: Build Docker Image
        run: |
          IMAGE_NAME="${{ github.event.repository.name }}-test"
          CONTAINER_NAME="${{ github.event.repository.name }}-container"
          docker build -t $IMAGE_NAME .

      - name: Run Docker Container
        run: |
          IMAGE_NAME="${{ github.event.repository.name }}-test"
          CONTAINER_NAME="${{ github.event.repository.name }}-container"
          docker run --name $CONTAINER_NAME -d $IMAGE_NAME
          docker ps -a

      - name: Test Docker Container Logs
        run: |
          CONTAINER_NAME="${{ github.event.repository.name }}-container"
          docker logs $CONTAINER_NAME

      # - name: Cleanup Docker Container
      #   run: |
      #     CONTAINER_NAME="${{ github.event.repository.name }}-container"
      #     IMAGE_NAME="${{ github.event.repository.name }}-test"
      #     docker stop $CONTAINER_NAME
      #     docker rm $CONTAINER_NAME
      #     docker rmi $IMAGE_NAME
