#!/bin/bash

# ============================================
# Script de Backup Diario para cPanel/WHM
# ============================================
# Este script crea backups diarios completos de:
# - Base de datos MySQL
# - Archivos del proyecto
# - Configuraciones
# ============================================

set -e  # Salir si hay algún error

# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Configuración
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
BACKUP_BASE_DIR="${PROJECT_DIR}/storage/app/backups/daily"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="${BACKUP_BASE_DIR}/${TIMESTAMP}"

# Configuración de cPanel (ajustar según tu entorno)
CPANEL_USER="${CPANEL_USER:-$(whoami)}"
CPANEL_DOMAIN="${CPANEL_DOMAIN:-$(hostname)}"
DB_NAME="${DB_NAME:-$(grep DB_DATABASE "${PROJECT_DIR}/.env" | cut -d '=' -f2 | tr -d ' ')}"
DB_USER="${DB_USER:-$(grep DB_USERNAME "${PROJECT_DIR}/.env" | cut -d '=' -f2 | tr -d ' ')}"
DB_PASS="${DB_PASS:-$(grep DB_PASSWORD "${PROJECT_DIR}/.env" | cut -d '=' -f2 | tr -d ' ')}"

# Crear directorio de backup
mkdir -p "${BACKUP_DIR}"
mkdir -p "${BACKUP_DIR}/database"
mkdir -p "${BACKUP_DIR}/files"
mkdir -p "${BACKUP_DIR}/config"

echo -e "${GREEN}📦 Iniciando backup diario...${NC}"
echo "📁 Directorio: ${BACKUP_DIR}"
echo ""

# ============================================
# 1. BACKUP DE BASE DE DATOS
# ============================================
echo -e "${YELLOW}💾 Respaldando base de datos...${NC}"

DB_BACKUP_FILE="${BACKUP_DIR}/database/${DB_NAME}_${TIMESTAMP}.sql"

# Usar mysqldump si está disponible
if command -v mysqldump &> /dev/null; then
    mysqldump -u "${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" > "${DB_BACKUP_FILE}" 2>/dev/null || {
        echo -e "${RED}❌ Error al hacer backup de la base de datos${NC}"
        exit 1
    }
    
    # Comprimir backup de BD
    gzip -f "${DB_BACKUP_FILE}"
    echo -e "${GREEN}✅ Base de datos respaldada: ${DB_BACKUP_FILE}.gz${NC}"
else
    echo -e "${YELLOW}⚠️  mysqldump no encontrado, usando método alternativo${NC}"
    
    # Método alternativo usando cPanel API o php
    php "${SCRIPT_DIR}/backup-database.php" \
        --db-name="${DB_NAME}" \
        --db-user="${DB_USER}" \
        --db-pass="${DB_PASS}" \
        --output="${DB_BACKUP_FILE}.gz" || {
        echo -e "${RED}❌ Error al hacer backup de la base de datos${NC}"
        exit 1
    }
    echo -e "${GREEN}✅ Base de datos respaldada: ${DB_BACKUP_FILE}.gz${NC}"
fi

echo ""

# ============================================
# 2. BACKUP DE ARCHIVOS CRÍTICOS
# ============================================
echo -e "${YELLOW}📁 Respaldando archivos críticos...${NC}"

# Archivos de configuración
cp "${PROJECT_DIR}/.env" "${BACKUP_DIR}/config/.env" 2>/dev/null || echo -e "${YELLOW}⚠️  .env no encontrado${NC}"
cp "${PROJECT_DIR}/config/site.php" "${BACKUP_DIR}/config/site.php" 2>/dev/null || true
cp "${PROJECT_DIR}/config/cd-system.php" "${BACKUP_DIR}/config/cd-system.php" 2>/dev/null || true

# Directorios críticos
CRITICAL_DIRS=(
    "storage/app/public"
    "public/cd-project/img/logos"
    "public/cd-project/img/favicon"
    "public/cd-project/assets"
    "database/seeders/project-data"
)

