# Aplicaciones: WinForms, consola y futuras

> Todas usan `Sunfish.Core` y el mismo fichero de configuración; ninguna contiene lógica de
> servidor. **Hecho (fase 3):** `Sunfish.exe` y la TUI de `sunfish-cli` con shares, usuarios,
> puerto, arranque/parada, registro, direcciones, modo rápido, instancia única (GUI), área de
> notificación (GUI), icono (TUI) y subcomandos `share`/`user`. **Fase 4:** FTP. **Fase 5:** explorar
> otro servidor (ventana en la GUI, pestaña F4 en la TUI). **Fase 7:** código QR (ventana en
> la GUI, tecla C en la TUI), ajustes del panel web (GUI y `sunfish-cli admin`) e importación de
> la 2.0 (al crear la configuración y con `sunfish-cli import-v2`). **Pendiente:** conexiones
> activas, iniciar con Windows y servicio.
>
> Teclas de la TUI: F1–F5 o Tab cambian de pestaña (Estado, Shares, Usuarios, Explorar, Registro); en Shares, A/Ins añade, Enter edita,
> Espacio activa/desactiva, D/Supr quita; en Usuarios, A añade, P cambia la contraseña, D borra;
> en Estado, S arranca/para, P cambia el puerto HTTP, F activa o desactiva FTP, T cambia el puerto FTP, N el nombre, C muestra el código QR de cada dirección (flechas: la siguiente); en Explorar, Enter conecta o abre, A escribe una dirección, R vuelve a buscar, Retroceso sube, D descarga, U sube un fichero o carpeta local, M crea carpeta, Supr borra y Esc vuelve a la lista de servidores; Q/Esc/Ctrl+C salen (con pregunta).

## 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.
- **Explorar otro servidor:** lista los Sunfish de la red (descubiertos por DNS-SD) y permite
  escribir cualquier URL WebDAV.
  - Se navega por sus shares y se copian ficheros y carpetas en los dos sentidos.
  - Usa el cliente WebDAV de `Sunfish.Core`; no hay protocolo propio (ver
    [FTP-Y-WEBDAV.md](FTP-Y-WEBDAV.md#de-sunfish-a-sunfish)).
- **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)

**Aspecto de la 2.0:** ventana pequeña y vertical, interfaz compacta y botones con imagen (las
imágenes de la 2.0 están en `src/Sunfish.WinForms/Resources/`; las que faltaban, como «−» y
usuarios, se dibujaron en el mismo estilo). Las imágenes se escalan a los PPP de la pantalla.

- **Ventana principal:**
  - arriba, «Menú raíz» y, en columna, «Web en puerto» y «FTP en puerto» con sus puertos (cada casilla activa o desactiva su servicio; en rojo si no puede escuchar, p. ej. puerto ocupado);
  - lista de shares dibujada como en la 2.0: icono de carpeta (gris si está desactivado, con una
    flecha verde si admite subidas), nombre y, debajo en pequeño, location, permisos y usuarios.
    Arrastrar una carpeta crea un share con `Location = /<nombre>`;
  - abajo, botones con imagen: añadir, quitar, editar, usuarios, información (i) y «Ok», que
    manda la ventana al área de notificación sin parar el servidor.
- **Menú contextual de un share** con iconos: abrir en el navegador, copiar URL por cada IP,
  abrir la carpeta, editar (en negrita), activar/desactivar y quitar.
- **Diálogo de share** como el editor de la 2.0: estrecho, etiqueta encima de cada campo,
  obligatorios en amarillo claro y el aviso de `Upload` + `Listing` en un recuadro amarillo.
- **Ventana Explorar** (botón de la pantalla): servidores de la red encontrados por DNS-SD o una dirección escrita; lista de la carpeta remota con iconos; botones con imagen para subir de nivel, descargar (elige carpeta local), subir (o arrastrar ficheros y carpetas a la lista), crear carpeta y borrar; pide usuario si el servidor lo exige.
- **Ventana de información (i):** «acerca de», direcciones de cada share por interfaz (doble clic
  las abre; menú para copiarlas o ver su **código QR**) y registro.
- **Panel web:** enlace «Panel web: activado/desactivado (cambiar)» en la ventana de información;
  diálogo con activar, contraseña (vacía: no cambia) y `AllowFrom`.
- **Primer arranque:** al crear la configuración, si hay un `sunfish2` junto al programa o en la
  carpeta actual, ofrece importarlo y muestra lo que no se trae.
- **Pendiente:** 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 la tecla C),
Shares, Usuarios y Registro (Explorar y Conexiones llegarán con sus fases).

A diferencia de la web, la TUI **solo se usa en terminales modernos** (Windows Terminal, conhost
de Windows 10/11, terminales de Linux/macOS, SSH): usa sin reparos caracteres de caja Unicode
(marco con esquinas redondeadas `╭╮╰╯`, pestañas en el borde superior, atajos en el inferior),
`● ○ ☑ ☐ ▸ •` y color de 24 bits (o 256 colores si el terminal no lo anuncia).

**Icono en la TUI:**
- La pestaña Estado muestra el pez luna de Sunfish dibujado con medios bloques (`▀ ▄ █`) y
  color, a partir del mismo dibujo que el icono de la aplicación (unas 16 × 8 celdas).
- **Solo aparece si cabe:** a partir de un tamaño mínimo de terminal (orientativo: 100 × 30). Si
  no cabe, se oculta y deja el espacio a la información.
- **Color:** color real si el terminal lo anuncia (`COLORTERM` o Windows Terminal); si no, la
  paleta de 256 colores.

**Subcomandos:**

```
sunfish-cli serve
sunfish-cli share add NOMBRE CARPETA [Clave=valor ...]     (claves de [Share], p. ej. Upload=true)
sunfish-cli share set NOMBRE [--location /ruta] Clave=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 user list
sunfish-cli admin status | enable | disable | passwd      (panel web; enable pide contraseña si no hay)
sunfish-cli admin allow 127.0.0.1 ::1 192.168.1.0/24       (AllowFrom; * = cualquiera)
sunfish-cli import-v2 [FICHERO]        (sunfish2 de la 2.0; añade sus shares a la configuración)

Opciones globales:  -c, --config FICHERO   -p, --port N   -v, --verbose   --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/Qr` (sin dependencias): modo byte (UTF-8), versiones 1–40,
  nivel de corrección M como mínimo (sube a Q o H si cabe en la misma versión) y máscara elegida
  por penalización. Devuelve una matriz de módulos.
  - WinForms la pinta en un `Bitmap` (píxeles exactos, margen de 4 módulos).
  - La TUI la dibuja con `▀ ▄ █` en negro sobre fondo blanco (sobre el fondo oscuro del terminal
    los móviles no lo leen) y margen de 2 módulos; si no cabe, muestra la dirección.
  - El panel web la sirve como PNG de 1 bit (`QrImage.Png`).
  - Las pruebas lo comprueban leyéndolo con un decodificador independiente (ZXing.Net, solo en
    el proyecto de pruebas).
- **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.
