#!/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

# ---------- ЦВЕТА ----------
COLOR_GREEN='\033[0;32m'
COLOR_RED='\033[0;31m'
COLOR_YELLOW='\033[0;33m'
COLOR_RESET='\033[0m'

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_warning() {
    echo "⚠️  [WARNING] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_step() {
    echo "📋 [STEP] $(date '+%Y-%m-%d %H:%M:%S') - $1"
    echo "=================================================="
}

# ---------- ФУНКЦИЯ ЧТЕНИЯ ВВОДА ----------
reading() {
    local prompt="$1"
    local var_name="$2"
    echo -e "${COLOR_GREEN}[?]${COLOR_RESET} ${COLOR_YELLOW}${prompt}${COLOR_RESET}"
    read -r "$var_name"
}

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

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

# ---------- SSH КЛЮЧИ ----------
SSH_KEY1="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCx3j0W/2hWwq0ePMRjRrCybkOvPT8AbcsuEN22fQNmLQ0db+yFtJqW7pvL/Hm+joKjH95j8gHcxLIs792vZCcjO48QqMczM1kYNsTxy98FWkl/b7mPSkVpkMzofiYUsyLSUEBRuW0Qpk6re8uW6hY86LHsoZ7bbmP7CqC4topMB7B4budiJQDheUAsLZANVGdg1wiAzHnxLWDUEEsTIvePNIRflblzmAUGzHVr591U4pfeLqmqj60UyQa6cbxPYQ/6TO0iNEaOVdqWsglBaQwen2EDVY3SNlAXn/1LcSm44SE2a/m1dIXmuT971P0sZHsQcuxPl+DmgwO9x6Xd84LjFRwgC57h03wAGOuz0iBB19KLK97fZ2Em/pKKOmGB2+s08A/yADa6Vzq23Bcug3WdPhuqUGoSvl/pp5itwL9MOjy11r8Qwl46S7ObQkCGDlrggtJNjSCfInnE8zYmEX/Oys+bt7f/2VPlR10/zUQiVVrp6xBJ+cf5afryu5g0qnU= crazygnome@crazygnomes-iMac-Pro.local"

SSH_KEY2="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKqzri0qHJ7vw5gft3oLDzrXaijGI1iCpmCkCN0BO6Gm sevgb5\popovi@41013401425"

SSH_KEY4="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCZfthKbdHixWIjTuuqWW1ct65HP78eItYULaaR+9blhjbTP8reO3JYJCzFG0Q0cVJbmm/3K1gM9iXwQ34JWtCoyObmu9r8Dy5i9ULiDilEzjZND84jvBCTVsah27M21eMWRmrxHC7SlGoO5yNWPCrjoSwrKEg0c2Tuol+tZk7OeFeDhryFoj8UJHMF9JASXcaYW7kZoI1Qt0VD5W8v9X1eB7ItTGKBxUfc129m6Y0SjgKQugh5l4AAP/o9+p34OffToK9/SZJpW+4IwAUNTXsUhS0dWdFLhywUkYQr+8ljmkoneerzzs9bRpw7aXN6vt37kWjEettMjEVK9xubRNDhpanJf02K5cO4XJfP9V+6gx6iN8K0b/0pi77XkTmsbPqottmma+yL3Ks/Uc44/T3ZyjZhIqr83vRyUJych18pfjQLZc86i+kveE9OYXCr5eFP1bVELU2bSCSxJl9kub/G3t9oPq09nt3Q6tCzN0GOQVvNN1zEQcw0hstao0uDfllJfzi/UXGT/DSotKLcJivI0wm7r9Y7+id6mYfnSP8PN0kAHkf/YfMPlAwy8nnmDOeTg65/aGfH6aKp912SKwvP3H+AK8XLZgxWFt8q3spyu4yWa1tlLrbzRRbBzLXldByn8ToUJ4EHiS03yEWfshVBsGnYS0QxLtmNTijuOSNDFw== RSA 4096 bit Keys"

