#!/bin/sh
# =============================================================
#  MonitorPing — Backup Diário Completo
#  Roda 1x por dia via cron_backup + suporte FTP e Google Drive
# =============================================================

set -e

BACKUP_DIR="/opt/backups/monitorping"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_NAME="monitorping_backup_${DATE}"
WORK_DIR="/tmp/${BACKUP_NAME}"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] =========================================="
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Iniciando backup MonitorPing..."
echo "[$(date '+%Y-%m-%d %H:%M:%S')] =========================================="

mkdir -p "${BACKUP_DIR}"
mkdir -p "${WORK_DIR}"

# Carrega configurações geradas pelo admin (FTP/GDrive)
BACKUP_FTP_ENABLED="0"
BACKUP_FTP_HOST=""
BACKUP_FTP_PORT="21"
BACKUP_FTP_USER=""
BACKUP_FTP_PASS=""
BACKUP_FTP_PATH="/backups"
BACKUP_GDRIVE_ENABLED="0"
BACKUP_GDRIVE_FOLDER="MonitorPing-Backups"
BACKUP_GDRIVE_SA_JSON=""

CONFIG_FILE="${BACKUP_DIR}/.backup_config.sh"
if [ -f "${CONFIG_FILE}" ]; then
    . "${CONFIG_FILE}"
fi

# ── 1. Dump do banco ────────────────────────────────────────────
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [1/4] Dump do banco de dados..."

PGPASSWORD="${DB_PASS}" pg_dump \
    -h "${DB_HOST}" \
    -U "${DB_USER}" \
    -d "${DB_NAME}" \
    --no-password \
    --format=custom \
    --compress=9 \
    --file="${WORK_DIR}/database.dump" 2>&1 | tail -3

echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✓ Dump concluído."

# ── 2. Arquivos da aplicação ────────────────────────────────────
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [2/4] Backup dos arquivos..."

tar -czf "${WORK_DIR}/app_files.tar.gz" \
    --exclude="/var/www/html/.git" \
    --exclude="/var/www/html/node_modules" \
    /var/www/html 2>/dev/null || true

echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✓ Arquivos salvos."

# ── 3. Manifesto ────────────────────────────────────────────────
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [3/4] Gerando manifesto..."

DB_SIZE=$(du -sh "${WORK_DIR}/database.dump" 2>/dev/null | cut -f1)
APP_SIZE=$(du -sh "${WORK_DIR}/app_files.tar.gz" 2>/dev/null | cut -f1)

cat > "${WORK_DIR}/manifest.txt" << EOF
========================================
 MonitorPing — Backup Manifest
========================================
Data/Hora : ${DATE}
Banco     : ${DB_NAME} @ ${DB_HOST}

Arquivos:
  database.dump    — ${DB_SIZE}  (pg_dump formato custom)
  app_files.tar.gz — ${APP_SIZE} (arquivos /var/www/html)

Restauração do banco:
  pg_restore -h HOST -U USUARIO -d DATABASE --clean database.dump
========================================
EOF

echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✓ Manifesto gerado."

# ── 4. Pacote final ─────────────────────────────────────────────
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [4/4] Compactando..."

tar -czf "${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" -C /tmp "${BACKUP_NAME}"
FINAL_SIZE=$(du -sh "${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" | cut -f1)
FINAL_FILE="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz"

rm -rf "${WORK_DIR}"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✓ ${BACKUP_NAME}.tar.gz (${FINAL_SIZE})"

# ── Rotação: mantém 7 dias ──────────────────────────────────────
find "${BACKUP_DIR}" -name "monitorping_backup_*.tar.gz" -mtime +7 -delete 2>/dev/null || true

# ── Upload FTP ──────────────────────────────────────────────────
if [ "${BACKUP_FTP_ENABLED}" = "1" ] && [ -n "${BACKUP_FTP_HOST}" ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Enviando para FTP ${BACKUP_FTP_HOST}..."
    FTP_URL="ftp://${BACKUP_FTP_HOST}:${BACKUP_FTP_PORT}${BACKUP_FTP_PATH}/${BACKUP_NAME}.tar.gz"
    if curl -s --connect-timeout 30 --max-time 300 \
        -T "${FINAL_FILE}" \
        --user "${BACKUP_FTP_USER}:${BACKUP_FTP_PASS}" \
        "${FTP_URL}"; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✓ FTP: upload concluído."
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✗ FTP: falha no upload (código $?)."
    fi
fi

# ── Upload Google Drive ─────────────────────────────────────────
if [ "${BACKUP_GDRIVE_ENABLED}" = "1" ] && [ -n "${BACKUP_GDRIVE_SA_JSON}" ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Enviando para Google Drive..."

    # Instala rclone se necessário
    if ! command -v rclone >/dev/null 2>&1; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] Instalando rclone..."
        curl -s https://rclone.org/install.sh | bash >/dev/null 2>&1 || true
    fi

    if command -v rclone >/dev/null 2>&1; then
        # Decodifica e salva o JSON da conta de serviço
        SA_FILE="/tmp/gdrive_sa_${DATE}.json"
        echo "${BACKUP_GDRIVE_SA_JSON}" | base64 -d > "${SA_FILE}"

        # Cria config rclone temporária
        RCLONE_CONFIG="/tmp/rclone_${DATE}.conf"
        cat > "${RCLONE_CONFIG}" << RCLONE_EOF
[gdrive]
type = drive
service_account_file = ${SA_FILE}
RCLONE_EOF

        # Envia o arquivo
        if rclone --config "${RCLONE_CONFIG}" copy \
            "${FINAL_FILE}" \
            "gdrive:${BACKUP_GDRIVE_FOLDER}/" \
            --timeout 5m 2>&1; then
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✓ Google Drive: upload concluído."
        else
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✗ Google Drive: falha no upload."
        fi

        # Remove arquivos temporários
        rm -f "${SA_FILE}" "${RCLONE_CONFIG}"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✗ rclone não disponível. Pulando Google Drive."
    fi
fi

# ── Resumo ──────────────────────────────────────────────────────
echo "[$(date '+%Y-%m-%d %H:%M:%S')] =========================================="
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Backup concluído com sucesso!"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Backups em ${BACKUP_DIR}:"
ls -lh "${BACKUP_DIR}/" | grep "monitorping_backup_" | awk '{print "  " $NF " (" $5 ")"}' || true
echo "[$(date '+%Y-%m-%d %H:%M:%S')] =========================================="
