#!/usr/bin/env bash
# desc: Actualizar las secciones del fichero JSON de centro

FICH_CONF_CENTRO="/usr/share/vitalinux/conf-centro/vx-centro.conf.json"

help() {
    echo "#> $(basename "${0}"): Actualiza las secciones de un fichero JSON. Por defecto, las del JSON del centro."
    echo ">> Es necesario pasar parámetros para indicar que deseamos hacer."
    echo "#> Uso de parámetros (todos opcionales):"
    echo -e "\t'-f': Indica la ruta del fichero JSON principal a actualizar. Si no se indica lo contrario será el fichero de configuración del centro: ${FICH_CONF_CENTRO}"
    echo -e "\t'-s': Indica la ruta del fichero JSON auxiliar que contiene la sección a actualizar del JSON principal. El nombre de este fichero auxiliar deberá corresponderse con el de la sección descrita en su interior"
    echo -e "\t'-d': Indica el directorio que contiene los JSON auxiliares que contienen las secciones a actualizar del JSON principal"
    echo "#> Uso: $(basename "${0}") [-f fichero-principal.json] [-s fichero-seccion_a_actualizar.json]"
    echo -e "Ej. $(basename "${0}") '-f' '/tmp/mi-fichero.json' '-s' '/tmp/seccion_a_actualizar.json'"
    exit 1
}

error() {
    echo "${1}"
    exit 2
}

while getopts :hf:s:d: OPT; do
    case "${OPT}" in
        f) FICH_CONF_CENTRO="${OPTARG}" ;;
        s) FICH_AUXILIAR="${OPTARG}"
            SECCION="$(basename "${FICH_AUXILIAR%.json}")"
        ;;
        d) DIR_AUXILIAR="${OPTARG}" ;;
        \?) help ;;
        :) help ;;
        h | *) help ;;
    esac
done

actualizar_json() {
    _FICH_AUXILIAR="${1}"
    _SECCION="${2}"
    # Actualizamos o creamos la sección:
    jq --slurpfile nueva "${_FICH_AUXILIAR}" \
    ".\"${_SECCION}\" = \$nueva[0].\"${_SECCION}\"" \
    "${FICH_CONF_CENTRO}" | sponge "${FICH_CONF_CENTRO}" && \
    echo "✔️ ${FICH_CONF_CENTRO}: Sección \"${_SECCION}\" actualizada correctamente" || \
    echo "❌ ${FICH_CONF_CENTRO}: Problemas aactualizar la sección \"${_SECCION}\""
}

comprobar_integridad_json() {
    _FICH="${1}"
    if ! jq empty "${_FICH}" > /dev/null 2>&1 ; then
        error "❌ ${_FICH}: fichero JSON mal formado. Salimos"
        exit 3
    fi
}

comprobar_seccion_json() {
    _SECCION="${1}"
    # Comprobamos si la sección ya existe en JSON principal:
    if jq -e "has(\"${_SECCION}\")" "${FICH_CONF_CENTRO}" >/dev/null; then
        echo "✅ ${FICH_CONF_CENTRO}: La sección \"${_SECCION}\" existe, se actualizará."
    else
        echo "ℹ️  ${FICH_CONF_CENTRO}: La sección \"${_SECCION}\" no existe, se añadirá."
    fi
}

# Comprobamos previamente de forma básica si tenemos permisos de escritura en el fichero:
if [[ -L "${FICH_CONF_CENTRO}" && ! -w "$(readlink -f "${FICH_CONF_CENTRO}")" ]] || [[ ! -w "${FICH_CONF_CENTRO}" ]] ; then
    error "❌ ${FICH_CONF_CENTRO}: No hay permisos de escritura. Salimos"
fi

# Comprobamos la integridad del JSON principal:
comprobar_integridad_json "${FICH_CONF_CENTRO}"

# Comenzamos comprobando si ha pasado un directorio con ficheros auxiliares:
if [[ -d "${DIR_AUXILIAR}" ]] ; then
    # echo "#> ${DIR_AUXILIAR}: Analizamos los ficheros auxiliares del directorio auxiliar"
    for FICH in "${DIR_AUXILIAR}"/*.json; do
        _SECCION="$(basename "${FICH%.json}")"
        _FICH_AUXILIAR="${FICH}"
        # echo "#> ${_FICH_AUXILIAR}. Analizamos integridad y actualizamos sección ${_SECCION}"
        comprobar_integridad_json "${_FICH_AUXILIAR}"
        comprobar_seccion_json "${_SECCION}"
        actualizar_json "${_FICH_AUXILIAR}" "${_SECCION}"
    done
fi

# Comprobamos la integridad del fichero auxiliar en el caso de haberse indicado vía parámetro:
if [[ "${FICH_AUXILIAR}" ]]; then
    comprobar_integridad_json "${FICH_AUXILIAR}"
    comprobar_seccion_json "${SECCION}"
    actualizar_json "${FICH_AUXILIAR}" "${SECCION}"
fi

exit 0