#!/bin/bash
# ------------------------------------------------------------------------------
# mail_sync_cron.sh
#   조직도 동기화 + 기존 정책 mail_address 보정을 '순서대로' 자동 수행.
#   cron 으로 일정 주기 실행.
#
#   ① mailUserDbData.php        : vwIMGOCR → COM_USER/COM_DEPT (조직 마스터 최신화, 신버전)
#   ② fix_mailaddress.php apply : 기존 정책의 mail_address 재계산(부서 하위 포함 펼침 반영)
#
#   ※ 실행 위치: 스크립트가 있는 디렉터리 기준(배포 경로 예: /usr/local/apache/htdocs/mailfilter)
#   ※ 중복 실행 방지(flock), 결과는 로그에 기록.
#
#   설치(cron) 예시는 파일 하단 주석 참조.
# ------------------------------------------------------------------------------
set -u

# --- 환경(필요 시 조정) --------------------------------------------------------
PHP="${PHP:-/usr/bin/php}"                 # php CLI 경로 (환경에 맞게: /usr/local/php/bin/php 등)
LOG="${LOG:-/usr/local/imagefilter30/var/logs/mail_sync_cron.log}"
LOCK="${LOCK:-/tmp/mail_sync_cron.lock}"
SYNC_SH="${SYNC_SH:-}"                      # 정책 복제 스크립트 경로(비우면 자동 탐색). 다중서버 미사용이면 빈 파일/미존재로 두면 skip
# ------------------------------------------------------------------------------

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"

ts() { date '+%Y-%m-%d %H:%M:%S'; }

# 중복 실행 방지 (이전 실행이 안 끝났으면 skip)
exec 9>"$LOCK" || { echo "[$(ts)] lock open fail" >> "$LOG"; exit 1; }
if ! flock -n 9; then
    echo "[$(ts)] already running, skip" >> "$LOG"
    exit 0
fi

echo "[$(ts)] ===== mail_sync_cron start (dir=$SCRIPT_DIR) =====" >> "$LOG"

cd "$SCRIPT_DIR" || { echo "[$(ts)] cd fail: $SCRIPT_DIR" >> "$LOG"; exit 1; }

# ① 조직도 동기화 (신버전, 트랜잭션/로깅 포함)
"$PHP" mailUserDbData.php >> "$LOG" 2>&1
rc1=$?
echo "[$(ts)] (1) mailUserDbData.php done rc=$rc1" >> "$LOG"

# ② 기존 정책 mail_address 재계산(반영)
#    - 동기화가 성공했을 때만 진행(조직도가 깨진 채 mail_address 재계산 방지)
rc2=1
if [ "$rc1" -eq 0 ]; then
    "$PHP" fix_mailaddress.php apply >> "$LOG" 2>&1
    rc2=$?
    echo "[$(ts)] (2) fix_mailaddress.php apply done rc=$rc2" >> "$LOG"
else
    echo "[$(ts)] (2) skipped (org sync failed rc=$rc1)" >> "$LOG"
fi

# ③ 정책 테이블을 스캔서버로 복제(sync.sh) — 계산(①②)이 모두 성공했을 때만.
#    다중서버(스캔서버)로 MAIL_POLICY / CONDITION / MAILADDRESS 를 전송.
if [ "$rc1" -eq 0 ] && [ "$rc2" -eq 0 ]; then
    # SYNC_SH 미지정 시 스크립트와 같은 디렉터리의 sync.sh 사용 (kamco_dev 미사용)
    if [ -z "$SYNC_SH" ]; then
        SYNC_SH="$SCRIPT_DIR/sync.sh"
    fi
    if [ -n "$SYNC_SH" ] && [ -x "$SYNC_SH" ]; then
        "$SYNC_SH" >> "$LOG" 2>&1
        rc3=$?
        echo "[$(ts)] (3) sync.sh done rc=$rc3 ($SYNC_SH)" >> "$LOG"
    else
        echo "[$(ts)] (3) sync.sh 없음/미실행 — 다중서버 복제 skip" >> "$LOG"
    fi
else
    echo "[$(ts)] (3) skipped (calc failed rc1=$rc1 rc2=$rc2)" >> "$LOG"
fi

echo "[$(ts)] ===== mail_sync_cron end =====" >> "$LOG"
exit 0

# ------------------------------------------------------------------------------
# [설치 예시]
#   chmod +x mail_sync_cron.sh
#
#   (A) 매일 새벽 3시:
#       crontab -e
#       0 3 * * * /usr/local/apache/htdocs/mailfilter/mail_sync_cron.sh
#
#   (B) 6시간마다:
#       0 */6 * * * /usr/local/apache/htdocs/mailfilter/mail_sync_cron.sh
#
#   (C) /etc/cron.d/mail_sync (권장, 사용자/경로 명시):
#       0 3 * * * root /usr/local/apache/htdocs/mailfilter/mail_sync_cron.sh
#
#   PHP 경로가 다르면:  PHP=/usr/local/php/bin/php  로 크론 라인 앞에 지정하거나 위 변수 수정.
# ------------------------------------------------------------------------------
