#!/bin/bash
# desc: generamos las imangenes/slideshow del screensaver personalizado para el centro educativo
# lastact: arturo@2025-10-03

# 0) Definimos las variables globales:
DIR_BASE="/usr/share/vitalinux/conf-centro"
FICH_JSON="${DIR_BASE}/vx-centro.conf.json"
OUTDIR="${DIR_BASE}/vx-screensaver/slides_default"
MOSTRAR="false"
ADD="false"

# 1) Definimos lo que será la configuración para el slideshow por defecto:
# Valores por defecto:
CURSO=( $(vx-curso-academico) )
IMAGENES=(
    "${DIR_BASE}/vx-screensaver/imgs_base_default/vx-screensaver-img1.png"
    "${DIR_BASE}/vx-screensaver/imgs_base_default/vx-screensaver-img2.png"
    "${DIR_BASE}/vx-screensaver/imgs_base_default/vx-screensaver-img3.png"
)
TEXTOS=(
    "¡Que tengas un fabuloso Curso ${CURSO[*]}!"
    "Disfruta de las bondades del Software Libre"
    "Todo tu Software Personalizado"
)

[[ -f "${FICH_JSON}" ]] && \
CENTRO="$(jq -r ".centro" "$FICH_JSON")" || \
CENTRO="Centro Educativo Vitalinux"
echo "#> Centro Educativo: ${CENTRO}"

JSON_BASE='{
    "slideshow": [
        {
            "imagen": "'"${IMAGENES[0]}"'",
            "textos": [
                { "texto": "'"${CENTRO}"'", "size": 80, "font": "Liberation-Sans" },
                { "texto": "'"${TEXTOS[0]}"'", "size": 50, "font": "Courier-New" }
            ]
        },
        {
            "imagen": "'"${IMAGENES[1]}"'",
            "textos": [
                { "texto": "'"${CENTRO}"'", "size": 80, "font": "Liberation-Sans" },
                { "texto": "'"${TEXTOS[1]}"'", "size": 50, "font": "Courier-New" }
            ]
        },
        {
            "imagen": "'"${IMAGENES[2]}"'",
            "textos": [
                { "texto": "'"${CENTRO}"'", "size": 80, "font": "Liberation-Sans" },
                { "texto": "'"${TEXTOS[2]}"'", "size": 50, "font": "Courier-New" }
            ]
        }
    ]
}'

help() {
    echo "#> $(basename "${0}"): Script encargado de crear y personalizar las imágenes del slideshow del salvapantallas de centro."
    echo ">> Es posible indicar parámetros para indicar que deseamos hacer. Uso de parámetros (todos opcionales):"
    echo -e "\t'-d': Output Directory Slideshow. Podemos personalizar el directorio donde se generarán las imágenes del slideshow."
    echo -e "\t      Por defecto: ${OUTDIR}"
    echo -e "\t'-s': Show Slideshow Configuration"
    echo -e "\t      ${FICH_JSON}: Muestra la configuración encontrada en su sección slideshow"
    echo -e "\t      Muestra la configuración que se aplicaría sin hacer uso de la opción -j"
    echo -e "\t'-j': Json Slideshow Configuration. Personaliza la configuración del slideshow a generar"
    echo -e "\t'-a': Add slides to Default Slideshow Configuration. La configuración indicada en -j se adjuntará a la de por defecto"
    echo -e "#> Uso: $(basename "${0}") [-s]"
    echo -e "                           [-d output_directory]"
    echo -e "                           [ -a][-j "'{ "slideshow": [
                                            {
                                            "imagen": "ruta_imagen_1",
                                            "textos": [
                                                        {
                                                            "texto": "centro",
                                                            "size": 80,
                                                            "font": "Liberation-Sans"
                                                        },
                                                        {
                                                            "texto": "texto_personalizado_2",
                                                            "size": 50,
                                                            "font": "Courier-New"
                                                        }
                                                    ]
                                            }
    ]}'"]"
    exit 1
}

while getopts :hd:s:j:a OPT; do
    case "${OPT}" in
        d) OUTDIR="${OPTARG}" ;;
        s) MOSTRAR="true" ;;
        j) JSON_BASE_EXT="${OPTARG}" ;;
        a) ADD="true" ;;
        \?) help ;;
        :) help ;;
        h | *) help ;;
    esac
done

[[ "$(whoami)" != "root" ]] && \
echo "#> $(basename "${0}"): Se requiere ser root para crear y personalizar las imágenes del slideshow" && \
help

[[ ! -d "${OUTDIR}" ]] && mkdir -p "${OUTDIR}" && \
echo "#> ${OUTDIR}: Creamos el directorio que contendrá las imágenes del slideshow"

# Establecemos el JSON que configurará el slideshow:
if [[ "${JSON_BASE_EXT}" ]] ; then
    if [[ "${ADD}" == "true" ]] ; then
        echo "#> Fusionamos los dos JSON: Default y aportado por el usuario"
        JSON_CONF=$(jq -s '{slideshow: (.[0].slideshow + .[1].slideshow)}' <(echo "${JSON_BASE}") <(echo "${JSON_BASE_EXT}"))
    else
        JSON_CONF="${JSON_BASE_EXT}"
    fi
else
    echo "#> No se ha aportado ningún JSON personalizado"
    JSON_CONF="${JSON_BASE}"
fi

# Número de diapositivas y tamaño:
ANCHO=1920
ALTO=1080
N_SLIDES=$(jq '.slideshow | length' <<< "${JSON_CONF}")
echo -e "#> Configuración del Slideshow: ${N_SLIDES} slides\n${JSON_CONF}"

for ((i=0; i<N_SLIDES; i++)); do
    # Leer ruta de la imagen
    IMG=$(jq -r ".slideshow[$i].imagen" <<< "${JSON_CONF}")

    # Crear fondo negro y añadir logo
    CMD="convert -size ${ANCHO}x${ALTO} xc:black"
    CMD+=" \( \"$IMG\" -resize 760x760 \) -gravity north -geometry +0+100 -composite"

    # Contar textos de esta diapositiva
    N_TEXTS=$(jq ".slideshow[$i].textos | length" <<< "${JSON_CONF}")
    echo "#> Slide Numero $(( i + 1)): ${N_TEXTS} textos"

    # Añadir cada texto con su tamaño
    for ((j=0; j<N_TEXTS; j++)); do
        TEXTO=$(jq -r ".slideshow[$i].textos[$j].texto" <<< "${JSON_CONF}")
        SIZE=$(jq -r ".slideshow[$i].textos[$j].size" <<< "${JSON_CONF}")
        FUENTE=$(jq -r ".slideshow[$i].textos[$j].font" <<< "${JSON_CONF}")

        # Calcular offset vertical (espaciado automático)
        OFFSET=$((220 - j*100))  # Ajusta según quieras separación
        CMD+=" -gravity south -pointsize ${SIZE} -fill white -font \"${FUENTE}\" -annotate +0+${OFFSET} \"${TEXTO}\""
    done

    # Archivo de salida
    CMD+=" \"${OUTDIR}/slide_$((i+1)).png\""

    # Ejecutar comando
    echo "#> Comando: ${CMD}"
    eval ${CMD}
done

echo "#> Imágenes generadas en: ${OUTDIR}"
ls -lh "${OUTDIR}"


exit 0

