#!/usr/bin/env bash
# open_doc_onlyoffice — abre un documento ofimático con OnlyOffice Desktop Editors.
#
# Uso:
#   open_doc_onlyoffice <ruta_archivo> [--restart]
#
# Lanza el editor desacoplado del shell (setsid + background) para que sobreviva
# al proceso que lo invoca. Localiza el binario por PATH, sin hardcodear rutas.
#
# --restart cierra toda la instancia de OnlyOffice antes de relanzar, para forzar
# la recarga desde disco de un archivo que se regeneró (OnlyOffice mantiene en
# memoria la versión vieja de los documentos ya abiertos).
set -euo pipefail

usage() {
    echo "uso: open_doc_onlyoffice <ruta_archivo> [--restart]" >&2
    exit 2
}

[ $# -ge 1 ] || usage

doc=""
restart=0
for arg in "$@"; do
    case "$arg" in
        --restart) restart=1 ;;
        -h|--help) usage ;;
        *) doc="$arg" ;;
    esac
done

[ -n "$doc" ] || usage

if [ ! -f "$doc" ]; then
    echo "error: archivo no encontrado: $doc" >&2
    exit 1
fi

bin="$(command -v onlyoffice-desktopeditors || true)"
if [ -z "$bin" ]; then
    echo "error: onlyoffice-desktopeditors no esta en PATH" >&2
    exit 1
fi

# Ruta absoluta para que OnlyOffice no dependa del directorio de trabajo.
doc_abs="$(readlink -f "$doc")"

if [ "$restart" -eq 1 ]; then
    # Cierra la app entera para descartar la copia en memoria de los documentos.
    # pkill -x sobre el comm exacto del proceso real (no -f, para no auto-matar
    # el propio script si su ruta contiene el patrón).
    pkill -x DesktopEditors 2>/dev/null || true
    # Espera (máx ~5s) a que el proceso principal termine antes de relanzar.
    for _ in $(seq 1 25); do
        pgrep -x DesktopEditors >/dev/null 2>&1 || break
        sleep 0.2
    done
fi

setsid "$bin" "$doc_abs" >/dev/null 2>&1 &
echo "abierto en OnlyOffice: $doc_abs"
