#!/bin/bash

# ======================================================================
# Archivo:       createiso
# Ruta:          /usr/local/bin/
# Autor:         Charlie Martínez® <cmartinez@quirinux.org>
# Licencia:      https://www.gnu.org/licenses/gpl-2.0.txt
# Propósito:     Crear iso a partir de distro master
# Distribución:  Quirinux 2.x
# ======================================================================

#
# Copyright (c) 2019-2025 Charlie Martínez, derechos reservados.
# Licencia: https://www.gnu.org/licenses/gpl-2.0.txt
# Usos autorizados y no autorizados de la marca Quirinux:
# Ver https://www.quirinux.org/aviso-legal
#

#
# Este script fue creado para Quirinux 2.0 y sirve para automatizar 
# la creación de una iso por medio de la utilidad Penguin's Eggs 
# de Piero Proietti, que personaliza el GRUB y Calamares por medio de
# wardrobe.
# 
# Este script fue hecho inicialmente para funcionar sólo con el wardrobe
# "quirinux". Si no está utilizando el wardrobe "quirinux". Para que las
# funciones _rev y _calamares sean efectivas, necesitará usar el wardrobe
# "quirinux" o bien modificar su estructura siguiendo como ejemplo el 
# wardrobe "quirinux".
#
# Copyright (c) 2019-2025 Charlie Martinez. Derechos Reservados
# Licencia https://www.gnu.org/licenses/gpl-2.0.txt
# Usos permitidos y no autorizados de la marca Quirinux:
# Consultar en https://www.quirinux.org/aviso-legal
 
# ----------------------------------------------------------------------
# Modo TEST (NUEVO)
# ----------------------------------------------------------------------

TEST_MODE=0
if [[ "$1" == "--test" ]]; then
    TEST_MODE=1
    echo ">>> MODO TEST ACTIVADO (no se modificarán archivos ni se creará la ISO)"
    echo
fi

# ----------------------------------------------------------------------
# Variables
# ----------------------------------------------------------------------
	
source "/opt/createmaster/var_distro"     # Variables de la distribución
source "/opt/createmaster/functions"
	
ARCHIVO_QML="$DISTRO_PATH/.wardrobe/vendors/$DISTRO_NAME/theme/calamares/branding/show.qml"

# ----------------------------------------------------------------------
# Funciones globales
# ----------------------------------------------------------------------

source "/opt/createmaster/functions"

# ----------------------------------------------------------------------
# Funciones locales
# ----------------------------------------------------------------------

function _rev() {

    local REV_ACTUAL=0

    if grep -q "Rev\." "$ARCHIVO_QML"; then
        REV_ACTUAL=$(grep -oP 'Rev\. \d+' "$ARCHIVO_QML" | head -n1 | awk '{print $2}')
        [[ "$REV_ACTUAL" =~ ^[0-9]+$ ]] || REV_ACTUAL=0
    fi

    echo "Número de revisión actual: $REV_ACTUAL"
    echo "¿Mantener este número? [s/n]"
    read -r RESPUESTA

    if [[ "$RESPUESTA" =~ ^[sS]$ ]]; then
        REVISION="$REV_ACTUAL"
    else
        echo "Introduce el nuevo número de revisión (0 = sin revisión):"
        read -r REVISION
        [[ "$REVISION" =~ ^[0-9]+$ ]] || REVISION=0
    fi

    if [[ "$REVISION" -gt 0 ]]; then
        FECHA_ACTUAL=$(date +"%d-%m-%Y")
    else
        FECHA_ACTUAL=""
    fi
}

# ----------------------------------------------------------------------

