#!/bin/sh

# Printer setup script for Ubuntu 22.04, 24.04, 26.04
# POSIX-compatible /bin/sh script

INSTALL_DIR="/tmp/impresora"
PPD_URL="https://web.cimne.upc.edu/groups/sistemes/Impresoras/drivers/linux/Ricoh-IM_C3000-PDF-Ricoh.ppd"
PPD_FILE="Ricoh-IM_C3000-PDF-Ricoh.ppd"
PPD_MOD_FILE="Ricoh-IM_C3000-PDF-Ricoh_mod.ppd"

PRINTER_1="C1-P1"
PRINTER_2="C1-P2"

PRINTER_1_ADDR="192.168.150.118/queue"
PRINTER_2_ADDR="192.168.150.117/queue"

UBUNTU_VERSION="unknown"
UBUNTU_CODENAME="unknown"

###############################################################################
# Utility functions
###############################################################################

log() {
    echo "[LOG] $*"
}

error_exit() {
    echo "[ERROR] $*" >&2
    zenity --error --title "$TEXT_TITLE" --text "$*" --width 400 2>/dev/null
    exit 1
}

cleanup() {
    rm -rf "$INSTALL_DIR" >/dev/null 2>&1
}

check_command() {
    command -v "$1" >/dev/null 2>&1 || error_exit "Required command not found: $1"
}

load_ubuntu_version() {
    if [ -r /etc/os-release ]; then
        # shellcheck disable=SC1091
        . /etc/os-release
        UBUNTU_VERSION="${VERSION_ID:-unknown}"
        UBUNTU_CODENAME="${VERSION_CODENAME:-unknown}"
    fi

    log "Ubuntu version: $UBUNTU_VERSION"
    log "Ubuntu codename: $UBUNTU_CODENAME"
}

prepare_temp_dir() {
    rm -rf "$INSTALL_DIR" >/dev/null 2>&1
    mkdir -p "$INSTALL_DIR" || error_exit "Could not create temporary directory: $INSTALL_DIR"
    cd "$INSTALL_DIR" || error_exit "Could not enter temporary directory: $INSTALL_DIR"

    log "Temporary directory created at $INSTALL_DIR"
}

open_printer_manager() {
    log "Opening printer manager for Ubuntu $UBUNTU_VERSION"

    case "$UBUNTU_VERSION" in
        22.04|24.04|26.04)
            if command -v gnome-control-center >/dev/null 2>&1; then
                gnome-control-center printers >/dev/null 2>&1 &
                return 0
            fi
            ;;
    esac

    if command -v gnome-control-center >/dev/null 2>&1; then
        gnome-control-center printers >/dev/null 2>&1 &
    elif command -v system-config-printer >/dev/null 2>&1; then
        system-config-printer >/dev/null 2>&1 &
    elif command -v xdg-open >/dev/null 2>&1; then
        xdg-open "http://localhost:631/admin" >/dev/null 2>&1 &
    else
        zenity --info \
            --title "$TEXT_TITLE" \
            --text "Printer manager could not be opened. Try http://localhost:631/admin" \
            --width 400
    fi
}

###############################################################################
# Text / language functions
###############################################################################

select_language() {
    LANGUAGE=$(zenity --list \
        --title "Printer setup" \
        --text "Select language:" \
        --radiolist \
        --column "Pick" \
        --column "Language" \
        TRUE "English" \
        FALSE "Castellano" \
        FALSE "Català")

    [ -n "$LANGUAGE" ] || exit 0
}

set_language_texts() {
    case "$LANGUAGE" in
        English)
            TEXT_USER_CODE="Insert your user code:"
            TEXT_TITLE="Printer setup"
            TEXT_SELECT_PRINTER="Select printer:"
            TEXT_PRINTER="Printer:"
            TEXT_SUCCESS="Printer installation completed successfully."
            TEXT_OPEN_MANAGER="Do you want to open the printer manager?"
            ;;

        Castellano)
            TEXT_USER_CODE="Introduzca su código de usuario:"
            TEXT_TITLE="Instalación de impresora"
            TEXT_SELECT_PRINTER="Seleccione impresora:"
            TEXT_PRINTER="Impresora:"
            TEXT_SUCCESS="Instalación de la impresora completada con éxito."
            TEXT_OPEN_MANAGER="¿Desea abrir la administración de impresoras?"
            ;;

        Català)
            TEXT_USER_CODE="Introdueixi el seu codi d'usuari:"
            TEXT_TITLE="Instal·lació de la impressora"
            TEXT_SELECT_PRINTER="Seleccioni impressora:"
            TEXT_PRINTER="Impressora:"
            TEXT_SUCCESS="Instal·lació de la impressora completada amb èxit."
            TEXT_OPEN_MANAGER="Desitja obrir l'administrador d'impressores?"
            ;;

        *)
            exit 0
            ;;
    esac
}

###############################################################################
# Printer setup functions
###############################################################################

select_printer() {
    PRINTER=$(zenity --list \
        --title "$TEXT_TITLE" \
        --text "$TEXT_SELECT_PRINTER" \
        --radiolist \
        --column "Pick" \
        --column "$TEXT_PRINTER" \
        TRUE "$PRINTER_1" \
        FALSE "$PRINTER_2")

    [ -n "$PRINTER" ] || exit 0

    log "Selected printer: $PRINTER"
}

ask_user_code() {
    USER_CODE=$(zenity --entry \
        --title "$TEXT_TITLE" \
        --text "$TEXT_USER_CODE" \
        --width 400)

    [ -n "$USER_CODE" ] || exit 0

    log "User code entered: $USER_CODE"
}

set_printer_address() {
    case "$PRINTER" in
        "$PRINTER_1")
            PRINTER_ADDR="$PRINTER_1_ADDR"
            ;;

        "$PRINTER_2")
            PRINTER_ADDR="$PRINTER_2_ADDR"
            ;;

        *)
            error_exit "Unknown printer selected: $PRINTER"
            ;;
    esac

    log "Printer address set to: $PRINTER_ADDR"
}

download_driver() {
    log "Downloading printer driver..."

    wget -q -O "$PPD_FILE" "$PPD_URL" || error_exit "Could not download printer driver."
}

modify_driver() {
    log "Modifying printer driver with user code..."

    sed "s/1001/$USER_CODE/g;s/DefaultUserCode: None/DefaultUserCode: $USER_CODE/" \
        "$PPD_FILE" > "$PPD_MOD_FILE" || error_exit "Could not modify printer driver."
}

install_printer() {
    log "Installing printer..."

    lpadmin \
        -p "$PRINTER" \
        -v "lpd://$PRINTER_ADDR" \
        -P "$PPD_MOD_FILE" \
        -E || error_exit "Printer installation failed."

    log "Printer installation completed."
}

ask_open_printer_manager() {
    zenity --question \
        --title "$TEXT_TITLE" \
        --text "$TEXT_OPEN_MANAGER" \
        --width 250

    if [ "$?" -eq 0 ]; then
        open_printer_manager
    fi
}

###############################################################################
# Main
###############################################################################

trap cleanup EXIT INT TERM

select_language
set_language_texts

check_command zenity
check_command wget
check_command sed
check_command lpadmin

load_ubuntu_version
prepare_temp_dir

select_printer
ask_user_code
set_printer_address
download_driver
modify_driver
install_printer

zenity --info \
    --title "$TEXT_TITLE" \
    --text "$TEXT_SUCCESS" \
    --width 300

ask_open_printer_manager

exit 0