#!/bin/bash

# ==============================================================================
# Script para sincronizar base de datos desde Don Web a DDEV local
# ==============================================================================

# Detener el script ante cualquier error
set -e

# --- CONFIGURACIÓN ---
# Obtener la ruta del directorio del script para localizar la raíz del proyecto
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"

# Función para cargar variables desde un archivo .env
load_env() {
    local env_file="$1"
    if [ -f "$env_file" ]; then
        while IFS= read -r line || [ -n "$line" ]; do
            # Limpiar espacios en blanco al principio y final
            line=$(echo "$line" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
            
            # Ignorar comentarios y líneas vacías
            [[ "$line" =~ ^# ]] && continue
            [[ -z "$line" ]] && continue
            
            # Extraer clave y valor
            if [[ "$line" =~ ^([A-Za-z0-9_]+)=(.*)$ ]]; then
                key="${BASH_REMATCH[1]}"
                val="${BASH_REMATCH[2]}"
                
                # Quitar comillas externas (simples o dobles)
                val="${val#\"}"
                val="${val%\"}"
                val="${val#\'}"
                val="${val%\'}"
                
                # Expandir $HOME o ~ si están al principio del valor
                if [[ "$val" =~ ^\$HOME(/.*)?$ ]]; then
                    val="${HOME}${BASH_REMATCH[1]}"
                elif [[ "$val" =~ ^\~(/.*)?$ ]]; then
                    val="${HOME}${BASH_REMATCH[1]}"
                fi
                
                export "$key"="$val"
            fi
        done < "$env_file"
    fi
}

# Cargar archivos de configuración
load_env "$PROJECT_ROOT/.env"
load_env "$PROJECT_ROOT/.env.local"

# Asignar variables desde el entorno o valores por defecto
REMOTE_USER="${SYNC_REMOTE_USER}"
REMOTE_HOST="${SYNC_REMOTE_HOST}"
REMOTE_PORT="${SYNC_REMOTE_PORT:-22}"
SSH_KEY="${SYNC_SSH_KEY}"
REMOTE_PASS="${SYNC_REMOTE_PASS}"
DB_NAME="${SYNC_DB_NAME}"
BACKUP_DIR="${SYNC_BACKUP_DIR}"

# Construir argumentos de SCP
SCP_ARGS=(-P "$REMOTE_PORT")
if [ -n "$SSH_KEY" ] && [ -f "$SSH_KEY" ]; then
    SCP_ARGS+=(-i "$SSH_KEY")
fi

# Permite pasar una fecha específica como argumento (ej: ./sync_db.sh 2026-07-06)
# Por defecto usa la fecha de hoy
SYNC_DATE="${1:-$(date +%F)}"

FILENAME="${SYNC_DATE}_${DB_NAME}.sql.gz"
REMOTE_DUMP_PATH="${BACKUP_DIR}/${FILENAME}"

# Ruta local temporal donde guardar el dump descargado
LOCAL_DUMP_DIR="${PROJECT_ROOT}/var/tmp"
LOCAL_DUMP_PATH="${LOCAL_DUMP_DIR}/${FILENAME}"
# ---------------------

# Colores para salida en consola
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# Función para ejecutar SCP (usando sshpass si REMOTE_PASS está definido)
run_scp() {
    local src="$1"
    local dest="$2"
    
    if [ -n "$REMOTE_PASS" ]; then
        if command -v sshpass >/dev/null 2>&1; then
            sshpass -p "$REMOTE_PASS" scp "${SCP_ARGS[@]}" "$src" "$dest"
        else
            echo -e "${YELLOW}Advertencia: SYNC_REMOTE_PASS está definida pero 'sshpass' no está instalado.${NC}"
            echo -e "Para evitar la petición manual de contraseña, puedes instalarlo usando: ${BLUE}sudo apt install sshpass${NC}"
            echo -e "Intentando scp normal (te pedirá la contraseña manualmente)..."
            scp "${SCP_ARGS[@]}" "$src" "$dest"
        fi
    else
        scp "${SCP_ARGS[@]}" "$src" "$dest"
    fi
}

echo -e "${BLUE}=== Iniciando sincronización de Base de Datos ===${NC}"

# 1. Validaciones previas
if [ -z "$REMOTE_USER" ] || [ -z "$REMOTE_HOST" ] || [ -z "$DB_NAME" ] || [ -z "$BACKUP_DIR" ]; then
    echo -e "${RED}Error: Faltan variables de configuración para la sincronización.${NC}"
    echo -e "Asegúrate de definir SYNC_REMOTE_USER, SYNC_REMOTE_HOST, SYNC_DB_NAME y SYNC_BACKUP_DIR en tu archivo .env.local.${NC}"
    exit 1
fi

# Verificar si DDEV está corriendo
if ! ddev describe >/dev/null 2>&1; then
    echo -e "${YELLOW}Advertencia: DDEV no parece estar corriendo. Iniciando DDEV...${NC}"
    ddev start
fi

# Asegurar que el directorio local existe
mkdir -p "$LOCAL_DUMP_DIR"

# 2. Conectarse y descargar el dump
echo -e "${BLUE}1. Descargando dump diario para la fecha: ${SYNC_DATE}...${NC}"
echo -e "Archivo remoto: ${REMOTE_DUMP_PATH}"
echo -e "Ejecutando SCP..."

# Intentamos descargar. Desactivamos la salida de error estándar para que no se ensucie la consola si falla el primer intento.
if ! run_scp "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DUMP_PATH}" "$LOCAL_DUMP_PATH" 2>/dev/null; then
    echo -e "${YELLOW}Advertencia: No se encontró el dump del ${SYNC_DATE}. Intentando con el día anterior...${NC}"
    
    # Calcular fecha del día anterior
    YESTERDAY_DATE=$(date -d "$SYNC_DATE - 1 day" +%F)
    FILENAME="${YESTERDAY_DATE}_${DB_NAME}.sql.gz"
    REMOTE_DUMP_PATH="${BACKUP_DIR}/${FILENAME}"
    LOCAL_DUMP_PATH="${LOCAL_DUMP_DIR}/${FILENAME}"
    
    echo -e "${BLUE}Descargando dump diario para la fecha: ${YESTERDAY_DATE}...${NC}"
    echo -e "Archivo remoto: ${REMOTE_DUMP_PATH}"
    echo -e "Ejecutando SCP..."
    run_scp "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DUMP_PATH}" "$LOCAL_DUMP_PATH"
fi


echo -e "${GREEN}✔ Descarga completada con éxito.${NC}"

# 3. Importar dump en DDEV
echo -e "${BLUE}2. Importando dump en DDEV...${NC}"
if [ -f "$LOCAL_DUMP_PATH" ]; then
    ddev import-db --src="$LOCAL_DUMP_PATH"
    echo -e "${GREEN}✔ Base de datos importada correctamente en DDEV.${NC}"
else
    echo -e "${RED}Error: El archivo de dump no se encontró en ${LOCAL_DUMP_PATH}.${NC}"
    exit 1
fi

# 4. Limpieza (Opcional, descomentar si se desea borrar el archivo descargado para ahorrar espacio)
# echo -e "${BLUE}3. Limpiando archivos temporales...${NC}"
# rm "$LOCAL_DUMP_PATH"

echo -e "${GREEN}=== Proceso finalizado con éxito ===${NC}"
