#!/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"
KEYS_URL="${BASE_URL}/key"

# ---------- ФУНКЦИЯ ЗАГРУЗКИ ТОКЕНОВ ПАНЕЛЕЙ ----------
load_panel_tokens() {
    log_step "Загрузка токенов панелей"
    
    local keys_file=$(mktemp)
    
    if ! curl -fsSL --connect-timeout 12 "$KEYS_URL" -o "$keys_file"; then
        log_error "Не удалось загрузить файл с токенами: $KEYS_URL"
        rm -f "$keys_file"
        return 1
    fi
    
    # Очищаем глобальные массивы
    PANEL_NAMES=()
    PANEL_TOKENS=()
    PANEL_URLS=()
    
    # Читаем файл построчно
    while IFS= read -r line || [[ -n "$line" ]]; do
        # Пропускаем комментарии и пустые строки
        [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
        
        # Разбираем строку: панель|токен
        local panel_name=$(echo "$line" | cut -d'|' -f1 | tr -d ' ')
        local panel_token=$(echo "$line" | cut -d'|' -f2 | tr -d ' ')
        
        if [[ -n "$panel_name" && -n "$panel_token" ]]; then
            PANEL_NAMES+=("$panel_name")
            PANEL_TOKENS+=("$panel_token")
            # Формируем URL панели
            PANEL_URLS+=("https://${panel_name}.4rp.su/api")
            log_info "Загружен токен для панели: $panel_name"
        fi
    done < "$keys_file"
    
    rm -f "$keys_file"
    
    if [[ ${#PANEL_NAMES[@]} -eq 0 ]]; then
        log_error "Не найдено ни одного валидного токена в файле $KEYS_URL"
        return 1
    fi
    
    log_success "Загружено ${#PANEL_NAMES[@]} панелей"
    return 0
}

# ---------- ФУНКЦИЯ ВЫБОРА ПАНЕЛИ ----------
select_panel() {
    log_step "Выбор панели для работы"
    
    echo ""
    echo "Доступные панели:"
    echo "=================================================="
    for i in "${!PANEL_NAMES[@]}"; do
        echo "$((i+1))) ${PANEL_NAMES[$i]}.4rp.su"
    done
    echo "=================================================="
    
    while true; do
        read -rp "Выберите панель (1-${#PANEL_NAMES[@]}): " panel_choice
        
        if [[ "$panel_choice" =~ ^[0-9]+$ ]] && \
           [[ $panel_choice -ge 1 ]] && \
           [[ $panel_choice -le ${#PANEL_NAMES[@]} ]]; then
            
            local index=$((panel_choice-1))
            SELECTED_PANEL_NAME="${PANEL_NAMES[$index]}"
            SELECTED_PANEL_TOKEN="${PANEL_TOKENS[$index]}"
            SELECTED_PANEL_URL="${PANEL_URLS[$index]}"
            
            log_success "Выбрана панель: $SELECTED_PANEL_NAME"
            echo "✅ Панель: ${SELECTED_PANEL_NAME}.4rp.su"
            echo "✅ API URL: $SELECTED_PANEL_URL"
            echo ""
            
            read -rp "Продолжить с выбранной панелью? (y/n): " confirm
            if [[ $confirm =~ ^[YyДд]$ ]]; then
                return 0
            fi
        else
            echo "❌ Неверный выбор. Попробуйте снова."
        fi
    done
}

# ---------- ФУНКЦИЯ ВАЛИДАЦИИ ЛОКАЦИИ (БЕЗ ВЫВОДА) ----------
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
}

# ---------- ОСНОВНАЯ ЛОГИКА ----------

# Загружаем токены панелей
if ! load_panel_tokens; then
    log_error "Не удалось загрузить токены панелей. Проверьте файл $KEYS_URL"
    exit 1
fi

# Выбираем панель
if ! select_panel; then
    log_error "Выбор панели отменён"
    exit 1
fi

# ---------- ВВОД ЛОКАЦИИ ----------
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 
export FULL_DOMAIN 
export SSH_PORT 
export USER1 
export USER2 
export USER3 
export USER4
export SELECTED_PANEL_NAME
export SELECTED_PANEL_TOKEN
export SELECTED_PANEL_URL

log_success "Данные введены: локация=$LOCATION, домен=$FULL_DOMAIN"
log_success "Рабочая панель: $SELECTED_PANEL_NAME"

# ---------- МЕНЮ ----------
while true; do
    clear
    echo "===================================="
    echo "         ГЛАВНОЕ МЕНЮ               "
    echo "===================================="
    echo "Текущая локация: $LOCATION"
    echo "Полный домен:    $FULL_DOMAIN"
    echo "Рабочая панель:  $SELECTED_PANEL_NAME (${SELECTED_PANEL_NAME}.4rp.su)"
    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
