#!/bin/bash


help() {
    echo "#> ${0}: Script encargado de gestionar ciertos parámetros del salvapantallas y el bloqueo de pantalla."
    echo ">> Es necesario pasar parámetros para indicar que deseamos hacer."
    echo "#> Uso de parámetros (todos opcionales):"
    echo -e "\t'-l': Lock. Admite como valores true|false para activar o desactivar el bloqueo de pantalla."
    echo -e "\t'-p': Lock with Screensaver. Bloqueamos la pantalla al saltar el salvapantallas."
    echo -e "\t'-d': Directory Slideshow. Recibe como parámetro el directorio que contiene las imágenes del slideshow que se mostrará en el salvapantallas."
    echo -e "\t'-t': Time Delay. Tiempo en minutos de inactividad tras el los cuales se mostrará el salvapantallas."
    echo -e "\t'-s': Show Properties. Muestra los parámetros de configuración establecidos."
    echo "#> Uso: $0 [-l true|false] [-p true|false] [-t minutos] [-d ruta_directorio] [-s]"
    echo -e "Ej. ${0} '-l' 'false' '-d' '/ruta/directorio/imagenes-slideshow' '-t' '15'"
    exit 1
}

[[ "${#}" == 0 ]] && help

while getopts :hl:d:t:p:s OPT; do
    case "${OPT}" in
        l) LOCK="${OPTARG}" ;;
        p) LOCKWITHSCREENSAVER="${OPTARG}" ;;
        d) DIRECTORIO="${OPTARG}" ;;
        t) DELAY="${OPTARG}" ;;
        s) MOSTRAR="true" ;;
        \?) help ;;
        :) help ;;
        h | *) help ;;
    esac
done

RUTA_REL_XML=".config/xfce4/xfconf/xfce-perchannel-xml/xfce4-screensaver.xml"
HOMEUSUARIO="$(vx-home-usuario-grafico)"
RUTA_SKEL="/etc/skel"

PROBLEMA_CONGELACION="false"
dpkg -l | grep -q "vx-dga-l-congelar-escritorio" && \
PROBLEMA_CONGELACION="true" && \
echo "#> Warning: El equipo tiene el Escritorio congelado. Debe ejecutarse este script como usuario root para modificar el patrón de congelación."

FICHEROS=( "${HOMEUSUARIO}/${RUTA_REL_XML}" )
if [[ "${DIRECTORIO}" || "${DELAY}" || "${LOCK}" ]] ; then
    [[ $(whoami) == "root" ]] && FICHEROS+=( "${RUTA_SKEL}/${RUTA_REL_XML}" )
    echo "#> Ficheros a modificar por $(whoami): ${FICHEROS[*]}"
fi

function modificar_parametros() {
    # Función encargada de modificar parámetros sueltos del fichero XML:
    PROP="${1}"
    VALOR="${2}"
    for FICH in "${FICHEROS[@]}" ; do
        # Comprobamos que el fichero y la propiedad a actualizar existen antes de tratar de modificarla:
        [[ -f "${FICH}" ]] && \
        xmlstarlet sel -t -v "${PROP}" "${FICH}" > /dev/null 2>&1 && \
        echo "#> ${FICH}: ${PROP} => ${VALOR}" && \
        xmlstarlet ed -u "${PROP}" -v "${VALOR}" "${FICH}" | sponge "${FICH}"
    done
}

# Personalización el delay en minutos que tardará en mostrarse el salvapantallas:
if [[ "${DELAY}" ]] ; then
    # Para el delay tras el cual entra en juego el salvapantallas:
    # /channel → nodo raíz.
    # /property[@name="saver"] → primer nivel bajo <channel>.
    # /property[@name="idle-activation"] → hijo de saver.
    # /property[@name="delay"]/@value → atributo value del nodo delay.
    PROP='/channel/property[@name="saver"]/property[@name="idle-activation"]/property[@name="delay"]/@value'
    VALOR="${DELAY}"
    # Comprobamos que valor es un número entero:
    [[ "${VALOR}" =~ ^[0-9]+$ ]] && \
    modificar_parametros "${PROP}" "${VALOR}" || \
    echo "#> Error: No se puede asignar ${VALOR} como delay en minutos. Tiene que ser un número entero."
fi