function _calamares() {

    local ARCHIVOS=(
        "$DISTRO_PATH/.wardrobe/vendors/$DISTRO_NAME/theme/calamares/branding/show.qml"
        "/etc/calamares/branding/$DISTRO_NAME/show.qml"
    )

    local BASE_VERSION="<b>Versión:</b> $DISTRO_VERSION ${DISTRO_RELEASE^^} $DISTRO_DATE_RELEASE"
    local VERSION_FINAL

    if [[ "$REVISION" -gt 0 ]]; then
        VERSION_FINAL="$BASE_VERSION | Rev. $REVISION [$FECHA_ACTUAL]"
    else
        VERSION_FINAL="$BASE_VERSION"
    fi

    for ARCHIVO in "${ARCHIVOS[@]}"; do
        [[ -f "$ARCHIVO" ]] || continue

        echo "Procesando: $ARCHIVO"

        if [[ "$TEST_MODE" -eq 1 ]]; then
            echo "---- SIMULACIÓN ----"
            sed \
                -e "s@<h1>[^<]*</h1>@<h1>$DISTRO_NAME GNU/Linux Versión $DISTRO_VERSION</h1>@g" \
                -e "s@<b>Versión:</b>[^<]*<br/><br/>@$VERSION_FINAL <br/><br/>@g" \
                "$ARCHIVO"
            echo "--------------------"
        else
            sed -i \
                -e "s@<h1>[^<]*</h1>@<h1>$DISTRO_NAME GNU/Linux Versión $DISTRO_VERSION</h1>@g" \
                -e "s@<b>Versión:</b>[^<]*<br/><br/>@$VERSION_FINAL <br/><br/>@g" \
                "$ARCHIVO"
        fi
    done
}

# ----------------------------------------------------------------------

function _eggsyaml() {

    local eggs_yaml="/etc/penguins-eggs.d/eggs.yaml"
    local latest_kernel

    latest_kernel=$(ls -1 /boot/vmlinuz-* | sort -V | tail -n1 | sed 's|/boot/vmlinuz-||')

    if [[ -z "$latest_kernel" ]]; then
        echo "Error: No se pudo determinar la versión más reciente del kernel."
        exit 1
    fi

    if [[ "$TEST_MODE" -eq 1 ]]; then
        echo "TEST: eggs.yaml se actualizaría con kernel $latest_kernel"
        return
    fi

    sed -i "s|^initrd_img: .*|initrd_img: /boot/initrd.img-$latest_kernel|" "$eggs_yaml"
    sed -i "s|^vmlinuz: .*|vmlinuz: /boot/vmlinuz-$latest_kernel|" "$eggs_yaml"
}

# ----------------------------------------------------------------------

function _createiso() {

    if [[ "$TEST_MODE" -eq 1 ]]; then
        echo "TEST: se ejecutaría eggs produce"
        return
    fi

    if [[ "$1" == "-f" ]]; then
        eggs produce --theme "$DISTRO_NAME" --release -f -n
    else
        eggs produce --theme "$DISTRO_NAME" --release --pendrive -n
    fi
}

# ----------------------------------------------------------------------

function _isoname() {

    [[ "$TEST_MODE" -eq 1 ]] && return

    ISO_ORIGINAL=$(find /home/eggs/.mnt/ -type f -name "*.iso" | head -n 1)

    if [ -n "$ISO_ORIGINAL" ]; then
        ISO_NOMBRE="${DISTRO_NAME}-${DISTRO_VERSION}-${DISTRO_RELEASE^}_x64"
        [[ "$REVISION" -gt 0 ]] && ISO_NOMBRE="${ISO_NOMBRE}_Rev${REVISION}"
        ISO_NOMBRE="${ISO_NOMBRE}.iso"
        mv "$ISO_ORIGINAL" "$DISTRO_PATH/Escritorio/$ISO_NOMBRE"
    fi
}

# ----------------------------------------------------------------------

function _md5sum() {	
	
    [[ "$TEST_MODE" -eq 1 ]] && return

    ISO_BASE="${ISO_NOMBRE%.iso}"
    if [ -e "$DISTRO_PATH/Escritorio/$ISO_NOMBRE" ]; then  
        cd "$DISTRO_PATH/Escritorio" || exit 1
        md5sum "$ISO_NOMBRE" > "${ISO_BASE}.md5"
    fi
}

# ----------------------------------------------------------------------

function _bye() {
	
    if [[ "$TEST_MODE" -eq 1 ]]; then
        echo
        echo ">>> FIN DEL TEST: no se modificó ningún archivo"
        return
    fi

    if [ -e "${ISO_BASE}.md5" ]; then
        echo "¡ISO Creada! Almacenada en escritorio de $DISTRO_PATH"
    fi
}

# ======================================================================
# Ejecución de funciones
# ======================================================================
_rootcheck			# Global	# /opt/createmaster/functions
_internet			# Global	# /opt/createmaster/functions
cleanmaster			# /usr/local/bin/cleanmaster
_rev				# Local
_calamares			# Local
_eggsyaml			# Local
_createiso			# Local
_isoname			# Local
_md5sum				# Local
_bye				# Local
