# cpp-windows

Operar apps C++ del registry en Windows desde WSL2: compilar, desplegar, lanzar, verificar y relanzar.

## Funciones del grupo

| ID | Firma corta | Que hace |
|---|---|---|
| `build_cpp_windows_bash_infra` | `build_cpp_windows([target])` | Cross-compila apps C++ para Windows con mingw-w64 |
| `deploy_cpp_exe_to_windows_bash_infra` | `deploy_cpp_exe_to_windows(app_name, app_dir)` | Copia .exe + DLLs + assets al Desktop Windows, mata proceso previo |
| `launch_cpp_app_windows_bash_infra` | `launch_cpp_app_windows(app_name, [desktop_dir])` | Lanza .exe en Windows via cmd.exe /c start, retorna inmediatamente |
| `is_cpp_app_running_windows_bash_infra` | `is_cpp_app_running_windows(app_name)` | Exit 0 si el proceso esta vivo (tasklist.exe), stdout: `RUNNING: PID=N MEM=...K` |
| `launch_cpp_app_windows_bash_infra` | `launch_cpp_app_windows(app_name, [desktop_dir])` | Lanza .exe en Windows via cmd.exe /c start, retorna inmediatamente |
| `e2e_run_cpp_windows_bash_infra` | `e2e_run_cpp_windows(target, [--no-build], [--no-deploy])` | Build + deploy + run headless de app C++ (tests e2e tipo altsnap) |
| `redeploy_cpp_app_windows_bash_pipelines` | `redeploy_cpp_app_windows(app_name, app_dir, [--build])` | Pipeline completo: build? + deploy + launch + verify en un comando |

## Ejemplo canonico

### Redeploy rapido (build ya hecho)

```bash
source bash/functions/infra/deploy_cpp_exe_to_windows.sh
source bash/functions/infra/launch_cpp_app_windows.sh
source bash/functions/infra/is_cpp_app_running_windows.sh

deploy_cpp_exe_to_windows "registry_dashboard" \
    "/home/lucas/fn_registry/projects/fn_monitoring/apps/registry_dashboard"
launch_cpp_app_windows "registry_dashboard"
sleep 1
if is_cpp_app_running_windows "registry_dashboard"; then
    echo "OK: arrancado"
else
    echo "ERROR: no arranco" >&2; exit 1
fi
```

### Via pipeline (un solo comando)

```bash
source bash/functions/pipelines/redeploy_cpp_app_windows.sh

# Sin recompilar
redeploy_cpp_app_windows "registry_dashboard" \
    "/home/lucas/fn_registry/projects/fn_monitoring/apps/registry_dashboard"

# Con recompilacion previa
redeploy_cpp_app_windows "chart_demo" \
    "/home/lucas/fn_registry/cpp/apps/chart_demo" --build
```

### Comprobar si esta vivo antes de decidir

```bash
source bash/functions/infra/is_cpp_app_running_windows.sh

if is_cpp_app_running_windows "registry_dashboard"; then
    echo "Ya esta corriendo — skip launch"
else
    launch_cpp_app_windows "registry_dashboard"
fi
```

## Fronteras

- No gestiona builds Linux ni assets de Linux — solo el flujo Windows.
- No verifica que la app funcione correctamente, solo que el proceso existe (`tasklist.exe`).
- No gestiona credenciales ni configuracion de la app — eso es responsabilidad de cada app via `local_files/`.
- Tests automatizados en CI no son posibles — requieren WSL2 con Windows activo.

## Prerequisitos

- WSL2 con interop a Windows habilitado (`tasklist.exe`, `cmd.exe`, `wslpath` accesibles).
- `mingw-w64` instalado en WSL para `build_cpp_windows` (`sudo apt install mingw-w64`).
- El .exe compilado en `cpp/build/windows/apps/<app>/` antes de `deploy_cpp_exe_to_windows`.

## Notas

El flujo estandar es: `build_cpp_windows` → `deploy_cpp_exe_to_windows` → `launch_cpp_app_windows` → `is_cpp_app_running_windows`. El pipeline `redeploy_cpp_app_windows` encapsula los pasos 2-4 (con 1 opcional via `--build`).

`deploy_cpp_exe_to_windows` ya incluye un `taskkill.exe` interno — no es necesario matar el proceso manualmente antes de llamarlo. `is_cpp_app_running_windows` es util cuando se quiere tomar la decision de matar/no matar de forma explicita antes del deploy.
