#!/bin/bash

set -e


# Cargar el módulo de configuración de debconf
. /usr/share/debconf/confmodule

# Leer las variables de configuración
OGBOOT_ROOT="/opt/opengnsys/ogboot"
OGBOOT_API_DIR="/opt/opengnsys/ogboot/api"
db_get opengnsys/ogboot_ip
OGBOOT_IP="$RET"
db_get opengnsys/ogboot_port
OGBOOT_PORT="$RET"
db_get opengnsys/ogboot_ogcoreUrl
OGCORE_API_URL="$RET"
db_get opengnsys/ogboot_ogliveUrl
OGCORE_OGLIVE_URL="$RET"
# db_get opengnsys/ogboot_sambaUser
# SAMBA_USER="$RET"
# db_get opengnsys/ogboot_sambaUserPass
# SAMBA_PASS="$RET"


IPXE_REPO="https://github.com/ipxe/ipxe.git"

# Asegurarse de que el usuario exista
USER="opengnsys"
USER_INFO=$(getent passwd "$USER")
DEFAULT_OGLIVE=$OGCORE_OGLIVE_URL
ENV_FILE=/opt/opengnsys/ogboot/api/.env
if [ -z "$USER_INFO" ]; then
    echo "Error: El usuario '$USER' no existe." >&2
    exit 1
fi
USER_UID=$(echo "$USER_INFO" | cut -d: -f3)
USER_GID=$(echo "$USER_INFO" | cut -d: -f4)


INSTALL_OGBOOT_TARGET="/opt/opengnsys/ogboot"
fstab_entries=(
    "$INSTALL_OGBOOT_TARGET/lib/oglive.iso $INSTALL_OGBOOT_TARGET/mnt iso9660 loop,ro,users,uid=$USER_UID,gid=$USER_GID,noauto 0 0"
    "/opt/opengnsys/ogboot/tftpboot/ogLive/ogclient.sqfs /tmp/ogclient_mount squashfs loop,ro,user,noauto 0 0"
) 
fstab_file="/etc/fstab"


configure_sudo() {
    echo "Copiando configuración de sudo"
    if [ ! -f /etc/sudoers.d/opengnsys ]; then
        cp /opt/opengnsys/ogboot/etc/ogboot.sudoers /etc/sudoers.d/opengnsys
        chmod 440 /etc/sudoers.d/opengnsys
        sed -i "s|__OGBOOT_TARGET__|$OGBOOT_ROOT|g" /etc/sudoers.d/opengnsys
    else 
        echo "El archivo /etc/sudoers.d/opengnsys ya existe."
    fi 
}

add_fstab_entries(){
    echo "Añadiendo entradas a /etc/fstab"
    for entry in "${fstab_entries[@]}"; do
        if ! grep -Fxq "$entry" "$fstab_file"; then
            echo "$entry" | sudo tee -a "$fstab_file" > /dev/null
            echo "Entrada añadida a /etc/fstab: $entry"
        else
            echo "La entrada ya existe en /etc/fstab: $entry"
        fi
    done
}


update_opengnsys_user() {
    echo "Actualizando grupos del usuario opengnsys"
    usermod -aG disk "$USER"
}

configure_tftp(){
        
echo "Modificando el archivo tftpboot"

    # Comprobar si el archivo ya está desviado
    if ! dpkg-divert --list /etc/default/tftpd-hpa | grep -q "/etc/default/tftpd-hpa"; then
        echo "Creando divert para /etc/default/tftpd-hpa"
        dpkg-divert --add --rename --divert /etc/default/tftpd-hpa.orig /etc/default/tftpd-hpa
    fi

    # Copiar archivo solo si no existe en la nueva ubicación
    if [ ! -f /etc/default/tftpd-hpa ]; then
        echo "Copiando configuración de tftpd-hpa"
        cp /opt/opengnsys/ogboot/etc/default/tftpd-hpa /etc/default/tftpd-hpa
    fi
}

install_oglive(){
    echo "Download ogLive"
    /opt/opengnsys/ogboot/bin/oglivecli download "$DEFAULT_OGLIVE"
}

