#!/usr/bin/bash
#
# Backup uploads + seedb code → /var/www/backup/*.tar.gz
#
# Usage:
#   /var/www/html/backup_uploads_and_code.sh              # retention default 7 days
#   /var/www/html/backup_uploads_and_code.sh 14            # keep 14 days
#   /var/www/html/backup_uploads_and_code.sh -d 30         # keep 30 days
#   RETENTION_DAYS=10 /var/www/html/backup_uploads_and_code.sh
#
set -euo pipefail

# ---------- config ----------
BACKUP_ROOT="/var/www/backup"
UPLOADS_ROOT="/var/www/uploads"
CODE_ROOT="/var/www/html"
SEEDB_DIR="seedb"
LOG_FILE="/var/log/backup_uploads_and_code.log"

# โฟลเดอร์ uploads ที่จะ backup (ไม่รวม nas_share ของ dim)
UPLOAD_FOLDERS=(
  "ams"
  "barcodes"
  "dim"
  "iccard_data"
  "ums"
  "uptest"
  "wts"
)

# ค่า default จำนวนวันที่เก็บ backup (หมดอายุแล้วลบ)
DEFAULT_RETENTION_DAYS=7

# ---------- helpers ----------
log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}

die() {
  log "ERROR: $*"
  exit 1
}

usage() {
  cat <<EOF
Usage: $0 [-d DAYS] [DAYS]

  DAYS   จำนวนวันที่เก็บไฟล์ backup (ค่าเริ่มต้น: ${DEFAULT_RETENTION_DAYS})
         ไฟล์ที่เก่ากว่าจะถูกลบจาก ${BACKUP_ROOT} เท่านั้น

Examples:
  $0
  $0 14
  $0 -d 30
EOF
}

# ---------- parse retention ----------
RETENTION_DAYS="${RETENTION_DAYS:-$DEFAULT_RETENTION_DAYS}"

while [[ $# -gt 0 ]]; do
  case "$1" in
    -d|--days)
      [[ $# -ge 2 ]] || die "ต้องระบุจำนวนวันหลัง $1"
      RETENTION_DAYS="$2"
      shift 2
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      if [[ "$1" =~ ^[0-9]+$ ]]; then
        RETENTION_DAYS="$1"
        shift
      else
        die "อาร์กิวเมนต์ไม่รู้จัก: $1 (ใช้ -h เพื่อดูวิธีใช้)"
      fi
      ;;
  esac
done

if ! [[ "$RETENTION_DAYS" =~ ^[0-9]+$ ]] || [[ "$RETENTION_DAYS" -lt 1 ]]; then
  die "RETENTION_DAYS ต้องเป็นเลขจำนวนเต็ม >= 1 (ได้: $RETENTION_DAYS)"
fi

# ---------- start ----------
if [[ "$(id -u)" -ne 0 ]]; then
  log "คำเตือน: ไม่ได้รันเป็น root — อาจเขียนบาง path ไม่ได้"
fi

mkdir -p "$BACKUP_ROOT" || die "สร้าง $BACKUP_ROOT ไม่สำเร็จ"
[[ -d "$UPLOADS_ROOT" ]] || die "ไม่พบ $UPLOADS_ROOT"
[[ -d "$CODE_ROOT/$SEEDB_DIR" ]] || die "ไม่พบ $CODE_ROOT/$SEEDB_DIR"

STAMP="$(date '+%Y%m%d_%H%M%S')"
UPLOADS_ARCHIVE="${BACKUP_ROOT}/uploads_${STAMP}.tar.gz"
CODE_ARCHIVE="${BACKUP_ROOT}/seedb_${STAMP}.tar.gz"
TMP_LIST="$(mktemp)"

cleanup() {
  rm -f "$TMP_LIST"
}
trap cleanup EXIT

log "========== เริ่ม backup =========="
log "Backup dir     : $BACKUP_ROOT"
log "Retention days : $RETENTION_DAYS"
log "Uploads archive: $UPLOADS_ARCHIVE"
log "Code archive   : $CODE_ARCHIVE"

# ---------- build upload list (skip missing) ----------
EXISTING=()
for folder in "${UPLOAD_FOLDERS[@]}"; do
  if [[ -d "$UPLOADS_ROOT/$folder" ]]; then
    EXISTING+=("$folder")
  else
    log "ข้าม (ไม่พบโฟลเดอร์): $UPLOADS_ROOT/$folder"
  fi
done

[[ ${#EXISTING[@]} -gt 0 ]] || die "ไม่มีโฟลเดอร์ uploads ที่จะ backup"

# ---------- backups: uploads (exclude dim/nas_share) ----------
log "กำลังสร้าง archive uploads: ${EXISTING[*]} (exclude dim/nas_share)"
# --exclude อ้างอิง path ใน archive (หลัง -C)
tar -czf "$UPLOADS_ARCHIVE" \
  -C "$UPLOADS_ROOT" \
  --exclude='dim/nas_share' \
  --exclude='dim/nas_share/*' \
  "${EXISTING[@]}"
log "เสร็จ uploads: $(du -h "$UPLOADS_ARCHIVE" | awk '{print $1}')"

# ---------- backup: seedb code ----------
log "กำลังสร้าง archive code: $CODE_ROOT/$SEEDB_DIR"
tar -czf "$CODE_ARCHIVE" \
  -C "$CODE_ROOT" \
  "$SEEDB_DIR"
log "เสร็จ code: $(du -h "$CODE_ARCHIVE" | awk '{print $1}')"

# ---------- cleanup expired backups (only under BACKUP_ROOT) ----------
log "ลบ backup ที่เก่ากว่า ${RETENTION_DAYS} วัน ใน $BACKUP_ROOT"
DELETED=0
while IFS= read -r -d '' old; do
  log "ลบ: $old"
  rm -f "$old"
  DELETED=$((DELETED + 1))
done < <(find "$BACKUP_ROOT" -maxdepth 1 -type f \( -name 'uploads_*.tar.gz' -o -name 'seedb_*.tar.gz' \) -mtime "+${RETENTION_DAYS}" -print0 2>/dev/null)

log "ลบไฟล์หมดอายุแล้ว: $DELETED ไฟล์"
log "ไฟล์ใน $BACKUP_ROOT ขณะนี้:"
ls -lh "$BACKUP_ROOT" | tee -a "$LOG_FILE" || true

log "========== backup เสร็จสิ้น =========="
exit 0
