#!/bin/bash

###############################################################################
# Script: send-to-cd-system-v2.sh
# Descripción: Propaga TODO desde un proyecto hacia cd-system
#              Usa enfoque BLACKLIST: propaga todo excepto lo específico del proyecto
#              Basado en .cd-system-exclude para definir exclusiones
# Uso: ./scripts/send-to-cd-system-v2.sh
###############################################################################

set -e

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

# Configuración
PROJECT_NAME="catalogue"
CD_SYSTEM_PATH="/Applications/XAMPP/xamppfiles/htdocs/cd-system"
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PROJECT_NAME_AUTO=$(basename "$CURRENT_DIR")

# Detectar nombre del proyecto si no se proporciona
if [ -z "$PROJECT_NAME" ] || [ "$PROJECT_NAME" == "catalogue" ]; then
    PROJECT_NAME="$PROJECT_NAME_AUTO"
fi

echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
echo -e "${BLUE}  📤 Propagando TODO a cd-system (Enfoque Blacklist)${NC}"
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
echo ""
echo -e "${YELLOW}Proyecto origen:${NC} $PROJECT_NAME"
echo -e "${YELLOW}Directorio actual:${NC} $CURRENT_DIR"
echo -e "${YELLOW}cd-system path:${NC} $CD_SYSTEM_PATH"
echo ""

# Verificar que cd-system existe
if [ ! -d "$CD_SYSTEM_PATH" ]; then
    echo -e "${RED}❌ Error: No se encuentra cd-system en $CD_SYSTEM_PATH${NC}"
    exit 1
fi

# Verificar que estamos en la rama correcta
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$CURRENT_BRANCH" != "cd-system" ]; then
    echo -e "${YELLOW}⚠️  Advertencia: Estás en la rama '$CURRENT_BRANCH', no en 'cd-system'${NC}"
    read -p "¿Continuar de todos modos? (y/n): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
fi

# ============================================================================
# CARGAR ARCHIVO DE EXCLUSIONES
# ============================================================================

EXCLUDE_FILE="$CD_SYSTEM_PATH/.cd-system-exclude"
if [ ! -f "$EXCLUDE_FILE" ]; then
    echo -e "${RED}❌ Error: No se encuentra .cd-system-exclude en cd-system${NC}"
    echo -e "${YELLOW}   Creando archivo de exclusiones por defecto...${NC}"
    # El archivo debería existir, pero si no, creamos uno básico
    EXCLUDE_FILE="$CURRENT_DIR/.cd-system-exclude-temp"
fi

echo -e "${CYAN}📋 Cargando exclusiones desde:${NC} $EXCLUDE_FILE"
echo ""