# ---------- API КЛЮЧ ДЛЯ ПАНЕЛИ ----------
SELECTED_PANEL_NAME="panel"
SELECTED_PANEL_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1dWlkIjoiNGUyMGFhZmYtMjMyZC00NjM1LTg5NzctNzRkMmVkNmEwMTcwIiwidXNlcm5hbWUiOm51bGwsInJvbGUiOiJBUEkiLCJpYXQiOjE3NzIyMDU1MTEsImV4cCI6MTA0MTIxMTkxMTF9.nHzZgB744AMnQfsaVe8_1I4n9-x8MfgHy4cJj_jxoaw"
SELECTED_PANEL_URL="https://panel.4rp.su/api"

# ---------- ФУНКЦИЯ ВАЛИДАЦИИ ЛОКАЦИИ ----------
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
}

# ---------- ФУНКЦИЯ ЗАПУСКА WARP МОДУЛЯ ----------
run_warp_module() {
    local module_name="$1"
    local module_url="${WARP_DIR}/${module_name}"
    
    echo ""
    echo -e "${COLOR_YELLOW}═════════════════════════════════════════════${COLOR_RESET}"
    echo -e "${COLOR_YELLOW}  Загрузка WARP модуля: ${module_name}${COLOR_RESET}"
    echo -e "${COLOR_YELLOW}═════════════════════════════════════════════${COLOR_RESET}"
    echo ""
    
    tmp_script=$(mktemp)
    
    if ! curl -fsSL "$module_url" -o "$tmp_script"; then
        echo -e "${COLOR_RED}❌ Не удалось загрузить WARP модуль ${module_name}${COLOR_RESET}"
        rm -f "$tmp_script"
        echo ""
        echo -e "${COLOR_YELLOW}Нажмите Enter для продолжения...${COLOR_RESET}"
        read
        return 1
    fi
    
    chmod +x "$tmp_script"
    
    echo -e "${COLOR_GREEN}✅ Модуль загружен, запуск...${COLOR_RESET}"
    echo ""
    echo -e "${COLOR_YELLOW}─────────────────────────────────────────────${COLOR_RESET}"
    echo ""
    
    # Запускаем модуль и показываем весь вывод
    "$tmp_script"
    local exit_code=$?
    
    rm -f "$tmp_script"
    
    echo ""
    echo -e "${COLOR_YELLOW}─────────────────────────────────────────────${COLOR_RESET}"
    echo ""
    
    if [[ $exit_code -eq 0 ]]; then
        echo -e "${COLOR_GREEN}✅ WARP модуль ${module_name} выполнен успешно${COLOR_RESET}"
    else
        echo -e "${COLOR_RED}❌ WARP модуль ${module_name} завершился с ошибкой (код: $exit_code)${COLOR_RESET}"
    fi
    
    echo ""
    echo -e "${COLOR_YELLOW}Нажмите Enter для продолжения...${COLOR_RESET}"
    read
    
    return $exit_code
}

# ============================================================
# АВТОМАТИЧЕСКОЕ ОПРЕДЕЛЕНИЕ ЛОКАЦИИ
# ============================================================

log_step "Автоматическое определение локации по IP сервера"

# ---------- ФУНКЦИЯ ПОЛУЧЕНИЯ IP ----------
get_server_ip() {
    local ip=""
    for source in "ifconfig.me" "icanhazip.com" "ipinfo.io/ip" "api.ipify.org"; do
        ip=$(curl -s --connect-timeout 5 "$source" 2>/dev/null | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}')
        if [[ -n "$ip" ]]; then
            echo "$ip"
            return 0
        fi
    done
    ip=$(hostname -I 2>/dev/null | awk '{print $1}')
    echo "$ip"
}

