# Aplicaciones: WinForms, consola y futuras

> Diseño previsto; aún no implementado. Todas usan `Sunfish.Core` y el mismo fichero de
> configuración; ninguna contiene lógica de servidor.

## Lo común a todas

- **Activar y desactivar** HTTP y FTP por separado; puertos.
- **Shares:** alta, baja, edición de todas las opciones ([SHARES-Y-RUTAS.md](SHARES-Y-RUTAS.md)),
  activar/desactivar.
- **Usuarios** y contraseñas; panel de administración (activar, contraseña, `AllowFrom`).
- **Direcciones:** lista de IP locales por interfaz con la URL de cada share (HTTP y FTP),
  copiable, y un **código QR** de la URL para abrirla desde un móvil.
- **Registro:** conexiones, descargas, subidas y errores.
- **Modo rápido:** si se pasa una carpeta como argumento (también **arrastrándola sobre el
  ejecutable** en el explorador), se comparte al momento.
  - Se publica en `/` con listado y solo lectura, se arranca el servidor y se muestran las URLs.
  - No se guarda en la configuración salvo que se pida.
- **Textos** en español e inglés según el sistema; `SUNFISH_LANG=es|en` o `--lang` lo fuerzan.

## `Sunfish.exe` (WinForms, Windows)

- **Ventana principal:**
  - interruptores HTTP/FTP y puertos;
  - lista de shares (arrastrar una carpeta a la lista crea un share con `Location = /<nombre>`,
    como en la 2.0);
  - botones de añadir, editar y quitar;
  - acceso a usuarios y al panel web.
- **Menú contextual de un share:** copiar URL por cada IP (como en la 2.0), abrir en el
  navegador, mostrar QR, abrir la carpeta en el Explorador.
- **Diálogo de share** con todas las opciones y avisos (p. ej. `Upload` + `Listing` publica
  HTML subido).
- **Pestaña de registro** y lista de conexiones activas.
- **Icono en el área de notificación:** minimizar a la bandeja; opción de iniciar con Windows
  (entrada en `HKCU\...\Run`) e iniciar minimizado.
- **Una sola instancia por configuración:** abrir otra vez la trae al frente y le pasa los
  argumentos del modo rápido.
- **`WinExe`:** sin ventana de consola.
- **Pendiente:** que el primer arranque ofrezca la regla del cortafuegos de Windows (pedirá
  elevación solo para eso) o dejar que Windows lo pregunte por sí mismo.

## `sunfish-cli` (consola, Windows / Linux / macOS)

| Cómo se lanza | Modo |
|---|---|
| Sin argumentos, con terminal (doble clic incluido) | **TUI interactiva**: sirve y gestiona |
| Sin argumentos, con stdin/stdout redirigidos | Igual que `serve` |
| `sunfish-cli CARPETA` | Modo rápido (TUI si hay terminal) |
| `sunfish-cli serve` | Sin interfaz; registro por la salida estándar (para servicios) |
| `sunfish-cli <subcomando>` | Ejecuta y sale |

**TUI** (ANSI/VT, sin bibliotecas externas): pestañas Estado (IP, URLs, QR con medios bloques),
Shares, Usuarios, Conexiones y Registro. Funciona en Windows Terminal, conhost, terminales de
Unix y por SSH.

**Subcomandos (propuesta):**

```
sunfish-cli serve
sunfish-cli show
sunfish-cli share add NOMBRE CARPETA [--location /ruta] [--listing] [--upload] [--delete] ...
sunfish-cli share set NOMBRE OPCION=VALOR ...
sunfish-cli share del NOMBRE
sunfish-cli share list
sunfish-cli user add NOMBRE            (pide la contraseña)
sunfish-cli user passwd NOMBRE
sunfish-cli user del NOMBRE
sunfish-cli admin enable|disable
sunfish-cli admin passwd
sunfish-cli import-v2 [FICHERO]

Opciones globales:  -c, --config FICHERO   -l, --log FICHERO   --lang es|en
```

Como servicio: unidad de systemd o `launchd` con `serve` (ejemplos en el repositorio cuando
exista el código); en Windows, como tarea programada o con una herramienta de servicios
(**pendiente**).

## Futuras: GTK (Linux) y macOS

- **Interfaz nativa sobre `Sunfish.Core`:** las mismas funciones que la de WinForms.
- **Opciones a evaluar:**
  - GTK 4 con bindings de .NET (Gir.Core, que apunta a ser compatible con AOT);
  - macOS con .NET para macOS (AppKit), que admite Native AOT.
- **Mientras tanto:** en Linux y macOS se usa `sunfish-cli`.

## QR y direcciones

- **QR propio** en `Sunfish.Core` (sin dependencias): devuelve una matriz de módulos.
  - WinForms la pinta en un `Bitmap`.
  - La TUI la dibuja con `▀ ▄ █`.
- **Direcciones:** se listan solo las interfaces activas con IPv4 o IPv6 globales/locales,
  indicando el nombre y el tipo de la interfaz, como hacía la 2.0.
