name: PR_COMMENT_CI

on:
  issue_comment:
    types: [created]
env:
  HUSKY: '0'

jobs:
  check:
    runs-on: ubuntu-latest
    outputs:
      next_action: ${{ steps.get-action.outputs.next_action }}
    if: ${{ github.event.issue.pull_request }}
    steps:
      - uses: actions/checkout@v4
        with:
          repository: Tencent/tdesign
          sparse-checkout: |
            .github/.pr-comment-ci-whitelist
          sparse-checkout-cone-mode: false

      - uses: actions/github-script@v7
        id: get-action
        with:
          script: |
            const user = context.payload.comment.user.login
            core.info(`user: ${user}`)

            const fs = require('fs');
            const whitelist = fs.readFileSync('.github/.pr-comment-ci-whitelist', 'utf8');

            let isWhitelist = false;
            whitelist.split('\n').forEach((owner) => {
              if (owner === user) {
                isWhitelist = true;
              }
            });

            let next_action = ''  
            if (isWhitelist) {
              const body = context.payload.comment.body
              core.info(`body: ${body}`)
              if (body.startsWith('/update-common')) {
                next_action='update-common'
              }
              if (body.startsWith('/update-snapshot')) {
                next_action='update-snapshot'
              }
              if (body.startsWith('/update-coverage')) {
                next_action='update-coverage'
              }
                
              if(next_action){
                await github.rest.reactions.createForIssueComment({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  comment_id: context.payload.comment.id,
                  content: 'rocket',
                })
              }
            } else {
               core.warning('You are not collaborator');
            }
            core.info(`next_action: ${next_action}`)
            core.setOutput('next_action', next_action)

  update-common:
    needs: check
    runs-on: ubuntu-latest
    if: ${{ needs.check.outputs.next_action == 'update-common' }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          token: ${{ secrets.PERSONAL_TOKEN }}

      - name: gh checkout pr
        env:
          GH_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
        run: gh pr checkout ${{ github.event.issue.number }}

      - name: git config
        run: |
          git config --local user.email "github-actions[bot]@users.noreply.github.com"
          git config --local user.name "github-actions[bot]"

      - name: submodule init and sync remote
        run: |
          git submodule update --init --remote

      - name: Commit common
        run: |
          git status
          working_tree_clean=$(git status | grep -c 'nothing to commit, working tree clean') || true
          if [ "$working_tree_clean" -eq "0" ]; then
            git add .
            git commit -m "chore: update common"
          fi
          git status

      - name: merge develop
        run: |
          git merge develop --no-commit || true

      - name: check conflicts
        run: |
          git status
          conflict_count=$(git status | grep -c 'both modified:') || true
          working_tree_clean=$(git status | grep -c 'nothing to commit, working tree clean') || true
          common_conflict=$(git status | grep 'both modified:' | grep -c '_common') || true
          conflicts_sum=$((common_conflict))
          echo "conflict_count: $conflict_count"
          echo "working_tree_clean: $working_tree_clean"
          echo "common_conflict: $common_conflict"
          echo "conflicts_sum: $conflicts_sum"

          if [ "$working_tree_clean" -eq "1" ]; then
              echo "nothing to commit, working tree clean"
              exit 0
          fi

          if [ "$conflict_count" -gt "0" ]&&[ "$conflicts_sum" -eq "0" ]; then
              echo "Unknown conflict "
              git status
              exit 1
          fi

          if [ "$common_conflict" -eq "1" ];then
              git checkout --ours src/_common
              git add src/_common
              echo "resolve conflict _common"
          fi

          git status
          git commit -am "chore: merge develop"

      - name: git push
        run: |
          git status
          git push || true

  update-snapshot:
    needs: check
    runs-on: ubuntu-latest
    if: ${{ needs.check.outputs.next_action == 'update-snapshot' }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          token: ${{ secrets.PERSONAL_TOKEN }}

      - name: gh checkout pr
        env:
          GH_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
        run: gh pr checkout ${{ github.event.issue.number }} --recurse-submodules

      - name: bot commtent
        id: bot-comment
        uses: actions/github-script@v7
        with:
          script: |
            const url = `${context.serverUrl}//${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`
            const urlLink = `[Open](${url})`
            const { data: comment } = await github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `⏳ 正在运行快照更新。。。 CI: ${urlLink}`
            })
            return comment.id

      - name: git config
        run: |
          git config --local user.email "github-actions[bot]@users.noreply.github.com"
          git config --local user.name "github-actions[bot]"

      - name: merge develop
        run: |
          git merge develop --no-commit || true

      - name: check conflicts
        run: |
          git status
          conflict_count=$(git status | grep -c 'both modified:') || true
          working_tree_clean=$(git status | grep -c 'nothing to commit, working tree clean') || true
          csr_snap_conflict=$(git status | grep 'both modified:' | grep -c 'csr.test.js.snap') || true
          ssr_snap_conflict=$(git status | grep 'both modified:' | grep -c 'ssr.test.js.snap') || true
          common_conflict=$(git status | grep 'both modified:' | grep -c '_common') || true
          conflicts_sum=$((csr_snap_conflict + ssr_snap_conflict + common_conflict))
          echo "conflict_count: $conflict_count"
          echo "working_tree_clean: $working_tree_clean"
          echo "csr_snap_conflict: $csr_snap_conflict"
          echo "ssr_snap_conflict: $ssr_snap_conflict"
          echo "common_conflict: $common_conflict"
          echo "conflicts_sum: $conflicts_sum"

          if [ "$working_tree_clean" -eq "1" ]; then
              echo "nothing to commit, working tree clean"
              exit 0
          fi

          if [ "$conflict_count" -gt "0" ]&&[ "$conflicts_sum" -eq "0" ]; then
              echo "Unknown conflict "
              git status
              exit 1
          fi

          if [ "$csr_snap_conflict" -eq "1" ];then
              git checkout --theirs test/snap/__snapshots__/csr.test.js.snap
              git add test/snap/__snapshots__/csr.test.js.snap
              echo "resolve conflict csr.test.js.snap"
          fi

          if [ "$ssr_snap_conflict" -eq "1" ];then
              git checkout --theirs test/snap/__snapshots__/ssr.test.js.snap
              git add test/snap/__snapshots__/ssr.test.js.snap
              echo "resolve conflict ssr.test.js.snap"
          fi

          if [ "$common_conflict" -eq "1" ];then
              git checkout --theirs src/_common
              git add src/_common
              echo "resolve conflict _common"
          fi

          git status
          git commit -am "chore: merge develop"

      - uses: actions/setup-node@v4
        with:
          node-version: 18

      - run: npm install

      - run: npm run test:update

      - name: Commit Snapshot
        run: |
          git status
          working_tree_clean=$(git status | grep -c 'nothing to commit, working tree clean') || true
          if [ "$working_tree_clean" -eq "0" ]; then
            git add .
            git commit -m "chore: update snapshot"
          fi
          git status
 
      - name: git push
        run: |
          git status
          git push || true

  update-coverage:
    needs: check
    runs-on: ubuntu-latest
    if: ${{ needs.check.outputs.next_action == 'update-coverage' }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          token: ${{ secrets.PERSONAL_TOKEN }}

      - name: gh checkout pr
        env:
          GH_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
        run: gh pr checkout ${{ github.event.issue.number }} --recurse-submodules

      - name: git config
        run: |
          git config --local user.email "github-actions[bot]@users.noreply.github.com"
          git config --local user.name "github-actions[bot]"

      - name: bot commtent
        id: bot-comment
        uses: actions/github-script@v7
        with:
          script: |
            const url = `${context.serverUrl}//${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`
            const urlLink = `[Open](${url})`
            const { data: comment } = await github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `⏳ 正在运行 coverage badge 更新。。。 CI: ${urlLink}`
            })
            return comment.id

      - uses: actions/setup-node@v4
        with:
          node-version: 18

      - run: npm install

      - run: npm run generate:coverage-badge

      - name: commit coverage badge
        run: |
          git status
          working_tree_clean=$(git status | grep -c 'nothing to commit, working tree clean') || true
          if [ "$working_tree_clean" -eq "0" ]; then
            git add .
            git commit -m "chore: update coverage badge"
          fi
          git status

      - name: git push
        run: |
          git status
          git push || true