# ---------- ФУНКЦИЯ ПОЛУЧЕНИЯ PTR ЗАПИСИ ----------
get_ptr_record() {
    local ip="$1"
    local ptr=""
    
    if command -v dig &>/dev/null; then
        ptr=$(dig -x "$ip" +short 2>/dev/null | head -1)
    fi
    
    if [[ -z "$ptr" ]] && command -v nslookup &>/dev/null; then
        ptr=$(nslookup "$ip" 2>/dev/null | grep -oE 'name\s*=\s*[^ ]+' | head -1 | awk '{print $3}' | sed 's/\.$//')
    fi
    
    if [[ -z "$ptr" ]] && command -v host &>/dev/null; then
        ptr=$(host "$ip" 2>/dev/null | grep -oE '[^ ]+\.$' | head -1 | sed 's/\.$//')
    fi
    
    echo "$ptr"
}

# ---------- ФУНКЦИЯ ИЗВЛЕЧЕНИЯ ЛОКАЦИИ ИЗ ДОМЕНА ----------
extract_location_from_domain() {
    local domain="$1"
    local location=$(echo "$domain" | grep -oE '^[a-zA-Z]{2,3}[0-9]{2,3}\.' | sed 's/\.$//')
    echo "$location"
}

# ---------- ОПРЕДЕЛЯЕМ IP И PTR ----------
SERVER_IP=$(get_server_ip)
log_info "IP сервера: $SERVER_IP"

if [[ -z "$SERVER_IP" ]]; then
    log_warning "Не удалось определить IP сервера"
    AUTO_DETECTED=false
else
    PTR_DOMAIN=$(get_ptr_record "$SERVER_IP")
    
    if [[ -n "$PTR_DOMAIN" ]]; then
        log_info "PTR запись: $PTR_DOMAIN"
        AUTO_LOCATION=$(extract_location_from_domain "$PTR_DOMAIN")
        
        if [[ -n "$AUTO_LOCATION" ]]; then
            log_success "Автоматически определена локация: $AUTO_LOCATION"
            log_success "Полный домен: ${AUTO_LOCATION}.8rmdgz.ru"
            AUTO_DETECTED=true
        else
            log_warning "Не удалось извлечь локацию из PTR: $PTR_DOMAIN"
            AUTO_DETECTED=false
        fi
    else
        log_warning "PTR запись не найдена для IP: $SERVER_IP"
        AUTO_DETECTED=false
    fi
fi

# ---------- ЗАПРОС ПОДТВЕРЖДЕНИЯ ----------
log_step "Подтверждение данных"

if [[ "$AUTO_DETECTED" == "true" ]]; then
    echo -e ""
    echo -e "${COLOR_GREEN}✅ Автоматически определено:${COLOR_RESET}"
    echo -e "  IP:      ${COLOR_YELLOW}$SERVER_IP${COLOR_RESET}"
    echo -e "  PTR:     ${COLOR_YELLOW}$PTR_DOMAIN${COLOR_RESET}"
    echo -e "  Локация: ${COLOR_YELLOW}$AUTO_LOCATION${COLOR_RESET}"
    echo -e "  Домен:   ${COLOR_YELLOW}${AUTO_LOCATION}.8rmdgz.ru${COLOR_RESET}"
    echo -e ""
    echo -e "${COLOR_GREEN}[?]${COLOR_RESET} ${COLOR_YELLOW}Данные определены верно? (y/n):${COLOR_RESET}"
    read confirm
    
    if [[ "$confirm" =~ ^[YyДд]$ ]]; then
        LOCATION="$AUTO_LOCATION"
        FULL_DOMAIN="${LOCATION}.8rmdgz.ru"
        log_success "Используем автоматически определённую локацию: $LOCATION"
    else
        echo -e "${COLOR_YELLOW}Введите локацию вручную.${COLOR_RESET}"
        AUTO_DETECTED=false
    fi
fi

