#!/bin/bash

# ==========================================================
# 사진파일(SNAP_) 용량 쿼리 및 로그 생성 스크립트
# 작성일: 2026-06-07
# 설명: DB를 조회하여 실제 업로드된 사진 파일의 크기를 구하고
#       DB의 용량 값과 다를 경우에만 UPDATE SQL 파일을 생성하며,
#       누락 파일은 로그(.log)를 생성합니다.
# ==========================================================

# [설정] MySQL 접속 정보
SRC_USER="root"
SRC_PW="@smartserver"

# [기본값 설정]
DEF_TARGET_IP="192.168.56.202"
DEF_TARGET_DB="SAMPLE1"
DEF_START_DATE=$(date '+%Y%m%d')
DEF_BASE_DIR="/storage1/wwwroot/files/upload"

# 웹(파라미터) / 터미널(대화형) 분기
if [ "$#" -gt 0 ]; then
 # 파라미터가 있을 경우 (웹 모드)
 TARGET_IP=${1:-$DEF_TARGET_IP}
 TARGET_DB=${2:-$DEF_TARGET_DB}
 START_DATE=${3:-$DEF_START_DATE}
 BASE_DIR=${4:-$DEF_BASE_DIR}
 TARGET_DB=$(echo "$TARGET_DB" | tr '[:lower:]' '[:upper:]')
else
 # 파라미터가 없을 경우 (대화형 모드)
 echo "----------------------------------------------------"
 echo "  사진파일 용량 업데이트 쿼리 및 로그 생성을 시작합니다."
 echo "  (입력 없이 Enter를 누르면 기본값이 사용됩니다.)"
 echo "----------------------------------------------------"

 read -p "1. 대상 서버 IP (기본: $DEF_TARGET_IP): " TARGET_IP
 TARGET_IP=${TARGET_IP:-$DEF_TARGET_IP}

 read -p "2. 대상 DB 이름 (기본: $DEF_TARGET_DB, 미입력시 전체): " TARGET_DB
 TARGET_DB=${TARGET_DB:-$DEF_TARGET_DB}
 TARGET_DB=$(echo "$TARGET_DB" | tr '[:lower:]' '[:upper:]')

 read -p "3. 시작일자 YYYYMMDD (기본: $DEF_START_DATE): " START_DATE
 START_DATE=${START_DATE:-$DEF_START_DATE}

 read -p "4. 파일 저장 경로 (기본: $DEF_BASE_DIR): " BASE_DIR
 BASE_DIR=${BASE_DIR:-$DEF_BASE_DIR}

 echo ""
 echo "----------------------------------------------------"
 echo " [입력 정보 확인]"
 echo " > 서버 IP: $TARGET_IP"
 echo " > 대상 DB: ${TARGET_DB:-"전체 DB"}"
 echo " > 시작일자: $START_DATE"
 echo " > 저장 경로: $BASE_DIR"
 echo "----------------------------------------------------"
 read -p " 위 정보를 확인하셨습니까? (Enter를 누르면 시작합니다) " CONFIRM
fi # End of If

# MySQL 비밀번호 환경변수 설정 (경고 메시지 방지)
export MYSQL_PWD="$SRC_PW"

# 대상 데이터베이스 목록 구성
if [ -z "$TARGET_DB" ]; then
 DB_LIST=$(mysql -h "$TARGET_IP" -u "$SRC_USER" -e "SHOW DATABASES;" -N | grep -Ev "^(Database|information_schema|performance_schema|mysql|sys)$")
else
 DB_LIST=$(echo "$TARGET_DB" | tr ',' ' ')
fi # End of If

# YYYYMMDD 형식을 YYYY-MM-DD 형식으로 변환 (쿼리용)
DATE_FORMATTED=$(echo "$START_DATE" | sed -E 's/([0-9]{4})([0-9]{2})([0-9]{2})/\1-\2-\3/')

# 실행일자(YYYYMMDD) 추출 (파일명 생성용)
EXEC_DATE=$(date '+%Y%m%d')

# 결과 파일 저장용 디렉토리 생성
mkdir -p data_photosize