# Personalización del estado del bloqueo de pantalla: true|false
if [[ "${LOCK}" ]] ; then
    PROP='/channel/property[@name="lock"]/property[@name="enabled"]/@value'
    VALOR="${LOCK}"
    if [[ "${VALOR}" =~ ^true$|^false$ ]] ; then
        # Configuramos el lock:
        modificar_parametros "${PROP}" "${VALOR}" || \
        echo "#> Error: No se puede asignar ${VALOR} al estado del bloqueo de pantalla. Sólo puede ser true o false."
        # Indicamos que el Locker actua al activarse el salvapantallas: lock/saver-activation
        # PROP='/channel/property[@name="lock"]/property[@name="saver-activation"]/property[@name="enabled"]/@value'
        # modificar_parametros "${PROP}" "${VALOR}" || \
        # echo "#> Error: ${PROP}. No se puede asignar ${VALOR} a esa propiedad"
    else
        echo "#> Error: ${PROP}. No se puede asignar ${VALOR} al estado del bloqueo de pantalla. Sólo puede ser true o false."
    fi
fi

# Comprobamos si hay que bloquear la pantalla al saltar el salvapantallas:
if [[ "${LOCKWITHSCREENSAVER}" ]] ; then
    PROP='/channel/property[@name="lock"]/property[@name="saver-activation"]/property[@name="enabled"]/@value'
    VALOR="${LOCKWITHSCREENSAVER}"
    if [[ "${VALOR}" =~ ^true$|^false$ ]] ; then
        # Configuramos:
        modificar_parametros "${PROP}" "${VALOR}" || \
        echo "#> Error: No se puede asignar ${VALOR} al estado del bloqueo de pantalla. Sólo puede ser true o false."
        # Indicamos que el Locker actua al activarse el salvapantallas: lock/saver-activation
    else
        echo "#> Error: ${PROP}. No se puede asignar ${VALOR} al estado del bloqueo de pantalla. Sólo puede ser true o false."
    fi
fi


# Personalización de la ruta donde se ubican las imágenes del slideshow:
# xmlstarlet sel -t -v "${PROPS_FILES[1]}" "${FICH}"
# xmlstarlet ed -u "${PROPS_FILES[0]}" -v "/tmp/otro" -u "${PROPS_FILES[1]}" -v "--location=/tmp/otro" "${FICH}"
if [[ "${DIRECTORIO}" ]] ; then
    PROPS_FILES=(
        '/channel/property[@name="screensavers"]/property[@name="xfce-personal-slideshow"]/property[@name="location"]/@value'
        '/channel/property[@name="screensavers"]/property[@name="xfce-personal-slideshow"]/property[@name="arguments"]/@value'
    )
    VALOR="${DIRECTORIO}"
    for FICH in "${FICHEROS[@]}" ; do
        # Comprobamos que el fichero y la propiedad a actualizar existen antes de tratar de modificarla:
        [[ -f "${FICH}" ]] && \
        xmlstarlet sel -t -v "${PROPS_FILES[0]}" "${FICH}" > /dev/null 2>&1 && \
        xmlstarlet sel -t -v "${PROPS_FILES[1]}" "${FICH}" > /dev/null 2>&1 && \
        echo "#> ${FICH}: ${PROPS_FILES[0]} => ${VALOR} y ${PROPS_FILES[1]} => --location=${VALOR}" && \
        xmlstarlet ed -u "${PROPS_FILES[0]}" -v "${VALOR}" -u "${PROPS_FILES[1]}" -v "--location=${VALOR}" "${FICH}" | sponge "${FICH}"
    done
fi

if [[ "${MOSTRAR}" == "true" ]] ; then
    PROPS_FILES=(
        '/channel/property[@name="screensavers"]/property[@name="xfce-personal-slideshow"]/property[@name="location"]/@value'
        '/channel/property[@name="screensavers"]/property[@name="xfce-personal-slideshow"]/property[@name="arguments"]/@value'
        '/channel/property[@name="lock"]/property[@name="enabled"]/@value'
        '/channel/property[@name="saver"]/property[@name="idle-activation"]/property[@name="delay"]/@value'
    )
    FICHEROS=( "${HOMEUSUARIO}/${RUTA_REL_XML}" "${RUTA_SKEL}/${RUTA_REL_XML}" )
    echo "#> Propiedades básicas de la configuración del salvapantallas:"
    for FICH in "${FICHEROS[@]}" ; do
        [[ ! -f "${FICH}" ]] && continue
        echo -e ":> Fichero: ${FICH}"
        for PROP in "${PROPS_FILES[@]}" ; do
            # Comprobamos si el valor existe para mostrarlo:
            if VALOR="$(xmlstarlet sel -t -v "${PROP}" "${FICH}")" ; then
                echo -e "\t::> Prop: ${PROP} => Val: ${VALOR}"
            fi
        done
    done
fi