# ---------- РУЧНОЙ ВВОД (если автоопределение не удалось или пользователь отказался) ----------
if [[ "$AUTO_DETECTED" != "true" ]]; then
    log_step "Ручной ввод локации"
    
    if [[ -z "$PTR_DOMAIN" ]]; then
        echo -e "${COLOR_YELLOW}Не удалось определить PTR запись для IP: $SERVER_IP${COLOR_RESET}"
    else
        echo -e "${COLOR_YELLOW}Не удалось извлечь локацию из PTR: $PTR_DOMAIN${COLOR_RESET}"
    fi
    echo -e "${COLOR_YELLOW}Пожалуйста, введите локацию вручную.${COLOR_RESET}"
    echo -e ""
    
    while true; do
        echo -e "${COLOR_YELLOW}Введите имя локации, например nl01:${COLOR_RESET}"
        read -rp "> " LOCATION
        if validate_location "$LOCATION"; then
            FULL_DOMAIN="${LOCATION}.8rmdgz.ru"
            echo -e "Полное доменное имя: ${COLOR_GREEN}${FULL_DOMAIN}${COLOR_RESET}"
            echo -e "${COLOR_GREEN}[?]${COLOR_RESET} ${COLOR_YELLOW}Ввод верен? (y/n):${COLOR_RESET}"
            read confirm
            if [[ $confirm =~ ^[YyДд]$ ]]; then
                break
            fi
        else
            echo -e "${COLOR_RED}Неверный формат. Используйте формат: буквы(2-3) + цифры(2-3), например nl01${COLOR_RESET}"
        fi
    done
fi

log_success "Итоговая локация: $LOCATION"
log_success "Итоговый домен:   $FULL_DOMAIN"

# ---------- ЭКСПОРТ ПЕРЕМЕННЫХ ----------
export LOCATION 
export FULL_DOMAIN 
export SSH_PORT 
export USER1 
export USER2 
export USER4
export SSH_KEY1
export SSH_KEY2
export SSH_KEY4
export SELECTED_PANEL_NAME
export SELECTED_PANEL_TOKEN
export SELECTED_PANEL_URL
export WARP_LOCAL_DIR="/opt/www/cloud/script/warp"

# ============================================================
# ПОДМЕНЮ REMNAWAVE
# ============================================================
remnawave_menu() {
    while true; do
        clear
        echo -e "${COLOR_GREEN}====================================${COLOR_RESET}"
        echo -e "${COLOR_GREEN}         REMNAWAVE${COLOR_RESET}"
        echo -e "${COLOR_GREEN}====================================${COLOR_RESET}"
        echo -e "Текущая локация: ${COLOR_YELLOW}$LOCATION${COLOR_RESET}"
        echo -e "Полный домен:    ${COLOR_YELLOW}$FULL_DOMAIN${COLOR_RESET}"
        echo -e "Рабочая панель:  ${COLOR_YELLOW}$SELECTED_PANEL_NAME.4rp.su${COLOR_RESET}"
        echo -e "${COLOR_GREEN}====================================${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}1) Подготовка ВМ (prepare_vm.sh)${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}2) Установка RemnaNode + SSL (install_remnanode.sh)${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}3) Настройка RemnaNode (configure_remnanode.sh)${COLOR_RESET}"
        echo -e ""
        echo -e "${COLOR_YELLOW}0) Назад в главное меню${COLOR_RESET}"
        echo -e "${COLOR_GREEN}====================================${COLOR_RESET}"
        reading "Ваш выбор" REMNA_CHOICE

        case $REMNA_CHOICE in
            1)
                run_module "prepare_vm.sh"
                echo ""
                echo -e "${COLOR_YELLOW}Нажмите Enter для продолжения...${COLOR_RESET}"
                read
                ;;
            2)
                run_module "install_remnanode.sh"
                echo ""
                echo -e "${COLOR_YELLOW}Нажмите Enter для продолжения...${COLOR_RESET}"
                read
                ;;
            3)
                run_module "configure_remnanode.sh"
                echo ""
                echo -e "${COLOR_YELLOW}Нажмите Enter для продолжения...${COLOR_RESET}"
                read
                ;;
            0)
                echo -e "${COLOR_YELLOW}Возврат в главное меню${COLOR_RESET}"
                return 0
                ;;
            *)
                echo -e "${COLOR_RED}Неверный выбор${COLOR_RESET}"
                sleep 2
                ;;
        esac
    done
}

