#!/bin/bash

######### NOTICE ##############
#	 Itsm 요청이 왔을 때
#	메일 발송되는 것이 목적이라서
#	 아래 소스는 ChatGPT로
#	최소한의 로직만 구현했습니다
###############################

######## MAIL API ############
#    우리메일(WOORIMAIL)
#  https://woorimail.com
#						
#  월 1만건 무료 발송 가능합니다
# 	 메일 1만건 모두 소진 시
# 	당월 메일 발송이 중지됩니다
##############################

###### TIME SETTING ###########
# 	 현재 9시 ~ 18시까지만
#	 동작하도록 세팅되어있으니
#	수정이 필요하면 아래 함수에서
#	  시간 수정 부탁드립니다
#  check_working_hours()
###############################

##### RECEIVER INFO ###########
# 	 메일 발신자 정보 수정은
# 	60번 줄 영역에 있는 값을
# 	  수정해주시면 됩니다
###############################

# Function to make API call and check response
check_response() {
  # API details
  METHOD="POST"
  CONTENT_TYPE="application/x-www-form-urlencoded"
  ITSM_CHECK_URL="" # ITSM 접수대기 건수 URL
  ITSM_LIST_URL="" # ITSM 접수대기 리스트 URL
  BODY="id=1520" # 접수대기(1520), 처리중(1526)

  # ITSM 처리중
  #ITSM_LIST_URL=""
  #BODY="id=1526"
  
  # 고정값
  MAIL_URL="https://woorimail.com/"
  TYPE="api"
  MID="auth_woorimail"
  ACT="dispWwapimanagerMailApi"
  DOMAIN="" # 지정한 도메인 URL
  AUTHKEY="" # 키값
  
  ##################################################
  # 아래처럼 세팅했을 경우 메일은 다음과 같이 발송됩니다
  #
  # 발신자: YuY<[email protected]>
  # 회신할 경우, 받는사람: ID@이메일주소
  ##################################################
  WMS_NICK="wms_nick"               # 보낸사람 계정
  SENDER_EMAIL=""                   # 회신할 사람 이메일
  SENDER_NICKNAME="YuY"             # 회신할 사람 닉네임
  RECEIVER_NICKNAME=""              # 받는 사람(나) 닉네임
  RECEIVER_EMAIL=$RECEIVER_EMAIL    # 받는 사람(나) 이메일
  
  # Add cookies to the request
  COOKIE="JSESSIONID=$JSESSIONID"   # ITSM JSessionID 값

  # Make the API call and print the response
  RESPONSE=$(curl -s -X $METHOD \
                    -H "Content-Type: $CONTENT_TYPE" \
                    -H "Cookie: $COOKIE" \
                    -d "$BODY" \
                    $ITSM_CHECK_URL)

  # Extract result value from RESPONSE message
  RESULT_ITSM_READY_CNT=$(echo "$RESPONSE" | grep -oP 'result: \(\K[0-9]+')

  # Check if RESULT is greater than 0 and show dialog
	if validate_email "$RECEIVER_EMAIL"; then
		if [ "$RESULT_ITSM_READY_CNT" -gt 0 ]; then 
		
			RESPONSE=$(curl -s -X $METHOD \
                                            -H "Content-Type: $CONTENT_TYPE" \
                                            -H "Cookie: $COOKIE" \
                                            -d "$BODY" \
                                            $ITSM_LIST_URL)
						
			RESULT_ITSM_READY_LIST=$(echo "$RESPONSE" | sed -n '/<table width="100%"/,/<\/table>/p' | sed -n '1,/<\/table>/p' | grep -o '<td[^>]*>[^<]*</td>' | sed -E 's/<\/?td[^>]*>//g')
			RESULT_ITSM_ALL_HTML=$(echo "$RESPONSE" | sed ':a;N;$!ba;s/\n/ /g' | grep -oP '<table width="100%".*?</table>')
						
			# Convert the multiline string to an array
			IFS=$'\n' read -r -d '' -a TD_VALUES_ARRAY <<< "$RESULT_ITSM_READY_LIST"
			MAIL_TITLE="ITSM "
			
			# Process the array in chunks of 7
			num_values=${#TD_VALUES_ARRAY[@]}
			for ((i = 0; i < num_values; i += 7)); do
			  MAIL_TITLE="$MAIL_TITLE ${TD_VALUES_ARRAY[i]} "
			done
			
			MAIL_TITLE=$(url_encode "$MAIL_TITLE")
			MAIL_CONTENT=$(url_encode "ITSM 대기건수: $RESULT_ITSM_READY_CNT 건 $RESULT_ITSM_ALL_HTML")
			MAIL_BODY="authkey=$AUTHKEY&domain=$DOMAIN&type=$TYPE&mid=$MID&act=$ACT&callback=&title=$MAIL_TITLE&content=$MAIL_CONTENT&wms_domain=woorimail.com&wms_nick=$WMS_NICK&sender_email=$SENDER_EMAIL&sender_nickname=$SENDER_NICKNAME&receiver_nickname=$RECEIVER_NICKNAME&receiver_email=$RECEIVER_EMAIL&member_regdate=20240604170101"
			
			RESPONSE=$(curl -s -X $METHOD \
                                            -H "Content-Type: $CONTENT_TYPE" \
                                            -d "$MAIL_BODY" \
                                            $MAIL_URL)
			echo "Ready Itsm: $RESULT_ITSM_READY_CNT, $RESPONSE"
		else
			echo "Empty Itsm."
		fi
	else
		echo "Invalid email format. Please provide a valid email address."
	fi
}

# Function to check if current time is within working hours
check_working_hours() {
  current_hour=$(date +%H)
  if [ "$current_hour" -ge 9 ] && [ "$current_hour" -lt 18 ]; then
    return 0 # Within working hours
  else
    return 1 # Outside working hours
  fi
}

# Function to validate email format
validate_email() {
  # Regular expression for email validation
  regex='^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$'
  
  if [[ $1 =~ $regex ]]; then
    return 0 # Valid email format
  else
    return 1 # Invalid email format
  fi
}

# Function to URL encode a string
url_encode() {
  local string="${1}"
  local encoded=""

  # Convert the string to hex representation
  hex_string=$(echo -n "$string" | od -An -tx1 | tr ' ' '\n' | grep -v '^$')

  # Iterate over each character in the hex string
  for hex_char in $hex_string; do
    encoded+="%$hex_char"
  done

  echo "$encoded"
}

INTRODUCTION="
################################################
###### ITSM 로그인 후
###### 쿠키에 등록된 JSESSIONID 값을 입력해주세요
################################################

################################################
# 입력 파라미터, 몇분마다 이메일로 발송할지 세팅
# 1: 시간, 분(minute)
# 2: 이메일 주소
#
# ex) ./checkItsm.sh 5 이메일주소
# -> 5분마다 접수대기 중인 itsm을 체크하여
# -> 1건 이상 있을 경우 입력한 이메일로 발송
#
# Itsm이 장시간으로 접수대기 상태인 경우가 많을수록
# 시간을 길게 세팅하는게 좋습니다
# 권장 시간(분) 5 ~ 20
################################################

값을 제대로 입력하면 아래와 같은 형식의 문구가 나옵니다
- 접수대기 건수가 없는 경우
> Empty Itsm.

- 접수대기 건수가 있는 경우, 메일 발송
> Ready Itsm: 1, result: ~~, error_msg: ~~ ...

JSESSIONID: "

# Prompt user to input JSESSIONID
read -p "$INTRODUCTION" JSESSIONID

# Check if the second argument is provided
if [ -z "$2" ]; then
  echo "Please provide a RECEIVER_EMAIL as the second argument."
  exit 1
else
  RECEIVER_EMAIL="$2"
fi

# Check if argument is provided for interval, default is set to 5 minutes
interval=${1:-5}

# Loop indefinitely and check response every $interval minutes
while true; do
	# Check if current time is within working hours
  if ! check_working_hours; then
    echo "Outside working hours. Exiting..."
    exit 0
  fi
  
  check_response
  sleep "$interval"m
done