#!/bin/bash

# ==========================================================
# MySQL 고객 나이(CS12) 업데이트 스크립트
# 작성일: 2026-03-31
# 설명: CS 테이블의 주민등록번호(CS09) 값을 기반으로 만나이를 갱신
# ==========================================================

# [설정] MySQL 접속 정보
DB_USER="root"
DB_PW="@smartserver"

# [기본값 설정]
DEF_SERVER_IP="192.168.56.201"
DEF_DB_LIST=""

# 웹(파라미터) / 터미널(대화형) 분기
if [ "$#" -gt 0 ]; then
 # 파라미터가 있을 경우 (웹 모드)
 SERVER_IP=${1:-$DEF_SERVER_IP}
 DB_LIST=${2:-$DEF_DB_LIST}
 DB_LIST=$(echo "$DB_LIST" | tr '[:lower:]' '[:upper:]')
else
 # 파라미터가 없을 경우 (대화형 모드)
 echo "----------------------------------------------------"
 echo "  고객 나이(CS12) 업데이트를 시작합니다."
 echo "  (입력 없이 Enter를 누르면 기본값이 사용됩니다.)"
 echo "----------------------------------------------------"

 read -p "1. 서버 IP (기본: $DEF_SERVER_IP): " SERVER_IP
 SERVER_IP=${SERVER_IP:-$DEF_SERVER_IP}

 read -p "2. 데이터베이스 (기본: 전체): " DB_LIST
 DB_LIST=${DB_LIST:-$DEF_DB_LIST}
 DB_LIST=$(echo "$DB_LIST" | tr '[:lower:]' '[:upper:]')

 echo ""
 echo "----------------------------------------------------"
 echo " [입력 정보 확인]"
 echo " > 서버 IP: $SERVER_IP"
 echo "----------------------------------------------------"
 read -p " 위 정보를 확인하셨습니까? (Enter를 누르면 시작합니다) " CONFIRM
fi # End of If

# 전체 DB 대상 여부 판별 플래그
IS_ALL_DB=0

# DB 목록이 비어있으면 서버에서 전체 목록을 가져옴
if [ -z "$DB_LIST" ]; then
 IS_ALL_DB=1
 MYSQL_PWD="$DB_PW" mysql -h "$SERVER_IP" -u "$DB_USER" -e "SHOW DATABASES;" 2>/dev/null > /tmp/age_db_list.txt
 DB_LIST=$(cat /tmp/age_db_list.txt | grep -Ev "(Database|information_schema|performance_schema|mysql|sys|dbo|CUBE_MASTER)" | tr '\n' ',' | sed 's/,$//')
 rm -f /tmp/age_db_list.txt
fi # End of If

# 콤마로 구분된 DB 목록을 배열로 치환
DB_ARRAY=(${DB_LIST//,/ })

START_DATETIME=$(date "+%Y-%m-%d %H:%M:%S")
echo ""
echo "나이 업데이트 시작: $START_DATETIME"
echo "----------------------------------------------------"

# 나이 업데이트 SQL 정의 (공백 제거 및 필터링 로직 추가)
UPDATE_SQL="
UPDATE IGNORE CS 
SET CS12 = 
 CASE 
  WHEN LENGTH(REPLACE(REPLACE(CS09, '-', ''), ' ', '')) >= 13 
   AND SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 3, 2) BETWEEN '01' AND '12'
   AND SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 5, 2) BETWEEN '01' AND '31'
   AND SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 7, 1) IN ('1', '2', '3', '4', '5', '6', '7', '8')
   -- 0 또는 1로 시작하고 뒷자리가 1, 2, 5, 6인 경우(오기입 데이터) 제외 조건 추가
   AND NOT (SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 1, 1) IN ('0', '1') AND SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 7, 1) IN ('1', '2', '5', '6'))
   -- 미래 날짜 차단
   AND CONCAT(
    CASE 
     WHEN SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 7, 1) IN ('1', '2', '5', '6') THEN '19'
     WHEN SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 7, 1) IN ('3', '4', '7', '8') THEN '20'
    END, 
    SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 1, 6)
   ) <= DATE_FORMAT(CURDATE(), '%Y%m%d')
  THEN 
   -- 수학적 연산으로 만나이 계산
   YEAR(CURDATE()) 
   - CAST(CONCAT(
    CASE 
     WHEN SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 7, 1) IN ('1', '2', '5', '6') THEN '19'
     WHEN SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 7, 1) IN ('3', '4', '7', '8') THEN '20'
    END, 
    SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 1, 2)
   ) AS UNSIGNED)
   - IF(DATE_FORMAT(CURDATE(), '%m%d') < SUBSTRING(REPLACE(REPLACE(CS09, '-', ''), ' ', ''), 3, 4), 1, 0)
  ELSE CS12 -- 유효하지 않은 주민번호는 기존 나이 유지
 END
WHERE CS01 > 0; -- Safe Update 차단 방지
"

# DB 배열을 순회하며 개별 업데이트 실행
for DB in "${DB_ARRAY[@]}"
do
 echo "[$DB] 데이터베이스 고객 나이 업데이트 중..."
 
 # 쿼리 실행
 MYSQL_PWD="$DB_PW" mysql -h "$SERVER_IP" -u "$DB_USER" "$DB" -e "$UPDATE_SQL"
 
 # 정상 실행 여부 판별
 if [ $? -eq 0 ]; then
  echo " > [$DB] 업데이트 완료"
 else
  echo " > [$DB] 업데이트 실패 (에러 발생)"
 fi # End of If
done # End of For

END_DATETIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "----------------------------------------------------"
echo "나이 업데이트 완료: $END_DATETIME"
echo "----------------------------------------------------"