configure_ipxe(){
    echo "Configure ipxe templates" 
    cp $OGBOOT_ROOT/etc/dhcp_boot.ipxe.tmpl $OGBOOT_ROOT/tftpboot/ipxe_scripts/dhcp_boot.ipxe
    cp $OGBOOT_ROOT/etc/default.ipxe.tmpl $OGBOOT_ROOT/tftpboot/ipxe_scripts/default.ipxe
    sed -i "s|__SERVERIP__|$OGBOOT_IP|g" $OGBOOT_ROOT/tftpboot/ipxe_scripts/dhcp_boot.ipxe
    sed -i "s|__SERVERIP__|$OGBOOT_IP|g" $OGBOOT_ROOT/tftpboot/ipxe_scripts/default.ipxe

    echo "Instalando ipxe"
    rm -rf /tmp/ipxe_repo
    git clone $IPXE_REPO /tmp/ipxe_repo
    if [ ! -f $OGBOOT_ROOT/tftpboot/undionly.kpxe ]; then
        cd /tmp/ipxe_repo/src
        make -s bin/undionly.kpxe EMBED=$OGBOOT_ROOT/tftpboot/ipxe_scripts/dhcp_boot.ipxe
        make -s bin-x86_64-efi/ipxe.efi EMBED=$OGBOOT_ROOT/tftpboot/ipxe_scripts/dhcp_boot.ipxe
        cp bin/undionly.kpxe $OGBOOT_ROOT/tftpboot/
        cp bin-x86_64-efi/ipxe.efi $OGBOOT_ROOT/tftpboot/

    fi  
}

configure_api(){
    if ! grep -q "OGCORE_API_URL" $ENV_FILE; then
        echo "OGCORE_API_URL=$OGCORE_API_URL" >> $ENV_FILE
    fi
    if ! grep -q "OGBOOT_IP" $ENV_FILE; then
        echo "OGBOOT_IP=$OGBOOT_IP" >> $ENV_FILE
    fi
    if ! grep -q "OGBOOT_PORT" $ENV_FILE; then
        echo "OGBOOT_PORT=$OGBOOT_PORT" >> $ENV_FILE
    fi
}

configure_nginx_and_fpm() {
    echo "Configure nginx" 
    PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
    if [ ! -f /etc/nginx/sites-available/ogboot.conf ]; then
        cp /opt/opengnsys/ogboot/etc/nginxServer.conf.tmpl /etc/nginx/sites-available/ogboot.conf 
        sed -i "s|__ROOT__|$OGBOOT_API_DIR|g" /etc/nginx/sites-available/ogboot.conf
        sed -i "s|__PHPVERSION__|$PHP_VERSION|g" /etc/nginx/sites-available/ogboot.conf
        sed -i "s|__SERVERIP__|$OGBOOT_IP|g" /etc/nginx/sites-available/ogboot.conf
        sed -i "s|__PORT__|$OGBOOT_PORT|g" /etc/nginx/sites-available/ogboot.conf
        sed -i "s|__TFTPPATH__|$OGBOOT_ROOT/tftpboot|g" /etc/nginx/sites-available/ogboot.conf
        ln -s /etc/nginx/sites-available/ogboot.conf /etc/nginx/sites-enabled/ogboot.conf
    else 
        echo "El archivo /etc/nginx/sites-available/opengnsys ya existe."
    fi

    echo "Modificando el fpm"
    if [ ! -f /etc/php/$PHP_VERSION/fpm/pool.d/ogboot.conf ]; then
        cp /opt/opengnsys/ogboot/etc/ogboot-fpm.conf    /etc/php/$PHP_VERSION/fpm/pool.d/ogboot.conf
    fi 
}

configure_samba(){
    echo "Configurando Samba" 
    mkdir -p /etc/samba/opengnsys/
    cp /opt/opengnsys/ogboot/etc/samba/smb-ogboot.conf /etc/samba/opengnsys/
    sed -i "s|__OGBOOT_DIR__|$OGBOOT_ROOT|g" /etc/samba/opengnsys/smb-ogboot.conf
    INCLUDE_LINE="include = /etc/samba/opengnsys/smb-ogboot.conf"
    if ! grep -q "$INCLUDE_LINE" /etc/samba/smb.conf; then
        echo "$INCLUDE_LINE" | sudo tee -a /etc/samba/smb.conf > /dev/null
    fi  
}

configure_permissions(){
    echo "Cambiando la propiedad de los archivos al usuario $USER"
    chown opengnsys:www-data /opt/opengnsys/
    chown -R opengnsys:www-data /opt/opengnsys/ogboot
}

restart_services(){
    systemctl daemon-reload
    systemctl restart nginx
    systemctl restart tftpd-hpa
    systemctl restart php8.3-fpm
    systemctl restart samba
}

# Detectar si es una instalación nueva o una actualización
if [ "$1" = "configure" ] && [ -z "$2" ]; then
    # Copy sudo configuration
    echo "Primera instalación"
    configure_sudo
    add_fstab_entries
    update_opengnsys_user
    configure_tftp
    install_oglive
    configure_ipxe
    configure_api
    configure_nginx_and_fpm
    configure_samba


elif [ "$1" = "configure" ] && [ -n "$2" ]; then
    echo "Actualización desde la versión $2"
    configure_sudo 
    configure_tftp
    configure_api 
    configure_nginx_and_fpm
    configure_samba
fi

configure_permissions
restart_services


exit 0
