#!/bin/bash
# ============================================
# Главный скрипт установки с меню
# Запуск: bash <(curl -s https://cloud.free-surf.ru/script/install.sh)
# ============================================

# ---------- НАСТРОЙКА ЛОГИРОВАНИЯ ----------
LOG_FILE="/var/log/server_setup_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a "$LOG_FILE") 2>&1

log_info() {
    echo "ℹ️  [INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_success() {
    echo "✅ [SUCCESS] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_error() {
    echo "❌ [ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2
}
log_step() {
    echo "📋 [STEP] $(date '+%Y-%m-%d %H:%M:%S') - $1"
    echo "=================================================="
}

echo "🚀 Начало работы главного скрипта..."
echo "📝 Логи записываются в: $LOG_FILE"

# ---------- ПРОВЕРКА ROOT ДЛЯ ЗАПУСКА ----------
if [[ $EUID -ne 0 ]]; then
    log_error "Скрипт должен запускаться с правами root"
    exit 1
fi

# ---------- ФИКСИРОВАННЫЕ ПАРАМЕТРЫ ----------
SSH_PORT=4162
USER1="crazygnome"
USER2="navy"
USER3="vivaldy"
USER4="upgrade"
BASE_URL="https://cloud.free-surf.ru/script"

# ---------- ФУНКЦИЯ ВАЛИДАЦИИ ЛОКАЦИИ (БЕЗ ВЫВОДА) ----------
validate_location() {
    local input="$1"
    local location_regex='^[a-zA-Z]{2,3}[0-9]{2,3}$'
    if [[ ! $input =~ $location_regex ]]; then
        return 1
    fi
    local numbers=$(echo "$input" | grep -oE '[0-9]{2,3}$')
    if [[ $numbers -lt 1 || $numbers -gt 999 ]]; then
        return 1
    fi
    return 0
}

# ---------- ФУНКЦИЯ ЗАГРУЗКИ И ЗАПУСКА МОДУЛЯ ----------
run_module() {
    local module_name="$1"
    local module_url="${BASE_URL}/${module_name}"
    log_info "Загрузка модуля ${module_name}..."
    
    tmp_script=$(mktemp)
    
    if ! curl -fsSL "$module_url" -o "$tmp_script"; then
        log_error "Не удалось загрузить модуль ${module_name} (код ошибки: $?)"
        rm -f "$tmp_script"
        return 1
    fi
    
    chmod +x "$tmp_script"
    
    log_info "Запуск модуля ${module_name}..."
    "$tmp_script"
    local exit_code=$?
    
    rm -f "$tmp_script"
    
    if [[ $exit_code -eq 0 ]]; then
        log_success "Модуль ${module_name} выполнен успешно"
    else
        log_error "Модуль ${module_name} завершился с ошибкой (код: $exit_code)"
    fi
    return $exit_code
}

# ---------- ВВОД ЛОКАЦИИ ----------
log_step "Ввод данных для настройки сервера"

while true; do
    read -rp "Введите имя локации, например nl01: " LOCATION
    if validate_location "$LOCATION"; then
        FULL_DOMAIN="${LOCATION}.8rmdgz.ru"
        echo -e "Полное доменное имя: ${FULL_DOMAIN}"
        read -rp "Ввод верен? (y/n): " confirm
        if [[ $confirm =~ ^[YyДд]$ ]]; then
            break
        fi
    fi
done

export LOCATION FULL_DOMAIN SSH_PORT USER1 USER2 USER3 USER4

log_success "Данные введены: локация=$LOCATION, домен=$FULL_DOMAIN, пользователи=$USER1,$USER2"

# ---------- МЕНЮ ----------
while true; do
    clear
    echo "===================================="
    echo "         ГЛАВНОЕ МЕНЮ               "
    echo "===================================="
    echo "Текущая локация: $LOCATION"
    echo "Полный домен:    $FULL_DOMAIN"
    echo "===================================="
    echo "1) Подготовка ВМ (prepare_vm.sh)"
    echo "2) Генерация сертификатов (generate_certs.sh)"
    echo "3) Установка DNS-сервера (install_dns.sh)"
    echo "4) Установка RemnaNode (install_remnanode.sh)"
    echo "5) Настройка RemnaNode (configure_remnanode.sh)"
    echo "0) Выход"
    echo "===================================="
    read -rp "Ваш выбор: " choice

    case $choice in
        1) run_module "prepare_vm.sh" ;;
        2) run_module "generate_certs.sh" ;;
        3) run_module "install_dns.sh" ;;
        4) run_module "install_remnanode.sh" ;;
        5) run_module "configure_remnanode.sh" ;;
        0) 
            log_info "Выход из программы"
            echo "Нода $FULL_DOMAIN отправлена в перезагрузку"
            reboot
            exit 0
            ;;
        *)
            echo "Неверный выбор. Нажмите Enter для продолжения."
            read
            ;;
    esac

    if [[ $? -eq 0 ]]; then
        echo ""
        read -rp "Нажмите Enter, чтобы вернуться в меню..."
    else
        echo ""
        read -rp "Модуль завершился с ошибкой. Нажмите Enter, чтобы продолжить..."
    fi
done
