#!/usr/bin/env bash
# Adaptador de la sintaxis histórica de packinstall a sp.
set -euo pipefail

uso() {
    printf '%s\n' \
        'Uso: packinstall [--prueba] [--sin-upgrade] [DISTRO] PAQUETE... [Modulo::Perl...] [REPO-ppa:usuario/repositorio...]' \
        'DISTRO: DEBIAN, UBUNTU, FEDORA, REDHAT, SUSE, ARCH, GENTOO, MANDRIVA, UTUTO o PERL.' \
        'Los proyectos y paquetes Simusol conocidos se enrutan por sp a bajar-paquetes.' \
        'installsumma.sh es el arranque para maquinas que aun no tienen SummaPack.'
}

prueba=0
sin_upgrade=0
while (($#)); do
    case $1 in
        --prueba) prueba=1; shift ;;
        --sin-upgrade) sin_upgrade=1; shift ;;
        -h|--help|-help) uso; exit 0 ;;
        --version|-version) printf 'packinstall 5 (adaptador de sp)\n'; exit 0 ;;
        --man|-man) if command -v man >/dev/null 2>&1; then exec man packinstall; else uso; exit 0; fi ;;
        --) shift; break ;;
        *) break ;;
    esac
done
(($#)) || { uso >&2; exit 2; }

distro=
solo_perl=0
case ${1^^} in
    DEBIAN|UBUNTU|FEDORA|REDHAT|SUSE|ARCH|GENTOO|MANDRIVA|UTUTO)
        distro=${1,,}; shift ;;
    PERL) solo_perl=1; shift ;;
    LATEX)
        printf 'packinstall: la distribucion %s no tiene packlet en sp\n' "$1" >&2; exit 2 ;;
esac
(($#)) || { uso >&2; exit 2; }

script_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
sp=${PACKINSTALL_SP:-}
if [[ -z $sp ]]; then
    if [[ -x $script_dir/../sp/sp ]]; then
        sp=$script_dir/../sp/sp
    else
        sp=$(command -v sp || true)
    fi
fi
[[ -n $sp && -x $sp ]] || { printf 'packinstall: falta sp de SummaPack\n' >&2; exit 127; }

orden=("$sp")
((prueba == 0)) || orden+=(--ensayo)
((sin_upgrade == 0)) || orden+=(--sin-upgrade)
[[ -z $distro ]] || orden+=(--distro "$distro")
paquetes=() modulos=() repositorios=()
for argumento in "$@"; do
    if [[ $argumento == REPO-* ]]; then
        repositorios+=("${argumento#REPO-}")
    elif ((solo_perl)) || [[ $argumento == *::* ]]; then
        modulo=${argumento//--/::}
        modulos+=("$modulo")
    else
        paquetes+=("$argumento")
    fi
done

for repositorio in "${repositorios[@]}"; do
    "${orden[@]}" install REPO "$repositorio"
done
((${#paquetes[@]} == 0)) || "${orden[@]}" install "${paquetes[@]}"
((${#modulos[@]} == 0)) || "${orden[@]}" install PERL "${modulos[@]}"