# 각 DB 순회 및 처리
for DB in $DB_LIST
do
 echo ">>> [$DB] 사진파일 처리를 시작합니다..."
 
 # 분할 저장용 변수 초기화
 SQL_COUNT=0
 LOG_COUNT=0
 SQL_INDEX=1
 LOG_INDEX=1
 MAX_LINES=10000
 
 # 생성될 첫 번째 결과 파일 정의 (data_photosize 디렉토리 하위로 지정, 실행일자 적용)
 SQL_FILE="data_photosize/photosize_${DB}_${EXEC_DATE}_${SQL_INDEX}.sql"
 LOG_FILE="data_photosize/photosize_${DB}_${EXEC_DATE}_${LOG_INDEX}.log"
 
 # 쿼리: 지정된 시작일자 이후의 삭제되지 않은 사진 목록과 현재 저장된 용량(PS14) 조회
 QUERY="SELECT PS01, PS07, PS11, IFNULL(PS14, 0) FROM PS WHERE PS03 = 1 AND PS08 >= '$DATE_FORMATTED' AND PS11 != '';"
 
 # 쿼리 결과를 한 줄씩 읽어서 처리
 mysql -h "$TARGET_IP" -u "$SRC_USER" -D "$DB" -e "$QUERY" -N | while read PS01 PS07 PS11 PS14
 do
  # 고객 코드(PS07)를 기반으로 폴더 번호(1000 + floor(PS07/1000)) 계산
  FOLDER_NUM=$(( (PS07 / 1000) + 1000 ))
  
  # 실제 사진 파일의 절대 경로 구성 (SNAP_ 접두사 사용)
  FILE_PATH="${BASE_DIR}/${DB}/photo/${FOLDER_NUM}/${PS07}/SNAP_${PS11}"
  
  if [ -f "$FILE_PATH" ]; then
   # 파일이 존재할 경우 용량(바이트) 추출 (Linux 기준 stat 명령어)
   FILE_SIZE=$(stat -c%s "$FILE_PATH")
   
   # DB에 저장된 용량과 실제 파일 용량이 다를 경우에만 쿼리 생성
   if [ "$FILE_SIZE" != "$PS14" ]; then
    # 파일 용량 업데이트 SQL 문장 추가 (이때 파일이 생성됨)
    echo "UPDATE ${DB}.PS SET PS14 = $FILE_SIZE WHERE PS01 = $PS01;" >> "$SQL_FILE"
    
    # 파일 라인 수 체크 및 분할 처리
    SQL_COUNT=$((SQL_COUNT + 1))
    if [ "$SQL_COUNT" -ge "$MAX_LINES" ]; then
     SQL_INDEX=$((SQL_INDEX + 1))
     SQL_FILE="data_photosize/photosize_${DB}_${EXEC_DATE}_${SQL_INDEX}.sql"
     SQL_COUNT=0
    fi # End of If
   fi # End of If
  else
   # 파일이 존재하지 않을 경우 누락 로그 작성 (이때 파일이 생성됨)
   echo "[$(date '+%Y-%m-%d %H:%M:%S')] 사진 누락 - PS01: $PS01, 고객코드: $PS07, 경로: $FILE_PATH" >> "$LOG_FILE"
   
   # 로그 라인 수 체크 및 분할 처리
   LOG_COUNT=$((LOG_COUNT + 1))
   if [ "$LOG_COUNT" -ge "$MAX_LINES" ]; then
    LOG_INDEX=$((LOG_INDEX + 1))
    LOG_FILE="data_photosize/photosize_${DB}_${EXEC_DATE}_${LOG_INDEX}.log"
    LOG_COUNT=0
   fi # End of If
  fi # End of If
 done # End of While
 
 echo ">>> [$DB] 처리 완료."
 
 # 파일이 실제로 생성되었는지 확인 후 결과 안내 (분할된 파일 모두 출력)
 for f in "data_photosize/photosize_${DB}_${EXEC_DATE}_"*.sql; do
  if [ -f "$f" ]; then
   echo "    - 업데이트 쿼리: $f"
  fi # End of If
 done # End of Foreach
 
 for f in "data_photosize/photosize_${DB}_${EXEC_DATE}_"*.log; do
  if [ -f "$f" ]; then
   echo "    - 누락파일 로그: $f"
  fi # End of If
 done # End of Foreach
 
 echo ""
done # End of Foreach

# 사용한 비밀번호 환경변수 해제
unset MYSQL_PWD

echo "----------------------------------------------------"
echo "모든 작업이 완료되었습니다."
echo "----------------------------------------------------"