#!/usr/bin/bash
# Publica los PDF de SummaPack; no publica páginas CMSimple ni paquetes.
set -euo pipefail
ayuda() {
    printf '%s\n' \
        'Uso: subir-doc [--prueba] [--doc DIRECTORIO]' \
        'Publica doc/summapack.pdf y doc/738.pdf en downloads/summapack/docs/.' \
        'Usa SUBIR_SERVIDOR, SUBIR_USUARIO y SUBIR_DIR del entorno o' \
        '~/.config/simusol/subir, como subir-paquetes. El entorno manda.' \
        '--prueba solo muestra el destino: no conecta ni escribe.' \
        '--doc indica dónde están summapack.pdf y 738.pdf.' \
        'Sin --doc: usa doc/ junto al script o doc/ del directorio actual.' \
        'El proyecto downloads/summapack/ debe existir; solo se crea docs/.' \
        'No borra archivos. Respalda los PDF reemplazados en .anteriores/.' \
        'Para probar sin servidor: SUBIR_SERVIDOR=local SUBIR_DIR=/tmp/mi-prueba ./subir-doc'
}
prueba=0
documentos=
while (( $# )); do
    case "$1" in
        --prueba) prueba=1 ;;
        --doc)
            [[ $# -ge 2 && -n $2 ]] || { echo 'subir-doc: --doc requiere un directorio' >&2; exit 2; }
            documentos=$2; shift ;;
        -h|--help) ayuda; exit 0 ;;
        *) printf 'subir-doc: argumento desconocido: %s\n' "$1" >&2; exit 2 ;;
    esac
    shift
done
# Conservar lo fijado por el llamador antes de leer la configuración.
declare -A entorno=()
for variable in SUBIR_SERVIDOR SUBIR_USUARIO SUBIR_DIR; do
    if [[ -v $variable ]]; then entorno[$variable]=${!variable}; fi
done
if [[ -f "$HOME/.config/simusol/subir" ]]; then
    . "$HOME/.config/simusol/subir"
fi
for variable in "${!entorno[@]}"; do
    printf -v "$variable" '%s' "${entorno[$variable]}"
done
servidor=${SUBIR_SERVIDOR:-simusol.org}
usuario=${SUBIR_USUARIO:-publicador}
base=${SUBIR_DIR:-/var/www/simusol.org/public_html/downloads}
# Estos valores también se pasan al shell remoto.
if [[ ! $base =~ ^/[a-zA-Z0-9_./-]+$ || $base == / || /${base#/}/ == */../* || /${base#/}/ == */./* ]]; then
    echo 'subir-doc: SUBIR_DIR debe ser una ruta absoluta, sin espacios, . ni ..' >&2
    exit 2
fi
if [[ ! $servidor =~ ^[a-zA-Z0-9][a-zA-Z0-9._-]*$ || ! $usuario =~ ^[a-zA-Z0-9_][a-zA-Z0-9_-]*$ ]]; then
    echo 'subir-doc: servidor o usuario no válido' >&2
    exit 2
fi
destino=${base%/}/summapack/docs
proyecto=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
if [[ -z $documentos ]]; then
    if [[ -d "$proyecto/doc" ]]; then documentos="$proyecto/doc"; else documentos="$PWD/doc"; fi
fi
fuentes=("$documentos/summapack.pdf" "$documentos/738.pdf")
nombres=(summapack-2026.pdf sumapack-jsl-2011.pdf)
for fuente in "${fuentes[@]}"; do
    if [[ ! -s $fuente ]] || [[ $(head -c 5 -- "$fuente") != '%PDF-' ]]; then
        printf 'subir-doc: falta un PDF válido: %s\n' "$fuente" >&2
        exit 1
    fi
done
if [[ "$documentos/summapack.tex" -nt "${fuentes[0]}" ]]; then
    printf 'subir-doc: PDF desactualizado; regenerar summapack.tex con latexmk -pdf en %s\n' "$documentos" >&2
    exit 1
fi
printf 'Destino: %s@%s:%s/\n' "$usuario" "$servidor" "$destino"
for i in "${!fuentes[@]}"; do
    printf '  %s -> %s\n' "${fuentes[$i]}" "${nombres[$i]}"
done
if (( prueba )); then
    echo 'Solo prueba: no se creó ningún directorio ni se abrió ninguna conexión.'
    exit 0
fi
command -v rsync >/dev/null || { echo 'subir-doc: falta rsync' >&2; exit 1; }
temporal=$(mktemp -d /tmp/summapack-doc.XXXXXXXX)
trap 'rm -f -- "$temporal/summapack-2026.pdf" "$temporal/sumapack-jsl-2011.pdf"; rmdir -- "$temporal"' EXIT
for i in "${!fuentes[@]}"; do
    cp -- "${fuentes[$i]}" "$temporal/${nombres[$i]}"
done
respaldo=".anteriores/$(date -u +%Y%m%dT%H%M%SZ)-${temporal##*.}"
opciones=(-rtp --checksum --itemize-changes --chmod=D755,F644 --backup "--backup-dir=$respaldo" --delay-updates)
if [[ $servidor == local ]]; then
    [[ -d ${destino%/docs} ]] || { printf 'subir-doc: no existe el proyecto destino: %s\n' "${destino%/docs}" >&2; exit 1; }
    [[ ! -L $destino ]] || { echo 'subir-doc: docs no debe ser un enlace simbólico' >&2; exit 1; }
    [[ -d $destino ]] || mkdir -- "$destino"
    rsync "${opciones[@]}" -- "$temporal/" "$destino/"
else
    remoto="$usuario@$servidor"
    ssh -o BatchMode=yes -o ConnectTimeout=10 "$remoto" \
        "if ! test -d '${destino%/docs}'; then echo 'subir-doc: no existe el proyecto destino: ${destino%/docs}' >&2; exit 1; fi; test ! -L '$destino' && { test -d '$destino' || mkdir -- '$destino'; }"
    rsync "${opciones[@]}" -e 'ssh -o BatchMode=yes -o ConnectTimeout=10' -- "$temporal/" "$remoto:$destino/"
fi
printf 'Documentos publicados. Enlaces relativos para el sitio:\n'
printf '  /downloads/summapack/docs/%s\n' "${nombres[@]}"
