#!/bin/bash

# ============================================
# Script de Rollback Completo para cPanel
# ============================================
# Este script permite:
# 1. Eliminar cuenta cPanel existente
# 2. Crear nueva cuenta cPanel
# 3. Restaurar backup completo (BD + archivos)
# 4. Replicar la web tal como estaba
# ============================================

set -e

# Colores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# Configuración
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
BACKUP_BASE_DIR="${PROJECT_DIR}/storage/app/backups/daily"

# Verificar que se proporcionó el directorio de backup
if [ -z "$1" ]; then
    echo -e "${RED}❌ Error: Debe especificar el directorio de backup${NC}"
    echo ""
    echo "Uso: $0 <backup-directory> [--force]"
    echo ""
    echo "Ejemplo:"
    echo "  $0 storage/app/backups/daily/20240115_120000"
    echo ""
    echo "Backups disponibles:"
    ls -1td "${BACKUP_BASE_DIR}"/*/ 2>/dev/null | head -5 | while read dir; do
        echo "  - $(basename "$dir")"
    done
    exit 1
fi

BACKUP_DIR="$1"
FORCE="${2:-}"

# Verificar que el directorio de backup existe
if [ ! -d "${BACKUP_DIR}" ]; then
    echo -e "${RED}❌ Error: Directorio de backup no encontrado: ${BACKUP_DIR}${NC}"
    exit 1
fi

# Leer información del backup
if [ -f "${BACKUP_DIR}/backup-info.json" ]; then
    BACKUP_INFO=$(cat "${BACKUP_DIR}/backup-info.json")
    DB_NAME=$(echo "$BACKUP_INFO" | grep -o '"name": "[^"]*"' | cut -d'"' -f4)
    CPANEL_USER=$(echo "$BACKUP_INFO" | grep -o '"cpanel_user": "[^"]*"' | cut -d'"' -f4)
    CPANEL_DOMAIN=$(echo "$BACKUP_INFO" | grep -o '"cpanel_domain": "[^"]*"' | cut -d'"' -f4)
else
    echo -e "${YELLOW}⚠️  No se encontró backup-info.json, usando valores por defecto${NC}"
    DB_NAME="${DB_NAME:-$(grep DB_DATABASE "${PROJECT_DIR}/.env" | cut -d '=' -f2 | tr -d ' ')}"
    CPANEL_USER="${CPANEL_USER:-$(whoami)}"
    CPANEL_DOMAIN="${CPANEL_DOMAIN:-$(hostname)}"
fi

echo -e "${BLUE}============================================${NC}"
echo -e "${BLUE}🔄 PROCESO DE ROLLBACK${NC}"
echo -e "${BLUE}============================================${NC}"
echo ""
echo "📁 Backup: ${BACKUP_DIR}"
echo "👤 Usuario cPanel: ${CPANEL_USER}"
echo "🌐 Dominio: ${CPANEL_DOMAIN}"
echo "💾 Base de datos: ${DB_NAME}"
echo ""

# Confirmación
if [ "$FORCE" != "--force" ]; then
    read -p "¿Está seguro de continuar? Esto eliminará la cuenta cPanel actual. (yes/no): " confirm
    if [ "$confirm" != "yes" ]; then
        echo -e "${YELLOW}❌ Rollback cancelado${NC}"
        exit 0
    fi
fi

# ============================================
# PASO 1: BACKUP DE SEGURIDAD ANTES DE ROLLBACK
# ============================================
echo -e "${YELLOW}📦 Creando backup de seguridad antes del rollback...${NC}"
SAFETY_BACKUP_DIR="${BACKUP_BASE_DIR}/pre-rollback-$(date +%Y%m%d_%H%M%S)"
mkdir -p "${SAFETY_BACKUP_DIR}"

# Backup rápido de .env y configuraciones actuales
cp "${PROJECT_DIR}/.env" "${SAFETY_BACKUP_DIR}/.env" 2>/dev/null || true
cp "${PROJECT_DIR}/config/site.php" "${SAFETY_BACKUP_DIR}/site.php" 2>/dev/null || true
cp "${PROJECT_DIR}/config/cd-system.php" "${SAFETY_BACKUP_DIR}/cd-system.php" 2>/dev/null || true

echo -e "${GREEN}✅ Backup de seguridad creado: ${SAFETY_BACKUP_DIR}${NC}"
echo ""

# ============================================
# PASO 2: ELIMINAR CUENTA CPANEL (si es necesario)
# ============================================
echo -e "${YELLOW}🗑️  Eliminando cuenta cPanel...${NC}"

# NOTA: Esto requiere acceso WHM API o comandos de cPanel
# Ajustar según tu configuración específica

# Opción 1: Usando WHM API (requiere API token)
if [ ! -z "${WHM_API_TOKEN}" ] && [ ! -z "${WHM_API_URL}" ]; then
    echo "  Usando WHM API..."
    curl -X POST "${WHM_API_URL}/api/v1/accounts/terminate" \
        -H "Authorization: whm ${WHM_API_TOKEN}" \
        -H "Content-Type: application/json" \
        -d "{\"username\": \"${CPANEL_USER}\"}" || {
        echo -e "${YELLOW}⚠️  No se pudo eliminar cuenta vía API (puede que no exista)${NC}"
    }
else
    echo -e "${YELLOW}⚠️  Variables WHM_API_TOKEN y WHM_API_URL no configuradas${NC}"
    echo "  Saltando eliminación automática de cuenta cPanel"
    echo "  Por favor, elimine la cuenta manualmente desde WHM si es necesario"
fi

echo ""

# ============================================
# PASO 3: CREAR NUEVA CUENTA CPANEL (si es necesario)
# ============================================
echo -e "${YELLOW}➕ Creando nueva cuenta cPanel...${NC}"

if [ ! -z "${WHM_API_TOKEN}" ] && [ ! -z "${WHM_API_URL}" ]; then
    # Generar contraseña temporal
    NEW_PASSWORD=$(openssl rand -base64 32)
    
    curl -X POST "${WHM_API_URL}/api/v1/accounts/create" \
        -H "Authorization: whm ${WHM_API_TOKEN}" \
        -H "Content-Type: application/json" \
        -d "{
            \"username\": \"${CPANEL_USER}\",
            \"domain\": \"${CPANEL_DOMAIN}\",
            \"contactemail\": \"admin@${CPANEL_DOMAIN}\",
            \"plan\": \"default\",
            \"password\": \"${NEW_PASSWORD}\"
        }" || {
        echo -e "${YELLOW}⚠️  No se pudo crear cuenta vía API (puede que ya exista)${NC}"
    }
    
    echo -e "${GREEN}✅ Nueva cuenta creada${NC}"
    echo -e "${YELLOW}⚠️  Contraseña temporal guardada en: ${SAFETY_BACKUP_DIR}/password.txt${NC}"
    echo "${NEW_PASSWORD}" > "${SAFETY_BACKUP_DIR}/password.txt"
else
    echo -e "${YELLOW}⚠️  Variables WHM_API_TOKEN y WHM_API_URL no configuradas${NC}"
    echo "  Saltando creación automática de cuenta cPanel"
    echo "  Por favor, cree la cuenta manualmente desde WHM si es necesario"
fi

echo ""

# ============================================
# PASO 4: RESTAURAR BASE DE DATOS
# ============================================
echo -e "${YELLOW}💾 Restaurando base de datos...${NC}"

DB_BACKUP_FILE=$(find "${BACKUP_DIR}/database" -name "*.sql.gz" | head -1)

if [ -z "${DB_BACKUP_FILE}" ]; then
    echo -e "${RED}❌ No se encontró backup de base de datos${NC}"
    exit 1
fi

# Descomprimir y restaurar
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 ' ')}"
DB_HOST="${DB_HOST:-localhost}"

echo "  Restaurando desde: ${DB_BACKUP_FILE}"

# Descomprimir temporalmente
TEMP_SQL="/tmp/restore_${DB_NAME}_$(date +%s).sql"
gunzip -c "${DB_BACKUP_FILE}" > "${TEMP_SQL}"

# Restaurar
mysql -u "${DB_USER}" -p"${DB_PASS}" -h "${DB_HOST}" "${DB_NAME}" < "${TEMP_SQL}" || {
    echo -e "${RED}❌ Error al restaurar base de datos${NC}"
    rm -f "${TEMP_SQL}"
    exit 1
}

# Limpiar archivo temporal
rm -f "${TEMP_SQL}"

echo -e "${GREEN}✅ Base de datos restaurada${NC}"
echo ""

# ============================================
# PASO 5: RESTAURAR ARCHIVOS
# ============================================
echo -e "${YELLOW}📁 Restaurando archivos...${NC}"

# Restaurar configuración
if [ -f "${BACKUP_DIR}/config/.env" ]; then
    cp "${BACKUP_DIR}/config/.env" "${PROJECT_DIR}/.env"
    echo "  ✅ .env restaurado"
fi

if [ -f "${BACKUP_DIR}/config/site.php" ]; then
    cp "${BACKUP_DIR}/config/site.php" "${PROJECT_DIR}/config/site.php"
    echo "  ✅ config/site.php restaurado"
fi

if [ -f "${BACKUP_DIR}/config/cd-system.php" ]; then
    cp "${BACKUP_DIR}/config/cd-system.php" "${PROJECT_DIR}/config/cd-system.php"
    echo "  ✅ config/cd-system.php restaurado"
fi

# Restaurar archivos críticos
if [ -d "${BACKUP_DIR}/files" ]; then
    echo "  Restaurando archivos críticos..."
    rsync -av "${BACKUP_DIR}/files/" "${PROJECT_DIR}/" || {
        echo -e "${YELLOW}⚠️  Algunos archivos no se pudieron restaurar${NC}"
    }
fi

echo -e "${GREEN}✅ Archivos restaurados${NC}"
echo ""

# ============================================
# PASO 6: CONFIGURAR PERMISOS Y CACHE
# ============================================
echo -e "${YELLOW}⚙️  Configurando permisos y cache...${NC}"

cd "${PROJECT_DIR}"

# Permisos
chmod -R 755 storage bootstrap/cache 2>/dev/null || true
chown -R "${CPANEL_USER}:${CPANEL_USER}" storage bootstrap/cache 2>/dev/null || true

# Limpiar y regenerar cache
php artisan config:clear 2>/dev/null || true
php artisan cache:clear 2>/dev/null || true
php artisan route:clear 2>/dev/null || true
php artisan view:clear 2>/dev/null || true

# Regenerar cache
php artisan config:cache 2>/dev/null || true
php artisan route:cache 2>/dev/null || true

echo -e "${GREEN}✅ Permisos y cache configurados${NC}"
echo ""

# ============================================
# RESUMEN
# ============================================
echo -e "${GREEN}============================================${NC}"
echo -e "${GREEN}✅ ROLLBACK COMPLETADO${NC}"
echo -e "${GREEN}============================================${NC}"
echo ""
echo "📁 Backup restaurado: ${BACKUP_DIR}"
echo "💾 Base de datos: ${DB_NAME}"
echo "👤 Usuario: ${CPANEL_USER}"
echo "🌐 Dominio: ${CPANEL_DOMAIN}"
echo ""
echo -e "${YELLOW}⚠️  IMPORTANTE:${NC}"
echo "  1. Verifique que la aplicación funciona correctamente"
echo "  2. Ejecute el checklist Q/A: curl http://${CPANEL_DOMAIN}/cd-system/qa/results"
echo "  3. Revise los logs si hay problemas"
echo ""

exit 0

