#!/bin/bash
# ==========================================================
#  CyberTools Admin – Backup Manager (Aligned Engine)
#  Based on: your working v1.1.3 logic (functions OK) but
#  refactored to match admin-menu clean loop + screen model.
# ==========================================================

# ==========================================
# License enforcement trace
# ==========================================
echo "[TRACE] License gate check starting..."

if [[ "$0" == */bin/* ]]; then
  echo "[TRACE] Running from BIN (PRO mode)"

  if [ -f "/root/.cybertoolsadmin/.valid_hash" ]; then
    echo "[TRACE] License file FOUND"
  else
    echo "[TRACE] License file MISSING"
    echo
    echo "❌ License required to use backup features."
    echo "Please install or activate a valid CyberToolsAdmin license."
    echo
    read -rp "Press Enter to return..."
    exit 1
  fi

else
  echo "[TRACE] Running from SRC (DEV mode) — license check bypassed"
fi





set -u

# ─────────── 1) COLORS (keep simple; safe if unset) ───────────
RESET="\033[0m"; BOLD="\033[1m"
RED="\033[1;31m"; GREEN="\033[1;32m"; YELLOW="\033[1;33m"
CYAN="\033[1;36m"

# ─────────── 2) PATHS / DEFAULTS ───────────
BASE_DIR="/root/cybertoolsadmin"
CONFIG="${BASE_DIR}/config.conf"

LOGFILE_DEFAULT="/var/log/cybertools-backup.log"
COUNTFILE_DEFAULT="/var/log/cybertools-counts.log"

LOGFILE="${LOGFILE:-$LOGFILE_DEFAULT}"
COUNTFILE="${COUNTFILE:-$COUNTFILE_DEFAULT}"

# This script’s resolved path (if readlink available)
SCRIPT_PATH="${0}"
if command -v readlink >/dev/null 2>&1; then
  SCRIPT_PATH="$(readlink -f "$0" 2>/dev/null || echo "$0")"
fi

# DEV/PROD detection:
# - prefer DEV_MODE=1 if set (matches admin-menu)
# - fallback: if path contains /src/ treat as DEV
MODE="PROD"
if [ "${DEV_MODE:-0}" = "1" ] || [[ "$SCRIPT_PATH" == */src/* ]]; then
  MODE="DEV"
fi

# Heuristic for compiled vs script
EXEC_TYPE="SCRIPT"
if [[ "$SCRIPT_PATH" != *.sh ]]; then
  EXEC_TYPE="COMPILED"
fi

# ─────────── 3) LICENSE CHECK (non-fatal in dev) ───────────
run_license_check() {
  # Keep your approach, but make it non-blocking if module missing
  if [ -f "${BASE_DIR}/license-check.sh" ]; then
    # shellcheck disable=SC1090
    source "${BASE_DIR}/license-check.sh"
    check_license
  else
    echo "⚠️ Event Bypass — License enforcement skipped (DEV/TEST mode)"
    # echo "⚠️ License check module not found — continuing."
  fi
}

# In your original: run_license_check was always invoked.
# Keep behavior, but do not hard-exit if it prints warnings.
run_license_check


# License enforcement – production only
if [[ "$0" == */src/* ]]; then
  if [ ! -f "/root/.cybertoolsadmin/.valid_hash" ]; then
    echo "❌ License required to use this feature."
    exit 1
  fi
fi

# ─────────── 4) LOAD CONFIG ───────────
if [ -f "$CONFIG" ]; then
  # shellcheck disable=SC1090
  source "$CONFIG"
else
  echo "⚠️ Config not found at $CONFIG"
  exit 1
fi

# Version metadata (from config with fallback)
VERSION_BACKUP_DEFAULT="1.1.3"
VERSION_BACKUP="${VERSION_BACKUP:-$VERSION_BACKUP_DEFAULT}"

# ─────────── 5) SANITIZE PATHS / ENSURE DIRS ───────────
PROJECTDIR="$(echo "${PROJECTDIR:-}" | tr -d '\r')"
BACKUPDIR="$(echo "${BACKUPDIR:-}" | tr -d '\r')"

if [ -z "${PROJECTDIR}" ] || [ -z "${BACKUPDIR}" ]; then
  echo "⚠️ PROJECTDIR or BACKUPDIR is empty. Edit: $CONFIG"
  exit 1
fi

mkdir -p "$BACKUPDIR" || {
  echo "⚠️ Could not create BACKUPDIR: $BACKUPDIR"
  exit 1
}

# Ensure log dir exists
mkdir -p "$(dirname "$LOGFILE")" 2>/dev/null || true
mkdir -p "$(dirname "$COUNTFILE")" 2>/dev/null || true

# ─────────── 6) CLEAR SCREEN POLICY ───────────
soft_clear() { tput clear 2>/dev/null || printf '\033[2J\033[H'; }

# ─────────── 7) UTILITIES ───────────
show_footer() {
  local start=$1
  local end
  end=$(date +%s)
  local duration=$((end - start))
  echo ""
  echo "✅ Operation complete in $((duration / 60))m $((duration % 60))s"
  echo "📘 Log: $LOGFILE"
  echo ""
}

pause() { read -rp "Press Enter..." _; }

# ─────────── 8) STATUS (NO clear inside) ───────────
show_status_block() {
  echo -e "${BOLD}=== CyberTools Admin Backup – v${VERSION_BACKUP} ===${RESET}"
  echo -e "Run Mode : ${BOLD}${MODE}${RESET}    Type: ${BOLD}${EXEC_TYPE}${RESET}"
  echo -e "Script   : ${BOLD}${SCRIPT_PATH}${RESET}"
  echo ""

  # Last backups (your original logic, but no clears)
  local last_proj last_sys last_cyber
  last_proj=$(ls -t "$BACKUPDIR"/sealproven-saas-backup-*.tar.gz 2>/dev/null | head -1)
  last_sys=$(ls -t "$BACKUPDIR"/system-backup-*.tar.gz 2>/dev/null | head -1)
  last_cyber=$(ls -dt /home/backup/*/ 2>/dev/null | head -1)

  echo -e "${BOLD}=== Backup Status ===${RESET}"
  [ -n "$last_proj" ] && echo "Last Project Backup : $last_proj" || echo "Last Project Backup : None"
  [ -n "$last_sys" ] && echo "Last System Backup  : $last_sys" || echo "Last System Backup  : None"
  [ -n "$last_cyber" ] && echo "Last CyberPanel Folder: $last_cyber" || echo "Last CyberPanel Folder: None"
  echo ""

  # Persistent counters (kept)
  local proj_total sys_total cyber_total remote_total
  if [ -f "$COUNTFILE" ]; then
    proj_total=$(grep -c '^project' "$COUNTFILE" 2>/dev/null || echo 0)
    sys_total=$(grep -c '^system' "$COUNTFILE" 2>/dev/null || echo 0)
  else
    proj_total=0
    sys_total=0
  fi

  cyber_total=$(ls -d /home/backup/*/ 2>/dev/null | wc -l | tr -d ' ')
  remote_total=0

  echo -e "${BOLD}=== Totals ===${RESET}"
  echo "Total Project Archives  : $proj_total"
  echo "Total System Archives   : $sys_total"
  echo "Total CyberPanel Folders: $cyber_total"
  echo "Total Remote Syncs      : $remote_total"
  echo ""

  echo -e "${BOLD}=== Disk Usage Summary ===${RESET}"
  df -h | grep '/dev/vda2' || df -h | head -n 10
  echo ""

  echo -e "${BOLD}=== Notes ===${RESET}"
  echo " - Edit $CONFIG to set PROJECTDIR and BACKUPDIR"
  echo " - Email notifications after backup: Coming Soon"
  echo " - Remote storage (Google Drive, S3, SFTP): Coming Soon"
  echo " - System Backup = captures /home, /etc, /root, CyberPanel configs, and DBs"
  echo ""
}

# ─────────── 9) TOOL RESOLUTION (for restore) ───────────
resolve_tool() {
  local tool="$1"

  # DEV → src
  if [ "${DEV_MODE:-0}" = "1" ]; then
    if [ -x "$BASE_DIR/src/${tool}.sh" ]; then
      echo "$BASE_DIR/src/${tool}.sh"
      return 0
    fi
  fi

  # PROD → bin
  if [ -x "$BASE_DIR/bin/$tool" ]; then
    echo "$BASE_DIR/bin/$tool"
    return 0
  fi

  # Legacy fallback (your older layout)
  if [ -x "$BASE_DIR/$tool" ]; then
    echo "$BASE_DIR/$tool"
    return 0
  fi

  return 1
}

run_tool() {
  local tool_path="$1"
  if [ -z "$tool_path" ] || [ ! -e "$tool_path" ]; then
    return 1
  fi

  # If ELF, execute directly; else run via bash
  if file "$tool_path" 2>/dev/null | grep -qi 'ELF'; then
    "$tool_path"
  else
    bash "$tool_path"
  fi
}

# ─────────── 10) MENU LOOP ───────────
main_menu() {
  local first_run="yes"
  local MENU_LOOP_COUNT=0

  while true; do
    if [ "$first_run" = "yes" ]; then
      first_run="no"
    else
      soft_clear
    fi

    MENU_LOOP_COUNT=$((MENU_LOOP_COUNT + 1))

    # Header + status (single pass)
    show_status_block

    # DEV banner
    if [ "${MODE}" = "DEV" ]; then
      echo -e "${CYAN}[DEV] Menu loop count: ${MENU_LOOP_COUNT}${RESET}"
      echo ""
    fi

    echo -e "${BOLD}=== 🛠️ Admin Backup – CyberPanel & Project Backup Tools ===${RESET}"
    echo "1) View cron jobs"
    echo "2) Check last 100 backup logs"
    echo "3) Show backup folder contents"
    echo "4) Run manual backup (CyberPanel CLI)"
    echo "5) Backup Custom Project Directory ($PROJECTDIR)"
    echo "6) Restore a previous project backup - Beta 1.0"
    echo "7) Push backups to remote (Coming Soon)"
    echo "8) View backup history (Coming Soon)"
    echo "9) Check CyberPanel Logs"
    echo "10) System Backup (Recommended)"
    echo ""
    echo "                     X) Exit to Main Menu"
    echo ""

    read -rp "Choose an option: " choice

    case "$choice" in
      1)
        echo "🕒 Cron Jobs:"
        crontab -l || echo "No cron jobs found."
        pause
        ;;
      2)
        echo "📜 Last 100 log entries:"
        tail -n 100 "$LOGFILE" 2>/dev/null || echo "No backup log found."
        pause
        ;;
      3)
        echo "📂 Contents of $BACKUPDIR:"
        ls -lh "$BACKUPDIR" 2>/dev/null || echo "Could not list $BACKUPDIR"
        pause
        ;;
      4)
        echo "⚙️ Starting CyberPanel backup..."
        if [ -n "${PROJECTDOMAIN:-}" ]; then
          echo "→ Backing up domain: $PROJECTDOMAIN"
          /usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/backupUtilities.py backup "$PROJECTDOMAIN"
        else
          echo "→ No domain set in config; running full backup for all sites."
          /usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/backupUtilities.py backupAll
        fi
        echo "$(date) - CyberPanel backup executed" >> "$LOGFILE"
        echo "✅ CyberPanel backup completed (check CyberPanel UI for results)."
        pause
        ;;
      5)
        echo "📦 Project Backup ($PROJECTDIR)"
        read -rp "Run (F)ull backup or (S)imulate only? " mode
        start=$(date +%s)

        if [[ "$mode" =~ [Ss] ]]; then
          echo "🔎 Simulating project backup (listing files)..."
          tar -tvf <(tar -cf - -C "$PROJECTDIR" . 2>/dev/null) || true
          echo "✅ Simulation complete (no archive created)."
        else
          fname="$BACKUPDIR/sealproven-saas-backup-$(date +%Y%m%d_%H%M%S).tar.gz"
          if tar -czf "$fname" -C "$PROJECTDIR" .; then
            echo "✅ Backup saved: $fname"
            echo "$(date) - Project backup created: $fname" >> "$LOGFILE"
            echo "project" >> "$COUNTFILE"
          else
            echo "⚠️ Project backup failed. Check: $LOGFILE"
          fi
        fi

        show_footer "$start"
        pause
        ;;
      6)
        echo "♻️ Restore Function - Beta"

        # TOOL="$(resolve_tool admin-restore 2>/dev/null || true)"
        if [[ "$SCRIPT_PATH" == */src/* || "${DEV_MODE:-0}" = "1" ]]; then
          TOOL="/root/cybertoolsadmin/src/admin-restore.sh"
        else
          TOOL="$(resolve_tool admin-restore 2>/dev/null || true)"
        fi

        if [ -n "${TOOL:-}" ] && [ -x "$TOOL" ]; then
          echo "[INFO] Invoking restore tool:"
          echo "       Path: $TOOL"
          run_tool "$TOOL" || true
        else
          echo "⚠️ Restore tool not found (admin-restore)."
          echo "   Expected in /src (DEV) or /bin (PROD)"
        fi

        pause
        ;;
      7)
        echo "🌐 Remote Storage Sync (Coming Soon)"
        pause
        ;;
      8)
        echo "📜 Backup History (Coming Soon)"
        pause
        ;;
      9)
        echo "🔍 Checking CyberPanel logs..."
        tail -n 100 /usr/local/CyberCP/logs/error.log 2>/dev/null || echo "No CyberPanel log found."
        pause
        ;;
      10)
        echo "📦 System Backup (Recommended)"
        echo "This includes /home, /etc, /root, CyberPanel configs, and database dumps."
        read -rp "Run (F)ull backup or (S)imulate only? " mode
        start=$(date +%s)

        if [[ "$mode" =~ [Ss] ]]; then
          echo "🔎 Simulating system backup (listing files)..."
          tar -tvf <(tar -cf - /home /etc /root /usr/local/CyberCP 2>/dev/null) || true
          echo "✅ Simulation complete (no archive created)."
        else
          fname="$BACKUPDIR/system-backup-$(date +%Y%m%d_%H%M%S).tar.gz"
          if tar -czf "$fname" /home /etc /root /usr/local/CyberCP 2>>"$LOGFILE"; then
            echo "✅ System backup saved: $fname"
            echo "$(date) - System backup created: $fname" >> "$LOGFILE"
            echo "system" >> "$COUNTFILE"
          else
            echo "⚠️ System backup failed. Check: $LOGFILE"
          fi
        fi

        show_footer "$start"
        pause
        ;;
      [Xx])
        echo "Returning to main menu..."
        sleep 1
        exit 0
        ;;
      *)
        echo "Invalid option"
        sleep 1
        ;;
    esac
  done
}

# ─────────── 11) START ───────────
main_menu
