# Detección de Cambios por Hash SHA256

## ¿Qué es y por qué es importante?

El sistema ahora utiliza **hash SHA256** para detectar cambios en archivos XML, complementando el método tradicional basado en tiempo de modificación y tamaño de archivo.

## Problema resuelto

### Antes (método tradicional)
- **Solo verificaba**: tiempo de modificación + tamaño de archivo
- **Problema**: Si un archivo XML cambia pero mantiene el mismo tamaño y tiempo, el sistema NO regeneraba los archivos JSON/SCL
- **Resultado**: Cambios en el XML no se reflejaban en el código SCL generado

### Ahora (método con hash)
- **Verifica**: hash SHA256 del contenido completo del archivo
- **Ventaja**: Detecta CUALQUIER cambio en el contenido, sin importar tamaño o tiempo
- **Resultado**: Regeneración precisa solo cuando el contenido realmente cambió

## Casos donde el hash es crucial

### Caso 1: Cambios sutiles
```xml
<!-- Antes -->
<Name>MotorControl_01</Name>

<!-- Después -->  
<Name>MotorControl_02</Name>
```
- Mismo tamaño de archivo
- Posiblemente mismo tiempo (si se restaura)
- **Método tradicional**: NO detecta cambio ❌
- **Método hash**: SÍ detecta cambio ✅

### Caso 2: Reemplazo de contenido
```xml
<!-- Antes -->
<Comment>Test AAAAAA</Comment>

<!-- Después -->
<Comment>Test BBBBBB</Comment>
```
- Exactamente el mismo tamaño
- **Método tradicional**: NO detecta cambio ❌  
- **Método hash**: SÍ detecta cambio ✅

## Implementación

### Archivos modificados
1. **`x0_main.py`**:
   - Añadida función `calculate_file_hash()`
   - Modificada función `check_skip_status()` para usar hash como prioridad
   - Logging mejorado para mostrar qué método de detección se usa

2. **`x1_to_json.py`**:
   - Añadida función `calculate_file_hash()`
   - Modificada función `convert_xml_to_json()` para calcular y guardar hash
   - Nuevo campo `source_xml_hash` en archivos JSON

3. **`x2_process.py`**:
   - Modificado para preservar el campo `source_xml_hash` en JSONs procesados

### Nuevo campo en JSON
Los archivos JSON ahora incluyen:
```json
{
    "block_name": "FC Pack Motor 71",
    "source_xml_mod_time": 1755944794.1680913,
    "source_xml_size": 32969,
    "source_xml_hash": "a7f5d2e8c4b6a9f3..."  // <-- NUEVO
}
```

## Comportamiento del sistema

### Prioridad de verificación
1. **Primera prioridad**: Comparación por hash SHA256
   - Si el hash coincide → saltar procesamiento
   - Si el hash difiere → regenerar archivos

2. **Fallback**: Método tradicional (tiempo + tamaño)
   - Se usa si no hay hash almacenado en el JSON
   - Mantiene compatibilidad con archivos JSON existentes

### Logging mejorado
El sistema ahora muestra claramente qué método usa:
```
✓ Hash coincide para FC_Motor_71.xml - Saltando x1/x2
✗ Hash diferente para FC_Motor_72.xml - Regenerando  
✓ Tiempo/tamaño coinciden para FC_Motor_73.xml - Saltando x1/x2 (método legacy)
```

## Beneficios

### Para el usuario
- **Precisión**: No se pierden cambios por limitaciones del método tradicional
- **Eficiencia**: No regenera archivos que realmente no cambiaron
- **Confiabilidad**: Detecta modificaciones sutiles pero importantes

### Para el desarrollo
- **Compatibilidad**: Los archivos JSON existentes siguen funcionando
- **Transparencia**: Logs claros sobre qué se procesa y por qué
- **Robustez**: Fallback automático al método tradicional si es necesario

## Casos de uso típicos

### Exportación desde TIA Portal
Cuando exportas un proyecto de TIA Portal varias veces:
1. **Primera exportación**: Se generan todos los JSON/SCL
2. **Segunda exportación** (sin cambios): Se saltan todos los archivos (hash coincide)
3. **Tercera exportación** (con cambios menores): Solo se regeneran los archivos modificados

### Modificaciones manuales
Si modificas manualmente un XML:
- El hash cambia instantáneamente
- El sistema regenera automáticamente los archivos derivados
- No importa si el tamaño o tiempo parecen iguales

## Testing

Se incluyen scripts de prueba que demuestran la funcionalidad:
- `test_hash_detection.py`: Demostración básica
- `test_hash_edge_cases.py`: Casos donde el hash es superior al método tradicional

Para ejecutar:
```bash
python test_hash_detection.py
python test_hash_edge_cases.py
```

## Migración automática

Los archivos JSON existentes seguirán funcionando:
- Sin campo `source_xml_hash`: usa método tradicional
- Con campo `source_xml_hash`: usa método de hash (más preciso)
- La próxima regeneración añadirá automáticamente el hash
