# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Comandos

**Ejecutar la aplicación:**
```bash
python pocketsync.py
```

No hay proceso de build, instalación de dependencias, ni tests automatizados. Todo depende de la librería estándar de Python 3 y del comando `robocopy` de Windows.

## Arquitectura

Aplicación de escritorio en Python/Tkinter para sincronizar archivos de emulación retro (ES-DE y ROMs) hacia almacenamiento externo usando Robocopy. Soporta múltiples perfiles nombrados (uno por consola/dispositivo).

### Estructura de archivos

```
pocketsync.py           # Entry point (~20 líneas)
config.json             # Config v2 con perfiles
CLAUDE.md

core/
    __init__.py
    config.py           # Profile dataclass + ConfigManager (load/save/migrate v1→v2)
    sync_engine.py      # ABC SyncEngine
    robocopy_engine.py  # RobocopySyncEngine (subprocess + parsing)

ui/
    __init__.py
    app.py              # PocketSyncApp — orquestación y loop de sync
    profile_bar.py      # Widget: dropdown de perfiles + New/Rename/Delete
    path_panel.py       # Widget: los 2 selectores de ruta (ES-DE + ROMs)
    system_list.py      # Widget: listbox de sistemas + Select All/None
    status_bar.py       # Widget: barra de estado (sistema/fase/archivo)
    summary_panel.py    # Widget: área de texto de resumen
    styles.py           # Constantes visuales (colores, fuentes)
```

**Entry point:** `pocketsync.py` — instancia `ConfigManager` y `PocketSyncApp`.

**Persistencia:** `config.json` (versión 2) guarda todos los perfiles. Si existe un config v1 (plano), se migra automáticamente a un perfil "Default" al primer arranque.

### Esquema config.json (v2)

```json
{
    "version": 2,
    "active_profile": "Default",
    "profiles": [
        {
            "name": "Default",
            "esde_src": "...",
            "roms_src": "...",
            "esde_dst": "...",
            "roms_dst": "...",
            "selected": ["arcade", "nes"]
        }
    ]
}
```

### Flujo de la aplicación

1. Al iniciar: `ConfigManager.load()` restaura perfiles desde `config.json` (con migración automática de v1 → v2).
2. El usuario selecciona o crea un perfil en `ProfileBar`.
3. Configura 4 rutas (ES-DE origen/destino, ROMs origen/destino) y selecciona los sistemas.
4. Al pulsar "Sync Now": hilo daemon → `_sync_thread` en `app.py`.
5. Por cada sistema: 3 fases usando `SyncEngine.sync_folder()`.
6. Al cambiar de perfil: se guarda el estado actual en el perfil activo antes de cargar el nuevo.
7. Al cerrar: `ConfigManager.save()` persiste todos los perfiles.

### Flags de Robocopy usados
- `/MIR` — modo espejo (sincroniza origen → destino)
- `/NP` — sin porcentaje de progreso en la salida

### Threading
Las operaciones de copia corren en un hilo daemon separado para no bloquear la UI. Las actualizaciones de widgets se hacen desde ese hilo directamente.

### Extensibilidad de backends
`core/sync_engine.py` define la ABC `SyncEngine`. `RobocopySyncEngine` es la implementación concreta. Para añadir rsync u otro backend: crear un nuevo archivo en `core/` que implemente la misma interfaz.

## Build (generar PocketSync.exe)

### Requisitos previos (una sola vez)

```bash
py -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
```

### Icono (opcional pero recomendado)

Coloca tu icono en `assets\pocketsync.ico` antes de empaquetar. Sin él, el `.exe` usará el icono genérico de Python. El `.spec` detecta automáticamente si el archivo existe.

### Empaquetar

```bash
.venv\Scripts\activate
pyinstaller pocketsync.spec
```

El ejecutable final queda en `dist\PocketSync.exe`. No requiere Python instalado en el equipo destino.

### Archivos de build

| Archivo | Descripción |
|---|---|
| `requirements.txt` | Solo `pyinstaller>=6.0` |
| `pocketsync.spec` | Configuración de PyInstaller (versionado) |
| `assets/pocketsync.ico` | Icono del `.exe` (no versionado, añadir manualmente) |
| `dist/` | Salida del build (ignorado por git) |
| `build/` | Archivos temporales de PyInstaller (ignorado por git) |
| `.venv/` | Entorno virtual (ignorado por git) |

## Plataforma

Windows 10/11 obligatorio (depende de `robocopy`). Python 3.6+, sin dependencias externas.
