#!/bin/bash

# ======================================================================
# Archivo:       createmaster
# Ruta:          /usr/local/bin/
# Autor:         Charlie Martínez® <cmartinez@quirinux.org>
# Licencia:      https://www.gnu.org/licenses/gpl-2.0.txt
# Propósito:     Ejecutable createmaster
# Distribución:  Quirinux 2.x
# ======================================================================

# Información sobre createmaster:
#
# Este script fue creado para Quirinux 2.x y sirve para personalizar los
# paquetes de una instalación fresca de 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.
#

# ----------------------------------------------------------------------
# Variables
# ----------------------------------------------------------------------

	source "/opt/createmaster/var_distro" # Variables de la distribución
	source "/opt/createmaster/lang/lang_createmaster" # Traducciones del programa
	
    # MÓDULOS QUE CONFORMARÁN LA DISTRO:
    #
    # Edita (quita o agrega) aquí los móduloes que van a integrar el master
    # de la distribución.
    #
    # Estos módulos tienen que estar almacenados dentro de /opt/createmaster/mods/categoria
    # Ejemplo /opt/createmaster/mods/accesories
    # 
    # Puedes crear nuevos módulos. Los módulos son ficheros de variables.
    # La sintaxis de los módulos tiene que ser precisa:
    #
    # Ejemplo de módulo válido:
    #
    # Nombre: kruler_mod
    #
    # Contenido:
    #
    # MOD_NAME="mintinstall_mod"
    # MOD_PACKS="mintinstall flatpak flatpakconfig"
    # MOD_MENU="Centro de Software (Mintinstall)"
    #
    
	ESTANDAR_MODS=("audio_mod" "printers_mod") # Modulos para tu distro base
	ESPECIFIC_MODS=("kruler_mod" "galculator_mod" "kdenlive_mod") # Módulos específicos
	REMOVE_MODS=("libreoffice_mod") # Se borrarán de la instalación actual de tu master
	MODS_DIR="/opt/createmaster/mods"
	
# ======================================================================
# Funciones globales
# ======================================================================

	source "/opt/createmaster/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 INSTALL_OF) ${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 _main() {
clear
echo " CreateMaster®, Copyright (c) 2019-2025 Charlie Martínez GPLv2"
echo " -----------------------------------------------------------------------------
 $(_msg CREATOR) ${DISTRO_NAME^^} $(_msg VERSION) ${DISTRO_VERSION^^}
 -----------------------------------------------------------------------------"
echo "${DISTRO_SPLASH}"
    sleep 1
    if [ ! -e /opt/createmaster/requirements/ ]; then
    mkdir -p /opt/createmaster/requirements/
    fi

	if [ ! -e /opt/createmaster/requirements/ok-depends ]; then    
		printf "%s\n" "$(_msg WARNING)" 

	fi
    sleep 0.1
    echo "
 1 $(_msg CONTINUE)
 0 $(_msg EXIT)
"
    read -p " $(_msg ANSWER) " opc
    case $opc in
    "1") # Continuar
        clear      
        _depends
        _lang 
        _menu_main
        ;;
    "0") #Salir
        clear
        exit 0
        ;;
      *) #Error
        echo "$(_msg ERROR)"
        sleep 0.1
        _main    
        ;;
    esac

}

function _help() {
	# Mostrar el texto principal de la ayuda
    local texto_help=$(_msg HELP_TEXT)

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

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


function _standar_msg() {
	# Mostrar si todos los programas específicos ya han sido instalados
    dialog --backtitle "$(_copyright)" \
        --title "$(_msg CONTRATULATIONS)" \
        --msgbox "$(_msg ALL_STANDAR)" 23 100

}

function _specific_msg() {
	# Mostrar si todos los programas específicos ya han sido instalados
    dialog --backtitle "$(_copyright)" \
        --title "$(_msg CONTRATULATIONS)" \
        --msgbox "$(_msg ALL_SPECIFIC)" 23 100

}

function _complete_msg() {
	# Mostrar que todos los programas específicos ya han sido instalados
    dialog --backtitle "$(_copyright)" \
        --title "$(_msg CONTRATULATIONS)" \
        --msgbox "$(_msg ALL_PROGRAMS)" 23 100

}

function _standar_msg() {
	# Mostrar si todos los programas específicos ya han sido instalados
    dialog --backtitle "$(_copyright)" \
        --title "$(_msg STANDAR_PROGRAMS)" \
        --msgbox "$(_msg STANDAR_INSTALL)" 23 100

}

function _specific_msg() {
	# Función para mostrar si todos los programas específicos ya han sido instalados
    dialog --backtitle "$(_copyright)" \
        --title "$(_msg SPECIFIC_PROGRAMS)" \
        --msgbox "$(_msg SPECIFIC_INSTALL)s." 23 100

}

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

function _standar() {
    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/createmaster/requirements/ok-standar    
    _standar_msg
}

function _specific() {
    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/createmaster/requirements/ok-specific
    _specific_msg
}

function _menu_standar() {
    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_specific() {
    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_complete() {
	clear
	if [ -e /opt/createmaster/requirements/ok-standar ]; then
		_update
		_specific
		_complete_msg
	else
		_standar
		_specific
		_complete_msg
	fi
}

function _complete() {
	clear
	_remove
	_semi_complete
}

function _menu_main() {
	# 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 "$(_msg HELP_OPTION)" \
        9 $(_msg EXIT))
    echo $opPrincipal

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

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

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

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

    if [[ "$opPrincipal" == "5" ]]; then # Instalar componentes específicos sueltos
        clear
        _menu_specific
        _menu_main
    fi
    
    if [[ "$opPrincipal" == "6" ]]; then # Instación completa sin borrar nada
        clear
        _semi_complete
        _menu_main
    fi
    if [[ "$opPrincipal" == "7" ]]; then # Instación completa (borra lo que no necesita)
        clear
        _complete
        _menu_main
    fi    
    
    if [[ "$opPrincipal" == "8" ]]; then # Mostrar ayuda
       clear
       _help
       _menu_main       
    fi

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

}

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