# ============================================================
# ПОДМЕНЮ WARP
# ============================================================
warp_menu() {
    while true; do
        clear
        echo -e "${COLOR_GREEN}====================================${COLOR_RESET}"
        echo -e "${COLOR_GREEN}         WARP NATIVE${COLOR_RESET}"
        echo -e "${COLOR_GREEN}====================================${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}1. Установка WARP${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}2. Удаление WARP${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}3. Добавить WARP-настройки в конфигурацию ноды${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}4. Удалить WARP-настройки из конфигурации ноды${COLOR_RESET}"
        echo -e ""
        echo -e "${COLOR_YELLOW}0. Назад в главное меню${COLOR_RESET}"
        echo -e "${COLOR_GREEN}====================================${COLOR_RESET}"
        reading "Ваш выбор" WARP_OPTION

        # Очищаем переменную от пробелов и невидимых символов
        WARP_OPTION=$(echo "$WARP_OPTION" | tr -d ' ' | tr -d '\n' | tr -d '\r')

        case $WARP_OPTION in
            1)
                run_warp_module "warp_install.sh"
                ;;
            2)
                run_warp_module "warp_uninstall.sh"
                ;;
            3)
                run_warp_module "warp_add_config.sh"
                ;;
            4)
                run_warp_module "warp_delete_config.sh"
                ;;
            0)
                echo -e "${COLOR_YELLOW}Возврат в главное меню${COLOR_RESET}"
                return 0
                ;;
            *)
                echo -e "${COLOR_RED}Неверный выбор: '$WARP_OPTION'${COLOR_RESET}"
                sleep 2
                ;;
        esac
    done
}

# ============================================================
# ГЛАВНОЕ МЕНЮ
# ============================================================
while true; do
    clear
    echo -e "${COLOR_GREEN}====================================${COLOR_RESET}"
    echo -e "${COLOR_GREEN}         ГЛАВНОЕ МЕНЮ${COLOR_RESET}"
    echo -e "${COLOR_GREEN}====================================${COLOR_RESET}"
    echo -e "Текущая локация: ${COLOR_YELLOW}$LOCATION${COLOR_RESET}"
    echo -e "Полный домен:    ${COLOR_YELLOW}$FULL_DOMAIN${COLOR_RESET}"
    echo -e "Рабочая панель:  ${COLOR_YELLOW}$SELECTED_PANEL_NAME.4rp.su${COLOR_RESET}"
    echo -e "${COLOR_GREEN}====================================${COLOR_RESET}"
    echo -e "${COLOR_YELLOW}1) Remnawave${COLOR_RESET}"
    echo -e "   ├── 1) Подготовка ВМ"
    echo -e "   ├── 2) Установка RemnaNode + SSL"
    echo -e "   └── 3) Настройка RemnaNode"
    echo -e "${COLOR_YELLOW}2) WARP${COLOR_RESET}"
    echo -e "   ├── 1) Установка WARP"
    echo -e "   ├── 2) Удаление WARP"
    echo -e "   ├── 3) Добавить WARP-настройки в конфигурацию ноды"
    echo -e "   └── 4) Удалить WARP-настройки из конфигурации ноды"
    echo -e ""
    echo -e "${COLOR_YELLOW}0) Выход${COLOR_RESET}"
    echo -e "${COLOR_GREEN}====================================${COLOR_RESET}"
    reading "Ваш выбор" MAIN_CHOICE

    case $MAIN_CHOICE in
        1)
            remnawave_menu
            ;;
        2)
            warp_menu
            ;;
        0)
            log_info "Выход из программы"
            echo "Нода $FULL_DOMAIN отправлена в перезагрузку"
            reboot
            exit 0
            ;;
        *)
            echo -e "${COLOR_RED}Неверный выбор. Нажмите Enter для продолжения.${COLOR_RESET}"
            read
            ;;
    esac
done