for dir in "${CRITICAL_DIRS[@]}"; do
    if [ -d "${PROJECT_DIR}/${dir}" ]; then
        echo "  📦 Copiando: ${dir}"
        mkdir -p "${BACKUP_DIR}/files/$(dirname "${dir}")"
        cp -r "${PROJECT_DIR}/${dir}" "${BACKUP_DIR}/files/${dir}" 2>/dev/null || true
    fi
done

echo -e "${GREEN}✅ Archivos críticos respaldados${NC}"
echo ""

# ============================================
# 3. BACKUP COMPLETO (opcional, comentado por defecto)
# ============================================
# Descomentar si necesitas backup completo del proyecto
# echo -e "${YELLOW}📦 Creando backup completo del proyecto...${NC}"
# tar -czf "${BACKUP_DIR}/full-backup.tar.gz" \
#     --exclude='node_modules' \
#     --exclude='vendor' \
#     --exclude='.git' \
#     --exclude='storage/logs/*' \
#     --exclude='storage/framework/cache/*' \
#     --exclude='storage/framework/sessions/*' \
#     --exclude='storage/framework/views/*' \
#     -C "${PROJECT_DIR}" . || {
#     echo -e "${RED}❌ Error al crear backup completo${NC}"
# }
# echo -e "${GREEN}✅ Backup completo creado${NC}"
# echo ""

# ============================================
# 4. CREAR ARCHIVO DE INFORMACIÓN
# ============================================
INFO_FILE="${BACKUP_DIR}/backup-info.json"
cat > "${INFO_FILE}" <<EOF
{
    "timestamp": "${TIMESTAMP}",
    "date": "$(date -Iseconds)",
    "cpanel_user": "${CPANEL_USER}",
    "cpanel_domain": "${CPANEL_DOMAIN}",
    "database": {
        "name": "${DB_NAME}",
        "backup_file": "database/${DB_NAME}_${TIMESTAMP}.sql.gz"
    },
    "backup_type": "daily",
    "version": "$(cd "${PROJECT_DIR}" && git rev-parse HEAD 2>/dev/null || echo 'unknown')",
    "size": {
        "database": "$(du -sh "${BACKUP_DIR}/database" | cut -f1)",
        "files": "$(du -sh "${BACKUP_DIR}/files" | cut -f1)",
        "total": "$(du -sh "${BACKUP_DIR}" | cut -f1)"
    }
}
EOF

echo -e "${GREEN}✅ Información de backup guardada${NC}"
echo ""

# ============================================
# 5. LIMPIAR BACKUPS ANTIGUOS (mantener últimos 30 días)
# ============================================
echo -e "${YELLOW}🧹 Limpiando backups antiguos (manteniendo últimos 30 días)...${NC}"
find "${BACKUP_BASE_DIR}" -type d -name "20*" -mtime +30 -exec rm -rf {} \; 2>/dev/null || true
echo -e "${GREEN}✅ Limpieza completada${NC}"
echo ""

# ============================================
# RESUMEN
# ============================================
echo -e "${GREEN}${GREEN}============================================${NC}"
echo -e "${GREEN}📊 RESUMEN DEL BACKUP${NC}"
echo -e "${GREEN}============================================${NC}"
echo ""
echo "📁 Directorio: ${BACKUP_DIR}"
echo "💾 Base de datos: ${DB_NAME}_${TIMESTAMP}.sql.gz"
echo "📦 Archivos: $(du -sh "${BACKUP_DIR}/files" | cut -f1)"
echo "💿 Tamaño total: $(du -sh "${BACKUP_DIR}" | cut -f1)"
echo ""
echo -e "${GREEN}✅ Backup completado exitosamente${NC}"

# Opcional: Enviar notificación por email o webhook
# curl -X POST "https://tu-webhook.com/backup-completed" \
#     -H "Content-Type: application/json" \
#     -d "{\"status\": \"success\", \"backup_dir\": \"${BACKUP_DIR}\"}"

exit 0