# Leer exclusiones y construir array para rsync
EXCLUDE_PATTERNS=()
while IFS= read -r line || [ -n "$line" ]; do
    # Ignorar comentarios y líneas vacías
    if [[ ! "$line" =~ ^[[:space:]]*# ]] && [[ -n "$line" ]]; then
        EXCLUDE_PATTERNS+=("--exclude=$line")
    fi
done < "$EXCLUDE_FILE"

echo -e "${BLUE}📋 Exclusiones cargadas:${NC}"
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
    exclude_path=$(echo "$pattern" | sed 's/--exclude=//')
    echo -e "  ${YELLOW}❌${NC} $exclude_path"
done
echo ""

# ============================================================================
# IDENTIFICAR ARCHIVOS A PROPAGAR
# ============================================================================

echo -e "${CYAN}🔍 Identificando archivos a propagar...${NC}"
echo ""

# Contar archivos que se propagarán (usando find con exclusiones)
TEMP_COUNT=$(mktemp)
find "$CURRENT_DIR" -type f \
    ! -path "*/vendor/*" \
    ! -path "*/node_modules/*" \
    ! -path "*/.git/*" \
    ! -path "*/storage/*" \
    ! -path "*/bootstrap/cache/*" \
    ! -path "*/config/site.php" \
    ! -path "*/config/cd-system.php" \
    ! -path "*/public/cd-project/img/logos/*" \
    ! -path "*/public/cd-project/img/favicon/*" \
    ! -path "*/public/cd-project/assets/*" \
    ! -path "*/.env*" \
    ! -name ".DS_Store" \
    ! -name "Thumbs.db" \
    | wc -l > "$TEMP_COUNT"

TOTAL_FILES=$(cat "$TEMP_COUNT")
rm "$TEMP_COUNT"

echo -e "${GREEN}✅ Se propagarán aproximadamente ${CYAN}$TOTAL_FILES${GREEN} archivos${NC}"
echo ""

# ============================================================================
# PREVIEW DE CAMBIOS
# ============================================================================

echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
echo -e "${BLUE}  🔍 Preview de Cambios${NC}"
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
echo ""

# Mostrar algunos archivos que se propagarán (ejemplos)
echo -e "${CYAN}Ejemplos de archivos que se propagarán:${NC}"
find "$CURRENT_DIR" -type f \
    ! -path "*/vendor/*" \
    ! -path "*/node_modules/*" \
    ! -path "*/.git/*" \
    ! -path "*/storage/*" \
    ! -path "*/config/site.php" \
    ! -path "*/config/cd-system.php" \
    ! -path "*/public/cd-project/img/logos/*" \
    ! -path "*/public/cd-project/img/favicon/*" \
    ! -path "*/public/cd-project/assets/*" \
    | head -20 | while read -r file; do
    rel_path="${file#$CURRENT_DIR/}"
    echo -e "  ${GREEN}✅${NC} $rel_path"
done

if [ "$TOTAL_FILES" -gt 20 ]; then
    echo -e "  ${CYAN}... y $((TOTAL_FILES - 20)) archivos más${NC}"
fi

echo ""
echo -e "${RED}❌ NO se propagarán:${NC}"
echo -e "  • config/site.php (datos específicos del proyecto)"
echo -e "  • config/cd-system.php (configuración del proyecto)"
echo -e "  • public/cd-project/img/logos/ (logos del proyecto)"
echo -e "  • public/cd-project/img/favicon/ (favicons del proyecto)"
echo -e "  • public/cd-project/assets/ (assets del proyecto)"
echo -e "  • vendor/, node_modules/, .env, storage/, etc."
echo ""

# ============================================================================
# CONFIRMACIÓN
# ============================================================================

read -p "¿Deseas continuar y aplicar estos cambios a cd-system? (y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo -e "${YELLOW}❌ Operación cancelada${NC}"
    exit 0
fi

# ============================================================================
# APLICAR CAMBIOS A CD-SYSTEM
# ============================================================================

echo ""
echo -e "${CYAN}🔄 Cambiando a cd-system...${NC}"
cd "$CD_SYSTEM_PATH"

# Verificar que estamos en la rama cd-system
CURRENT_BRANCH_CD=$(git rev-parse --abbrev-ref HEAD)
if [ "$CURRENT_BRANCH_CD" != "cd-system" ]; then
    echo -e "${YELLOW}⚠️  Cambiando a rama cd-system...${NC}"
    git checkout cd-system || {
        echo -e "${RED}❌ Error: No se pudo cambiar a la rama cd-system${NC}"
        exit 1
    }
fi

# Usar rsync para copiar todo excepto exclusiones
echo ""
echo -e "${CYAN}📥 Aplicando cambios con rsync...${NC}"

# Construir comando rsync con exclusiones
RSYNC_EXCLUDES=()
while IFS= read -r line || [ -n "$line" ]; do
    if [[ ! "$line" =~ ^[[:space:]]*# ]] && [[ -n "$line" ]]; then
        RSYNC_EXCLUDES+=("--exclude=$line")
    fi
done < "$EXCLUDE_FILE"

# Agregar exclusiones adicionales
RSYNC_EXCLUDES+=("--exclude=.git/")
RSYNC_EXCLUDES+=("--exclude=.cd-system-exclude")
RSYNC_EXCLUDES+=("--exclude=send-to-cd-system-v2.sh")

# Ejecutar rsync
rsync -av --progress \
    "${RSYNC_EXCLUDES[@]}" \
    "$CURRENT_DIR/" \
    "$CD_SYSTEM_PATH/" \
    | grep -E "^[a-z].*" | head -50 | while IFS= read -r line; do
    echo -e "  ${GREEN}✅${NC} $line"
done

echo -e "${GREEN}✅ Sincronización completada${NC}"

echo ""
echo -e "${GREEN}✅ Propagación completada${NC}"

# Mostrar estado de git
echo ""
echo -e "${CYAN}📊 Estado de cambios:${NC}"
git status --short | head -30

if [ $(git status --short | wc -l) -gt 30 ]; then
    echo -e "${CYAN}... y más cambios${NC}"
fi

echo ""
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
echo -e "${BLUE}  ✅ Confirmación Final${NC}"
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
echo ""
echo -e "${YELLOW}⚠️  IMPORTANTE:${NC}"
echo -e "  1. Revisa los cambios con: ${GREEN}git diff${NC}"
echo -e "  2. Verifica que ${YELLOW}config/site.php${NC} NO se haya propagado"
echo -e "  3. Verifica que ${YELLOW}config/cd-system.php${NC} NO se haya propagado"
echo -e "  4. Verifica que los assets del proyecto NO se hayan propagado"
echo ""
echo -e "${YELLOW}ℹ️  Cambios aplicados pero NO commiteados.${NC}"
echo -e "   Puedes revisarlos y commitear manualmente."
echo ""
echo -e "${CYAN}💡 Para commitear:${NC}"
echo -e "   git add -A"
echo -e "   git commit -m 'feat: Integrar mejoras desde $PROJECT_NAME'"
echo ""

