#!/usr/bin/env bash

# debian-nvidia-installer - NVIDIA Driver Installer for Debian (TUI)
# Copyright (C) 2025 Leonardo Amaral
#
# This file is part of debian-nvidia-installer.
#
# debian-nvidia-installer is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# debian-nvidia-installer is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with debian-nvidia-installer. If not, see <https://www.gnu.org/licenses/gpl-3.0.html>.

declare -g SCRIPT_VERSION="0.0.0"
declare -g DISTRO_INFO

# Variáveis globais
declare -g SCRIPT_DIR
declare -g LOG_FILE_PATH="/var/log/debian-nvidia-installer/debian-nvidia-installer.log"

# Detecta se está em modo desenvolvimento ou produção
if [[ -n "$DEVENV" ]]; then
    echo "——— DEVELOPMENT MODE ———"
    SCRIPT_DIR="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")/../lib/debian-nvidia-installer")"
else
    SCRIPT_DIR="/usr/lib/debian-nvidia-installer"
fi

# Importação dos módulos
for file in "$SCRIPT_DIR"/translate/*.sh; do source "$file"; done
for file in "$SCRIPT_DIR"/*.sh; do source "$file"; done
for file in "$SCRIPT_DIR"/tui/*.sh; do source "$file"; done

# Define o idioma do script com base no sistema
tr::detect_language

# Função de ajuda
script::help() {
    local script_name
    script_name=$(basename "$0")
    cat <<EOF
$(tr::t_args "script::help.using" "$script_name")

$(tr::t "script::help.commands")
  --version, -v   $(tr::t "script::help.cmd.version")
  --help, -h      $(tr::t "script::help.cmd.help")

$(tr::t "script::help.examples")
  $script_name --version
  $script_name --help
EOF
}

tr::add "pt_BR" "script::help.using" "Uso: %1 [comando] [opções]"
tr::add "pt_BR" "script::help.commands" "Comandos:"
tr::add "pt_BR" "script::help.cmd.version" "Exibe a versão do script."
tr::add "pt_BR" "script::help.cmd.help" "Mostra esta ajuda."
tr::add "pt_BR" "script::help.examples" "Exemplos:"

tr::add "en_US" "script::help.using" "Usage: %1 [command] [options]"
tr::add "en_US" "script::help.commands" "Commands:"
tr::add "en_US" "script::help.cmd.version" "Displays the script version."
tr::add "en_US" "script::help.cmd.help" "Shows this help message."
tr::add "en_US" "script::help.examples" "Examples:"

tr::add "de_DE" "script::help.using" "Verwendung: %1 [Befehl] [Optionen]"
tr::add "de_DE" "script::help.commands" "Befehle:"
tr::add "de_DE" "script::help.cmd.version" "Zeigt die Skript-Version an."
tr::add "de_DE" "script::help.cmd.help" "Zeigt diese Hilfe an."
tr::add "de_DE" "script::help.examples" "Beispiele:"

# Limpeza / Encerramento
script::exit() {
    local exit_message
    local return_code

    exit_message="$(tr::t "default.script.exit")"
    return_code="${2:-0}"

    if [[ $return_code -gt 0 ]]; then
        log::critical "${1:-$exit_message}"
    else
        log::info "${1:-$exit_message}"
    fi

    echo "$(tr::t_args "script::exit.informlogpath" "$LOG_FILE_PATH")"
    log::input _ "$(tr::t "default.script.pause")"
    exit "$return_code"
}

tr::add "pt_BR" "script::exit.informlogpath" "O resumo da última execução do script está disponível em: %1"
tr::add "en_US" "script::exit.informlogpath" "The summary of the last script execution is available at: %1"

tr::add "de_DE" "script::exit.informlogpath" "Die Zusammenfassung der letzten Skript-Ausführung ist verfügbar unter: %1"

script::requirements() {
    # Garante que o script só seja executado na versão correta
    if [[ "$DISTRO_INFO" != "debian 13 (trixie)" ]]; then
        script::exit "$(tr::t_args "script::requirements.invalid_distro" "$DISTRO_INFO")" 1
    fi

    # Garante que o script só seja executado com privilégios root
    if ! utils::check_sudo; then
        log::warn "$(tr::t "default.script.rootaccess.required")"
        utils::force_sudo "$@" # Reexecuta o script
        script::exit "" 1
    fi

    # Verifica e instala pacotes obrigatórios para execução do script
    log::info "$(tr::t "script::requirements.verifying")"
    if packages::install "dialog"; then
        log::info "$(tr::t "script::requirements.success")"
    else
        log::critical "$(tr::t "script::requirements.failure")"
        script::exit "" 1
    fi
}

tr::add "pt_BR" "script::requirements.invalid_distro" "SO não suportado: %1"
tr::add "pt_BR" "script::requirements.verifying" "Verificando dependências do script..."
tr::add "pt_BR" "script::requirements.success" "Dependências verificadas com sucesso."
tr::add "pt_BR" "script::requirements.failure" "Falha ao verificar dependências."

tr::add "en_US" "script::requirements.invalid_distro" "Unsupported OS: %1"
tr::add "en_US" "script::requirements.verifying" "Verifying script dependencies..."
tr::add "en_US" "script::requirements.success" "Dependencies verified successfully."
tr::add "en_US" "script::requirements.failure" "Failed to verify dependencies."

tr::add "de_DE" "script::requirements.invalid_distro" "Nicht unterstütztes Betriebssystem: %1"
tr::add "de_DE" "script::requirements.verifying" "Skript-Abhängigkeiten werden überprüft..."
tr::add "de_DE" "script::requirements.success" "Abhängigkeiten erfolgreich überprüft."
tr::add "de_DE" "script::requirements.failure" "Fehler beim Überprüfen der Abhängigkeiten."

# Processa os argumentos
tr::add "pt_BR" "default.invalid.command" "Comando inválido: %1"
tr::add "en_US" "default.invalid.command" "Invalid command: %1"

tr::add "de_DE" "default.invalid.command" "Ungültiger Befehl: %1"

if [[ $# -gt 0 ]]; then
    case "$1" in
        --version|--VERSION|-v|-V)
            echo "$SCRIPT_VERSION"
            exit 0
            ;;
        --help|--HELP|-h|-H)
            script::help
            exit 0
            ;;
        *)
            echo "$(tr::t_args "default.invalid.command" "$*")"
            script::help
            exit 1
            ;;
    esac

# Executa o script
else
    source "/etc/os-release"
    DISTRO_INFO="$ID $VERSION_ID ($VERSION_CODENAME)"

    # Configura arquivos de logging
    log::setup_logger "$LOG_FILE_PATH"

    # Exibe a mensagem de boas-vindas
    tr::add "pt_BR" "default.script.welcome" "Debian NVIDIA Installer v%1\n
  > Este instalador é distribuído sob a licença GPLv3.
  > Repositório do projeto: https://github.com/devleonardoamaral/debian-nvidia-installer

Distribuição: %2\n
"

    tr::add "en_US" "default.script.welcome" "Welcome to the Debian NVIDIA Installer %1\n
  > This installer is released under the GPLv3 license.
  > Project repository: https://github.com/devleonardoamaral/debian-nvidia-installer

Distribution: %2\n
"

    tr::add "de_DE" "default.script.welcome" "Willkommen beim Debian NVIDIA Installer %1\n
  > Dieser Installer wird unter der GPLv3-Lizenz veröffentlicht.
  > Projekt-Repository: https://github.com/devleonardoamaral/debian-nvidia-installer

Distribution: %2\n
"
    (
        source "/etc/os-release"
        log::info "$(tr::t_args "default.script.welcome" "$SCRIPT_VERSION" "$DISTRO_INFO")"
    )

    # Verifica requisitos do script
    script::requirements "$@"

    # Inicia o Dialog de navegação
    tui::menu::main
    ret=$?
    script::exit "" "$ret"
fi
