#!/bin/bash

help() {
    echo "#> ${0}: Script encargado de añadir y actualizar variables a un fichero de variables"
    echo ">> Es necesario pasar 3 parámetros:"
    echo -e "\t'-f': Indicamos la ruta del fichero de variables"
    echo -e "\t'-c': Indicamos clave"
    echo -e "\t'-v': Indicamos valor"
    echo -e "\t'-e': Antes de añadir o actualizar la clave y valor comprueba si ya existe. En caso de que exista no hace nada y devuelve un 2"
    echo "#> Uso: ${0} [-c] [-f Fichero] [-c Clave] [-v Valor]"
    echo "#> Ej: ${0} -c -f /etc/default/vx-variables.conf -c Clave1 -v Valor1"
    echo "#> Ej: ${0} -f /etc/default/vx-variables.conf -c Clave1 -v Valor1"
    exit 1
}

COMPROBAR_EXISTE="false"
while getopts :hf:c:v:e OPT; do
    case "${OPT}" in
        f) FICHERO="${OPTARG}" ;;
        c) CLAVE="${OPTARG}" ;;
        v) VALOR="${OPTARG}" ;;
        e) COMPROBAR_EXISTE="true" ;;
        \?) help ;;
        :) help ;;
        h | *) help ;;
    esac
done

# Comprobamos que se han pasado los tres valores:
[[ ! "${FICHERO}" || ! "${CLAVE}" || ! "${VALOR}" ]] && help

# Comprobamos si el archivo existe, en caso contrario lo creamos:
[ ! -f "${FICHERO}" ] && \
echo "#> ${FICHERO}: no existe. Lo creamos para almacenar la clave y valor" && \
mkdir -p "$(dirname "${FICHERO}")" && \
touch "${FICHERO}"

[ ! -f "${FICHERO}" ] && \
echo "#> ${FICHERO}: no se ha podido crear. Salimos" && \
exit 3

# Comprobamos si es necesario comprobar que existe la variable antes de asignar el valor:
if "${COMPROBAR_EXISTE}" ; then
    . "${FICHERO}"
    # Comprobamos si la clave que contiene la variable existe (hacemos uso de expansión de variable):
    [[ "${!CLAVE}" ]] && \
    echo "#> ${!CLAVE}: Ya existe. No añadimos ni actualizamos dicha variable en ${FICHERO}" && \
    exit 2
fi

# Si la clave ya existe → la reemplazo
if grep -q "^${CLAVE}=" "${FICHERO}"; then
    sed -i "s|^${CLAVE}=.*|${CLAVE}=${VALOR}|" "${FICHERO}"
else
    # Si no existe → la agrego al final
    echo "${CLAVE}=${VALOR}" >> "${FICHERO}"
fi

# Ordenar alfabéticamente (inplace)
sort -o "${FICHERO}" "${FICHERO}"

exit 0

