name: Deploy request slack alarm
author: Kyle
description: 'deploy reqeust message'
inputs:
  TYPE:
    description: 'ex) FE, BE'
    required: false
    default: 'BE'
  CHANNEL_ID:
    description: 'ex) prod_approve slack channel id'
    required: true
    default: 'C068PP9AYJY'
  ENVIRONMENT:
    description: 'ex) prod'
    required: true
    default: 'prod'
  CATEGORY:
    description: 'ex) klip or devops or kas'
    required: true
    default: ''
  SERVICE:
    description: 'ex) klip-pass, klip etc..'
    required: true
    default: ''
  VERSION:
    description: 'ex) v1.0.0'
    required: true
    default: ''
  REPOSITORY:
    description: 'ex) klip-pass-be'
    required: false
    default: ''
  PR_NUMBER:
    description: 'ex) 1345'
    required: false
    default: ''
  ENVIRONMENT_ID:
    description: 'ex) 2476771098'
    required: false
    default: ''
  WORKFLOW_ID:
    description: 'ex) 8262151233'
    required: false
    default: ''
  SLACK_APPROVE_TOKEN:
    description: 'ex) xoxb-xxxx-xxxx-xxxx'
    required: true
    default: ''


runs:
  using: "composite"
  steps:
  - name: set outputs
    id: set-outputs
    shell: bash
    run: |
      echo "TYPE=${{ inputs.TYPE }}" >> $GITHUB_OUTPUT
      GIT_REPO=${{ inputs.REPOSITORY }}
      REPO=$(echo $GIT_REPO | awk -F "/" '{print $2}')
      echo "REPO=$(echo $REPO)" >> $GITHUB_OUTPUT
  - name: Send prod BE deploy approve message on slack
    if: steps.set-outputs.outputs.TYPE == 'BE'
    uses: slackapi/slack-github-action@v1.26.0
    with:
      channel-id: ${{ inputs.CHANNEL_ID }}
      payload: |
        {
          "blocks": [
            {
              "type": "section",
              "text": {
                  "type": "mrkdwn",
                  "text": ":rocket: *[${{ inputs.TYPE }}] ${{ inputs.SERVICE }}-${{ inputs.VERSION }} ${{ inputs.ENVIRONMENT }} 배포 요청이 있습니다.*\n\n배포 승인은 *반드시 Staging 테스트 이후* Approve 하시기 바랍니다.:red_siren:\n배포 승인을 하시려면 아래의 *Approve* 버튼을 눌러주시기 바랍니다.:thumbsup:"
              }
            },
            {
              "type": "actions",
              "elements": [
                  {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "Approve :white_check_mark:"
                    },
                    "value": "{\"action\": \"approve\",\"type\": \"${{ inputs.TYPE }}\",\"application\": \"${{ inputs.ENVIRONMENT }}-${{ inputs.SERVICE }}\",\"category\": \"${{ inputs.CATEGORY }}\",\"repo\": \"${{ steps.set-outputs.outputs.REPO }}\", \"prnumber\": \"${{ inputs.PR_NUMBER }}\"}",
                    "action_id": "action_approve"
                  }
              ]
            }
          ]
        }
    env:
      SLACK_BOT_TOKEN: ${{ inputs.SLACK_APPROVE_TOKEN }}
  
  - name: Send prod FE deploy approve message on slack
    if: steps.set-outputs.outputs.TYPE == 'FE'
    uses: slackapi/slack-github-action@v1.26.0
    with:
      channel-id: ${{ inputs.CHANNEL_ID }}
      payload: |
        {
          "blocks": [
            {
              "type": "section",
              "text": {
                  "type": "mrkdwn",
                  "text": ":rocket: *[${{ inputs.TYPE }}] ${{ inputs.SERVICE }}-${{ inputs.VERSION }} ${{ inputs.ENVIRONMENT }} 배포 요청이 있습니다.*\n\n배포 승인은 *반드시 Staging 테스트 이후* Approve 하시기 바랍니다.:red_siren:\n배포 승인을 하시려면 아래의 *Approve* 버튼을 눌러주시기 바랍니다.:thumbsup:"
              }
            },
            {
              "type": "actions",
              "elements": [
                  {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "Approve :white_check_mark:"
                    },
                    "value": "{\"action\": \"approve\",\"type\": \"${{ inputs.TYPE }}\",\"category\": \"${{ inputs.CATEGORY }}\",\"application\": \"${{ steps.set-outputs.outputs.REPO }}\",\"repo\": \"${{ steps.set-outputs.outputs.REPO }}\",\"environmentid\": \"${{ inputs.ENVIRONMENT_ID }}\", \"workflowid\": \"${{ inputs.WORKFLOW_ID }}\"}",
                    "action_id": "action_approve"
                  }
              ]
            }
          ]
        }
    env:
      SLACK_BOT_TOKEN: ${{ inputs.SLACK_APPROVE_TOKEN }}
    
    # Approve 채널로 배포 시작 스레드 댓글을 추가하기 위해 스레드 값 확인
  - name: Get Slack message ts
    id: check-github-ts
    shell: bash
    run: |
      sleep 3s
      CHANNERTS=$(curl -X POST https://slack.com/api/conversations.history \
        -H "Authorization: Bearer ${{ inputs.SLACK_APPROVE_TOKEN }}" \
        -H "Content-type: application/json" \
          --data '{
            "channel": "${{ inputs.CHANNEL_ID }}"}' | jq '.messages[] | select(.text | contains("${{ inputs.TYPE }}] ${{ inputs.SERVICE }}-${{ inputs.VERSION }} ${{ inputs.ENVIRONMENT }} 배포 요청이 있습니다.")) | .ts'|head -n 1)
      echo "CHANNERTS=$(echo $CHANNERTS)" >> $GITHUB_OUTPUT
      echo $CHANNERTS

  # Approve 채널로 각 서비스별 배포 담당자 멘션을 위한 blossomops 호출
  # 테스트는 blossomops.dev로 진행하며 실제로는 blossomops.sandbox URL를 사용해야함
  - name: Request blossomops deploy approver
    shell: bash
    run: |
      curl -X GET --location "https://blossomops.sandbox.groundxdev.com/v1/operator/service/approver?category=${{ inputs.CATEGORY }}&ts=${{ steps.check-github-ts.outputs.CHANNERTS }}"
