#!/bin/bash

###############################################################################
# Script: send-to-cd-system-v3.sh
# Descripción: Propaga cambios usando Git nativamente (Mejores Prácticas)
#              Usa Git para identificar y aplicar cambios, preservando historial
#              Más eficiente y alineado con mejores prácticas de desarrollo
# Uso: ./scripts/send-to-cd-system-v3.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 cambios a cd-system (Git Nativo)${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

# Verificar que hay un remote upstream configurado
if ! git remote | grep -q "^upstream$"; then
    echo -e "${YELLOW}⚠️  No se encuentra remote 'upstream'${NC}"
    echo -e "${CYAN}Configurando upstream desde cd-system...${NC}"
    git remote add upstream "$CD_SYSTEM_PATH" 2>/dev/null || {
        echo -e "${RED}❌ Error: No se pudo configurar upstream${NC}"
        exit 1
    }
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}"
    exit 1
fi

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

# Crear archivo temporal con exclusiones para git
EXCLUDE_TEMP=$(mktemp)
while IFS= read -r line || [ -n "$line" ]; do
    if [[ ! "$line" =~ ^[[:space:]]*# ]] && [[ -n "$line" ]]; then
        echo "$line" >> "$EXCLUDE_TEMP"
    fi
done < "$EXCLUDE_FILE"

# ============================================================================
# IDENTIFICAR CAMBIOS CON GIT
# ============================================================================

echo -e "${CYAN}🔍 Identificando cambios con Git...${NC}"
echo ""

# Obtener el último commit común con upstream
UPSTREAM_REF="upstream/cd-system"
if ! git rev-parse --verify "$UPSTREAM_REF" >/dev/null 2>&1; then
    echo -e "${YELLOW}⚠️  Fetching desde upstream...${NC}"
    git fetch upstream cd-system
fi

# Obtener cambios desde el último commit común
BASE_COMMIT=$(git merge-base HEAD "$UPSTREAM_REF")
CURRENT_COMMIT=$(git rev-parse HEAD)

if [ "$BASE_COMMIT" = "$CURRENT_COMMIT" ]; then
    echo -e "${YELLOW}⚠️  No hay cambios nuevos para propagar${NC}"
    echo -e "${CYAN}   Último commit común: ${BASE_COMMIT:0:7}${NC}"
    exit 0
fi

# Obtener lista de archivos cambiados
CHANGED_FILES=$(git diff --name-only --diff-filter=ACMR "$BASE_COMMIT"..HEAD)

if [ -z "$CHANGED_FILES" ]; then
    echo -e "${YELLOW}⚠️  No hay archivos modificados para propagar${NC}"
    exit 0
fi

# Filtrar exclusiones
FILTERED_FILES=$(echo "$CHANGED_FILES" | grep -v -f "$EXCLUDE_TEMP" || true)

if [ -z "$FILTERED_FILES" ]; then
    echo -e "${YELLOW}⚠️  Todos los archivos cambiados están excluidos${NC}"
    rm -f "$EXCLUDE_TEMP"
    exit 0
fi

# Contar archivos
TOTAL_CHANGED=$(echo "$CHANGED_FILES" | wc -l | tr -d ' ')
TOTAL_FILTERED=$(echo "$FILTERED_FILES" | wc -l | tr -d ' ')
TOTAL_EXCLUDED=$((TOTAL_CHANGED - TOTAL_FILTERED))

echo -e "${GREEN}✅ Archivos identificados:${NC}"
echo -e "  • Total cambiados: ${CYAN}$TOTAL_CHANGED${NC}"
echo -e "  • A propagar: ${GREEN}$TOTAL_FILTERED${NC}"
echo -e "  • Excluidos: ${YELLOW}$TOTAL_EXCLUDED${NC}"
echo ""

# Mostrar algunos archivos que se propagarán
echo -e "${CYAN}Ejemplos de archivos a propagar:${NC}"
echo "$FILTERED_FILES" | head -10 | while read -r file; do
    echo -e "  ${GREEN}✅${NC} $file"
done

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

echo ""

# Mostrar archivos excluidos (si los hay)
if [ "$TOTAL_EXCLUDED" -gt 0 ]; then
    echo -e "${YELLOW}Archivos excluidos (no se propagarán):${NC}"
    EXCLUDED_FILES=$(echo "$CHANGED_FILES" | grep -f "$EXCLUDE_TEMP" || true)
    echo "$EXCLUDED_FILES" | head -5 | while read -r file; do
        echo -e "  ${YELLOW}❌${NC} $file"
    done
    if [ "$TOTAL_EXCLUDED" -gt 5 ]; then
        echo -e "  ${CYAN}... y $((TOTAL_EXCLUDED - 5)) archivos más${NC}"
    fi
    echo ""
fi

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

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

# Crear patch temporal
PATCH_TEMP=$(mktemp)
git diff "$BASE_COMMIT"..HEAD -- "$FILTERED_FILES" > "$PATCH_TEMP" || true

if [ -s "$PATCH_TEMP" ]; then
    echo -e "${CYAN}Resumen de cambios:${NC}"
    git diff --stat "$BASE_COMMIT"..HEAD -- "$FILTERED_FILES" | tail -1
    echo ""
else
    echo -e "${YELLOW}⚠️  No hay cambios significativos${NC}"
    rm -f "$EXCLUDE_TEMP" "$PATCH_TEMP"
    exit 0
fi

# ============================================================================
# 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}"
    rm -f "$EXCLUDE_TEMP" "$PATCH_TEMP"
    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}"
        rm -f "$EXCLUDE_TEMP" "$PATCH_TEMP"
        exit 1
    }
fi

# Aplicar patch
echo ""
echo -e "${CYAN}📥 Aplicando cambios con Git...${NC}"

# Verificar que el patch se puede aplicar
if ! git apply --check "$PATCH_TEMP" 2>/dev/null; then
    echo -e "${YELLOW}⚠️  Algunos cambios pueden tener conflictos${NC}"
    echo -e "${CYAN}   Aplicando con estrategia de 3-way merge...${NC}"
    
    # Aplicar con --3way para manejar conflictos
    if git apply --3way "$PATCH_TEMP" 2>&1; then
        echo -e "${GREEN}✅ Patch aplicado (algunos conflictos resueltos automáticamente)${NC}"
    else
        echo -e "${RED}❌ Error al aplicar patch${NC}"
        echo -e "${YELLOW}   Revisa los conflictos manualmente${NC}"
        rm -f "$EXCLUDE_TEMP" "$PATCH_TEMP"
        exit 1
    fi
else
    # Aplicar patch sin conflictos
    git apply "$PATCH_TEMP"
    echo -e "${GREEN}✅ Patch aplicado exitosamente${NC}"
fi

# Limpiar archivos temporales
rm -f "$EXCLUDE_TEMP" "$PATCH_TEMP"

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

CHANGES_COUNT=$(git status --short | wc -l | tr -d ' ')
if [ "$CHANGES_COUNT" -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 "${GREEN}✅ Ventajas de este método:${NC}"
echo -e "  • Solo procesa archivos versionados (más eficiente)"
echo -e "  • Preserva historial de Git"
echo -e "  • Usa .gitattributes nativamente"
echo -e "  • Alineado con mejores prácticas"
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 ""

