#!/bin/bash

# ======================================================================
# Fichero:		crearmaster
# Autor:		Charlie Martínez® <cmartinez@quirinux.org>
# Licencia:		https://www.gnu.org/licenses/gpl-2.0.txt
# Utilidad:		Ejecutable creador de distro master
# Distro:		Quirinux 2.0

#
# Este script fue creado para Quirinux 2.0 y sirve para personalizar los
# paquetes de una distro Devuan con el objetivo de convertirla
# en una distro Master personalizada a partir de la cual se generarán
# las iso live necesarias para su reproducción.
#
# 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
#

# ======================================================================
# Variables
# ======================================================================

	source "/opt/isocreate/var_distro" # Variables de la distribución
	source "/opt/isocreate/lang" # Traducciones del programa
	
	# Edit by yourself:
	ESTANDAR_MODS=("audio_mod" "printers_mod")
	ESPECIFIC_MODS=("kruler_mod" "galculator_mod" "kdenlive_mod")
	REMOVER_MODS=("libreoffice_mod")
	MODS_DIR="/opt/isocreate/mods"
	
# ======================================================================
# Funciones globales
# ======================================================================

	source "/opt/isocreate/functions"		

# ======================================================================
# Funciones locales
# ======================================================================

function _copyright() {
	# Función para generar el backtitle alineado a la izquierda y derecha correctamente
    local width=$(tput cols)  # Obtener el ancho de la terminal
    local left_text="$(_msg DISTRO_TEXT) ${DISTRO_NAME^^} GNU/LINUX V.${DISTRO_VERSION}"
    local right_text="CreateMaster®, Copyright (c) 2019-2025 Charlie Martínez GPLv2"

    # Definir un espacio de seguridad para evitar que el texto se corte
    local safe_width=$((width - 2))  # Restamos 2 para márgenes
    local max_left_length=$((safe_width / 2))  # Máximo para el texto izquierdo
    local max_right_length=$((safe_width / 2)) # Máximo para el texto derecho

    # Acortar los textos si son más largos que su espacio asignado
    if (( ${#left_text} > max_left_length )); then
        left_text="${left_text:0:max_left_length-1}…"
    fi
    if (( ${#right_text} > max_right_length )); then
        right_text="${right_text:0:max_right_length-1}…"
    fi

    # Calcular el padding entre los textos
    local padding=$((safe_width - ${#left_text} - ${#right_text}))

    # Si el espacio es muy pequeño, forzar al menos un espacio
    if (( padding < 1 )); then
        padding=1
    fi

    # Construir la línea con alineación manual
    printf "%s%*s%s" "$left_text" "$padding" "" "$right_text"
}

function _bienvenida() {
clear
echo " CreateMaster®, Copyright (c) 2019-2025 Charlie Martínez GPLv2"
echo " -----------------------------------------------------------------------------
 CREADOR ${DISTRO_NAME^^} VERSIÓN: ${DISTRO_VERSION^^}
 -----------------------------------------------------------------------------"
echo "${DISTRO_SPLASH}"
    sleep 1
if [ ! -e /opt/isocreate/requisitos/ok-dependencias ]; then    
    echo "
 --------------------------------------------------------------------
 | A continuación se instalarán algunos programas que el instalador | 
 | necesita para funcionar, procedimiento 100% seguro.              |
 --------------------------------------------------------------------"
 fi
    sleep 0.1
    echo "
 1 Continuar
 0 Salir.
"
    read -p " Tu respuesta-> " opc
    case $opc in
    "1") # Continuar
        clear      
        _depends
        _lang 
        _menu_principal
        ;;
    "0") #Salir
        clear
        exit 0
        ;;
      *) #Salir
        echo "ERROR: Opción inválida. Debe ingresar 1 ó 0."
        sleep 0.1
        _bienvenida    
        ;;
    esac

}

function _ayuda() {
	# Función para mostrar el texto principal de la ayuda
    local texto_ayuda=$(_msg HELP_TEXT)

    echo -e "$texto_ayuda" > /tmp/ayuda.txt

    dialog --backtitle "$(_copyright)" \
        --title "$(_msg HELP_TITLE)" \
        --scrollbar \
        --textbox /tmp/ayuda.txt 20 100
}


function _estandar_msg() {
	# Función para mostrar si todos los programas específicos ya han sido instalados
    dialog --backtitle "$(_copyright)" \
        --title "ENORABUENA" \
        --msgbox "\n Todos los programas estándar que hacen a la base de la distribución\nse encuentran instalados en el sistema" 23 100

}

function _especificos_msg() {
	# Función para mostrar si todos los programas específicos ya han sido instalados
    dialog --backtitle "$(_copyright)" \
        --title "ENORABUENA" \
        --msgbox "\n Todos los programas específicos de ${DISTRO_NAME^}\nse encuentran instalados en el sistema" 23 100

}

function _completa_msg() {
	# Función para mostrar si todos los programas específicos ya han sido instalados
    dialog --backtitle "$(_copyright)" \
        --title "ENORABUENA" \
        --msgbox "\n Todos los programas estandar y específicos de ${DISTRO_NAME^}\nse encuentran instalados en el sistema" 23 100

}

function _estandar_msg() {
	# Función para mostrar si todos los programas específicos ya han sido instalados
    dialog --backtitle "$(_copyright)" \
        --title "ENORABUENA" \
        --msgbox "\n Se procede a instalar los programas estandar." 23 100

}

function _especificos_msg() {
	# Función para mostrar si todos los programas específicos ya han sido instalados
    dialog --backtitle "$(_copyright)" \
        --title "ENORABUENA" \
        --msgbox "\n Se procede a instalar los programas específicos." 23 100

}

function _remover() {
    clear
    for mod in "${REMOVER_MODS[@]}"; do
        mod_path=$(_buscar_mod "$mod")
        if [[ -n "$mod_path" ]]; then
            _remove_mod "$mod_path"
        fi
    done
}

function _estandar() {
    clear
    _update
    for mod in "${ESTANDAR_MODS[@]}"; do
        mod_path=$(_buscar_mod "$mod")
        if [[ -n "$mod_path" ]]; then
            _install_mod "$mod_path"
        fi
    done
    touch /opt/createiso/requisitos/ok-estandar    
    _estandar_msg
}

function _especificos() {
    clear
    _update
    for mod in "${ESPECIFIC_MODS[@]}"; do
        mod_path=$(_buscar_mod "$mod")
        if [[ -n "$mod_path" ]]; then
            _install_mod "$mod_path"
        fi
    done
    touch /opt/createiso/requisitos/ok-especificos
    _especificos_msg
}

function _menu_estandar() {
    clear
    local options=()
    for mod in "${ESTANDAR_MODS[@]}"; do
        mod_path=$(_buscar_mod "$mod")
        if [[ -n "$mod_path" ]]; then
            mod_menu=$(grep "MOD_MENU" "$mod_path" | cut -d'=' -f2)
            options+=("$mod" "$mod_menu" off)
        fi
    done

    local selections=$(dialog --title "INSTALAR MÓDULOS ESTANDAR DE TODA DISTRO"\
    --backtitle "$(_copyright)" \
    --checklist "Desplazarse ↑↓ ← →  | <Space> Seleccionar |  <Enter> Confirmar" 15 65 10 "\
    ${options[@]}" 2>&1 >/dev/tty)
    clear
    for mod in $selections; do
        mod_path=$(_buscar_mod "$mod")
        if [[ -n "$mod_path" ]]; then
            _install_mod "$mod_path"
        fi
    done
}

function _menu_especificos() {
    clear
    local options=()
    for mod in "${ESPECIFIC_MODS[@]}"; do
        mod_path=$(_buscar_mod "$mod")
        if [[ -n "$mod_path" ]]; then
            mod_menu=$(grep "MOD_MENU" "$mod_path" | cut -d'=' -f2)
            options+=("$mod" "$mod_menu" off)
        fi
    done

    local selections=$(dialog --title "INSTALAR MÓDULOS ESPECÍFICOS DE ${DISTRO_NAME^^}" \
     --backtitle "$(_copyright)" \
     --checklist "Desplazarse ↑↓ ← →  | <Space> Seleccionar |  <Enter> Confirmar" 15 65 10 "\
     ${options[@]}" 2>&1 >/dev/tty)
    clear
    for mod in $selections; do
        mod_path=$(_buscar_mod "$mod")
        if [[ -n "$mod_path" ]]; then
            _install_mod "$mod_path"
        fi
    done
}

function _semi_completa() {
	clear
	if [ -e /opt/createiso/requisitos/ok-estandar ]; then
		_update
		_especificos
		_completa_msg
	else
		_estandar
		_especificos
		_completa_msg
	fi
}

function _completa() {
	clear
	_remover
	_semi_completa
}

function _menu_principal() {
	# Función para mostrar el menú principal
	clear
    opPrincipal=$(dialog --title "MENÚ PRINCIPAL" --backtitle "$(_copyright)" \
		--nocancel \
        --stdout \
        --menu "Desplazarse: ↑↓ | Confirmar: <Enter>" 16 65 8 \
        1 "Remover componentes que ${DISTRO_NAME^} no incluye" \
        2 "Instalar colección de programas estándar" \
        3 "Instalar colección de programas específicos" \
        4 "Instalar programas estandar sueltos" \
        5 "Instalar programas específicos sueltos" \
        6 "Instalación completa sin remover componentes" \
        7 "Instalación completa (${DISTRO_NAME^} Master)" \
        8 "Ayuda" \
        9 "Salir")
    echo $opPrincipal

    _checkrepo
    
    if [[ "$opPrincipal" == "1" ]]; then # Remover componentes que la derivada no incluye
        clear
        _remover
        _menu_principal
    fi

    if [[ "$opPrincipal" == "2" ]]; then # Instalar componentes estándar para toda derivada
        clear
        _estandar
        _menu_principal
    fi

    if [[ "$opPrincipal" == "3" ]]; then # Instalar componentes específicos de la derivada.
        clear
        _especificos
        _menu_principal
    fi

    if [[ "$opPrincipal" == "4" ]]; then # Instalar componentes estandar sueltos
        clear
        _menu_estandar
        _menu_principal
    fi

    if [[ "$opPrincipal" == "5" ]]; then # Instalar componentes específicos sueltos
        clear
        _menu_especificos
        _menu_principal
    fi
    
    if [[ "$opPrincipal" == "6" ]]; then # Instación completa sin borrar nada
        clear
        _semi_completa
        _menu_principal
    fi
    if [[ "$opPrincipal" == "7" ]]; then # Instación completa (borra lo que no necesita)
        clear
        _completa
        _menu_principal
    fi    
    
    if [[ "$opPrincipal" == "8" ]]; then # Mostrar ayuda
       clear
       _ayuda
       _menu_principal       
    fi

    if [[ "$opPrincipal" == "9" ]]; then # Salir
        clear
        _salir
    fi

}

# ======================================================================
# Ejecución de funciones
# ======================================================================
# function			# Tipo		# Source (if remote)
# ----------------------------------------------------------------------
_lang				# Global	# /opt/isocreate/functions
_rootcheck			# Global	# /opt/isocreate/functions
_verif_path			# Global	# /opt/isocreate/functions
_internet			# Global	# /opt/isocreate/functions
_bienvenida			# Local
