#!/bin/bash

# ==========================================================
# 사진파일(SNAP_) 백업복사 스크립트 및 누락 로그 생성
# 설명: DB를 조회하여 지정된 원본 스토리지에서 사진 파일을 찾아
#       백업 스토리지로 복사하는 실행 파일(.sh)을 생성하며, 
#       파일이 없을 경우 로그(.log)를 남깁니다.
# ==========================================================

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

# 기본값 설정
DEF_TARGET_IP="192.168.56.202"
DEF_TARGET_DB="SAMPLE1"
DEF_START_DATE=$(date -d 'yesterday' '+%Y%m%d')
DEF_SRC_DIR="/storage2/wwwroot/files/upload"
DEF_TGT_DIR="/storage3/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}
 SRC_DIR=${4:-$DEF_SRC_DIR}
 TGT_DIR=${5:-$DEF_TGT_DIR}
 TARGET_DB=$(echo "$TARGET_DB" | tr '[:lower:]' '[:upper:]')
else
 # 파라미터가 없을 경우 (터미널 대화형 모드)
 echo "----------------------------------------------------"
 echo "  사진파일 백업복사 스크립트 및 로그 생성을 시작합니다."
 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_SRC_DIR): " SRC_DIR
 SRC_DIR=${SRC_DIR:-$DEF_SRC_DIR}

 read -p "5. 백업 파일 디렉토리 (기본: $DEF_TGT_DIR): " TGT_DIR
 TGT_DIR=${TGT_DIR:-$DEF_TGT_DIR}
fi # End of If

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

# 대상 데이터베이스 목록 구성 (미입력 시 전체 DB 조회)
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

# 날짜 포맷 변환 (YYYY-MM-DD 형식)
DATE_FORMATTED=$(echo "$START_DATE" | sed -E 's/([0-9]{4})([0-9]{2})([0-9]{2})/\1-\2-\3/')
EXEC_DATE=$(date '+%Y%m%d')

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

# 각 DB 순회 및 복사 처리
for DB in $DB_LIST
do
 echo ">>> [$DB] 사진파일 백업 스크립트 생성을 시작합니다..."
 
 # 분할 저장 및 카운트용 변수 초기화
 EXE_COUNT=0
 LOG_COUNT=0
 EXE_INDEX=1
 LOG_INDEX=1
 MAX_LINES=10000
 
 EXE_FILE="data_photocopy/photocopy_${DB}_${EXEC_DATE}_${EXE_INDEX}.sh"
 LOG_FILE="data_photocopy/photocopy_${DB}_${EXEC_DATE}_${LOG_INDEX}.log"
 
 # 쿼리: 시작일자 이후 삭제되지 않은 사진 목록 조회
 QUERY="SELECT PS01, PS07, PS11 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
 do
  # 고객 코드 기반 폴더 번호 연산
  FOLDER_NUM=$(( (PS07 / 1000) + 1000 ))
  
  # 파일 상대 경로 구성
  FILE_REL_PATH="${DB}/photo/${FOLDER_NUM}/${PS07}/SNAP_${PS11}"
  
  # 원본 및 대상 전체 경로 구성
  SRC_PATH="${SRC_DIR}/${FILE_REL_PATH}"
  BACKUP_PATH="${TGT_DIR}/${FILE_REL_PATH}"
  
  if [ -f "$SRC_PATH" ]; then
   # 원본 파일이 존재할 경우 복사 명령어 스크립트에 추가 (이미 있으면 덮어쓰지 않고 건너뜀)
   echo "mkdir -p \"$(dirname "$BACKUP_PATH")\" && cp -pn \"$SRC_PATH\" \"$BACKUP_PATH\"" >> "$EXE_FILE"
   
   # 실행 파일 라인 수에 따른 파일 분할 처리
   EXE_COUNT=$((EXE_COUNT + 1))
   if [ "$EXE_COUNT" -ge "$MAX_LINES" ]; then
    # 생성된 쉘 스크립트에 실행 권한 부여
    chmod +x "$EXE_FILE"
    EXE_INDEX=$((EXE_INDEX + 1))
    EXE_FILE="data_photocopy/photocopy_${DB}_${EXEC_DATE}_${EXE_INDEX}.sh"
    EXE_COUNT=0
   fi # End of If
  else
   # 원본 파일이 없을 경우 누락 로그 기록 (이때 파일 생성됨)
   echo "[$(date '+%Y-%m-%d %H:%M:%S')] 사진파일 누락 - PS01: $PS01, 고객코드: $PS07, 경로: $SRC_PATH" >> "$LOG_FILE"
   
   # 로그 라인 수에 따른 파일 분할 처리
   LOG_COUNT=$((LOG_COUNT + 1))
   if [ "$LOG_COUNT" -ge "$MAX_LINES" ]; then
    LOG_INDEX=$((LOG_INDEX + 1))
    LOG_FILE="data_photocopy/photocopy_${DB}_${EXEC_DATE}_${LOG_INDEX}.log"
    LOG_COUNT=0
   fi # End of If
  fi # End of If
 done # End of While
 
 # 마지막으로 작성 중이던 스크립트 파일이 있다면 권한 부여
 if [ -f "$EXE_FILE" ]; then
  chmod +x "$EXE_FILE"
 fi # End of If
 
 echo ">>> [$DB] 스크립트 생성 완료."
 
 # 생성된 파일 안내
 for f in "data_photocopy/photocopy_${DB}_${EXEC_DATE}_"*.sh; do
  if [ -f "$f" ]; then
   echo "    - 복사 스크립트: $f"
  fi # End of If
 done # End of Foreach
 
 for f in "data_photocopy/photocopy_${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 "생성된 .sh 파일을 실행하여 실제 복사를 진행하세요."
echo "----------------------------------------------------"