#!/bin/bash
# ========== warp_add_config.sh ==========
# Добавление WARP-настроек в конфигурацию ноды

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

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

# ---------- ЗАГРУЗКА API (СЕРВЕР) ----------
load_api() {
    local api_url="https://cloud.free-surf.ru/script/warp/api.sh"
    local api_script=$(mktemp)
    
    echo -e "${COLOR_YELLOW}Загрузка API модуля с сервера...${COLOR_RESET}"
    
    if curl -fsSL "$api_url" -o "$api_script" 2>/dev/null; then
        source "$api_script"
        rm -f "$api_script"
        echo -e "${COLOR_GREEN}✅ API модуль загружен${COLOR_RESET}"
        return 0
    else
        rm -f "$api_script"
        echo -e "${COLOR_RED}❌ Не удалось загрузить API модуль с $api_url${COLOR_RESET}"
        return 1
    fi
}

# ---------- ОСНОВНАЯ ФУНКЦИЯ ----------
manage_warp_add_config() {
    load_api || return 1

    local domain_url="$SELECTED_PANEL_URL"
    if [[ -z "$domain_url" ]]; then
        domain_url="https://panel.4rp.su/api"
    fi

    local token="$SELECTED_PANEL_TOKEN"

    if [[ -z "$token" ]]; then
        echo -e "${COLOR_RED}❌ API токен не установлен!${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}Проверьте, что вы запускаете скрипт через install.sh${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}И что в install.sh заполнен SELECTED_PANEL_TOKEN${COLOR_RESET}"
        return 1
    fi

    echo -e "${COLOR_GREEN}✅ Токен найден (первые 20 символов: ${token:0:20}...)${COLOR_RESET}"
    echo -e "${COLOR_GREEN}✅ URL панели: $domain_url${COLOR_RESET}"

    # Проверяем доступность панели
    echo -e "${COLOR_YELLOW}Проверка доступности панели...${COLOR_RESET}"
    if ! curl -s --connect-timeout 5 "$domain_url/config-profiles" -H "Authorization: Bearer $token" > /dev/null 2>&1; then
        echo -e "${COLOR_RED}❌ Панель недоступна по адресу: $domain_url${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}Проверьте соединение с интернетом и доступность panel.4rp.su${COLOR_RESET}"
        return 1
    fi
    echo -e "${COLOR_GREEN}✅ Панель доступна${COLOR_RESET}"

    echo -e ""
    echo -e "${COLOR_RED}⚠️  ВНИМАНИЕ${COLOR_RESET}"
    echo -e "${COLOR_YELLOW}Вы собираетесь добавить WARP-настройки в конфигурацию профиля.${COLOR_RESET}"
    echo -e "${COLOR_YELLOW}Убедитесь, что WARP установлен и работает на сервере.${COLOR_RESET}"
    echo -e ""
    echo -e "${COLOR_GREEN}[?]${COLOR_RESET} ${COLOR_YELLOW}Продолжить? (y/n):${COLOR_RESET}"
    read confirm
    echo

    if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
        echo -e "${COLOR_YELLOW}Отмена${COLOR_RESET}"
        return 0
    fi

    # 1. Получаем список конфигураций
    echo -e "${COLOR_YELLOW}Получение списка конфигураций...${COLOR_RESET}"
    local config_response=$(make_api_request "GET" "${domain_url}/config-profiles" "$token")

    if [ -z "$config_response" ]; then
        echo -e "${COLOR_RED}❌ Пустой ответ от API${COLOR_RESET}"
        return 1
    fi

    if ! echo "$config_response" | jq -e '.' > /dev/null 2>&1; then
        echo -e "${COLOR_RED}❌ Невалидный JSON ответ от API${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}Ответ: ${config_response:0:200}${COLOR_RESET}"
        return 1
    fi

    local config_count=$(echo "$config_response" | jq '.response.configProfiles | length' 2>/dev/null)
    if [ -z "$config_count" ] || [ "$config_count" -eq 0 ]; then
        echo -e "${COLOR_RED}❌ Нет доступных конфигураций${COLOR_RESET}"
        echo -e "${COLOR_YELLOW}Создайте хотя бы один профиль через панель.${COLOR_RESET}"
        return 1
    fi

    # 2. Показываем список конфигураций
    echo -e ""
    echo -e "${COLOR_YELLOW}Доступные конфигурации (${config_count}):${COLOR_RESET}"
    echo -e ""
    local i=1
    declare -A config_map
    while IFS= read -r line; do
        local name=$(echo "$line" | awk '{print $1}')
        local uuid=$(echo "$line" | awk '{print $2}')
        if [[ -n "$name" && -n "$uuid" ]]; then
            echo -e "${COLOR_YELLOW}$i. $name${COLOR_RESET}"
            config_map[$i]="$uuid"
            ((i++))
        fi
    done <<< "$(echo "$config_response" | jq -r '.response.configProfiles[] | select(.uuid and .name) | "\(.name) \(.uuid)"' 2>/dev/null)"

    echo -e ""
    echo -e "${COLOR_YELLOW}0. Выход${COLOR_RESET}"
    echo -e ""
    reading "Выберите конфигурацию (номер)" CONFIG_OPTION

    if [ "$CONFIG_OPTION" == "0" ]; then
        echo -e "${COLOR_YELLOW}Выход${COLOR_RESET}"
        return 0
    fi

    if [ -z "${config_map[$CONFIG_OPTION]}" ]; then
        echo -e "${COLOR_RED}❌ Неверный выбор${COLOR_RESET}"
        return 1
    fi

    local selected_uuid=${config_map[$CONFIG_OPTION]}

    # 3. Получаем выбранную конфигурацию
    echo -e "${COLOR_YELLOW}Получение конфигурации...${COLOR_RESET}"
    local config_data=$(make_api_request "GET" "${domain_url}/config-profiles/$selected_uuid" "$token")
    if [ -z "$config_data" ] || ! echo "$config_data" | jq -e '.' > /dev/null 2>&1; then
        echo -e "${COLOR_RED}❌ Ошибка получения данных конфигурации${COLOR_RESET}"
        return 1
    fi

    local config_json=$(echo "$config_data" | jq -r '.response.config // .config // ""')
    if [ -z "$config_json" ] || [ "$config_json" == "null" ]; then
        echo -e "${COLOR_RED}❌ Не найден config в ответе API${COLOR_RESET}"
        return 1
    fi

    # 4. Добавляем WARP outbound
    echo -e "${COLOR_YELLOW}Добавление WARP outbound...${COLOR_RESET}"
    if echo "$config_json" | jq -e '.outbounds[] | select(.tag == "warp-out")' > /dev/null 2>&1; then
        echo -e "${COLOR_YELLOW}WARP outbound уже существует${COLOR_RESET}"
    else
        local warp_outbound='{
            "tag": "warp-out",
            "protocol": "freedom",
            "settings": {
                "domainStrategy": "UseIP"
            },
            "streamSettings": {
                "sockopt": {
                    "interface": "warp",
                    "tcpFastOpen": true
                }
            }
        }'
        config_json=$(echo "$config_json" | jq --argjson warp_out "$warp_outbound" '.outbounds += [$warp_out]' 2>/dev/null)
        echo -e "${COLOR_GREEN}✅ WARP outbound добавлен${COLOR_RESET}"
    fi

    # 5. Добавляем WARP правило в routing
    echo -e "${COLOR_YELLOW}Добавление WARP правила в routing...${COLOR_RESET}"
    if echo "$config_json" | jq -e '.routing.rules[] | select(.outboundTag == "warp-out")' > /dev/null 2>&1; then
        echo -e "${COLOR_YELLOW}WARP правило уже существует${COLOR_RESET}"
    else
        local warp_rule='{
            "type": "field",
            "domain": ["ifconfig.me", "icanhazip.com", "ipecho.net", "api.ipify.org", "ident.me", "checkip.amazonaws.com", "ipinfo.io", "ip-api.com", "httpbin.org", "ip.sb", "ipapi.co", "ipapi.is", "ipbase.com", "ipdata.co", "ipgeolocation.io", "ipquery.io", "ipwho.is", "ipleak.net", "mullvad.net", "myip.la", "myip.wtf", "realip.cc", "ip125.com", "ip233.cn", "ip234.in", "ipw.cn", "ipip.net", "itdog.cn", "qq.com", "taobao.com", "baidu.com", "meituan.com", "dashi.163.com", "biantailajiao.com", "abstractapi.com", "airvpn.org", "apiip.net", "apilayer.com", "apip.cc", "cz88.net", "db-ip.com", "freeaiapi.com", "geoplugin.net", "groapify.com", "hsselite.com", "ip2location.io", "ipcheck.ing", "iplocation.net", "keycdn.com", "maptiler.com", "nameless13.xyz", "reallyfreegeoip.org", "vvhan.com", "ipwhois.app", "browserleaks.com", "whoer.net", "2ip.io", "2ip.ru", "whatismyip.com", "whatismyipaddress.com", "ipaddress.com", "ipchicken.com", "ipfingerprints.com", "ipviewer.net", "myexternalip.com", "myipaddress.com", "showmyip.com", "whatsmyip.net", "whatsmyip.org", "yougetsignal.com", "checkip.dyndns.com", "checkip.dyndns.org", "ip.dnsexit.com", "ip.tyk.nu", "ipv4.icanhazip.com", "ipv6.icanhazip.com", "ipinfo.info", "ipdetect.com", "ipmonkey.com", "ipscore.com", "iptools.com", "ipvoid.com", "myip.ms", "myip.com", "whatismyip.network", "whatismyip.live"],
            "outboundTag": "warp-out"
        }'
        config_json=$(echo "$config_json" | jq --argjson warp_rule "$warp_rule" '.routing.rules += [$warp_rule]' 2>/dev/null)
        echo -e "${COLOR_GREEN}✅ WARP правило добавлено${COLOR_RESET}"
    fi

    # 6. Отправляем обновлённую конфигурацию
    echo -e "${COLOR_YELLOW}Отправка обновлённой конфигурации...${COLOR_RESET}"
    local update_response=$(make_api_request "PATCH" "${domain_url}/config-profiles" "$token" "{\"uuid\": \"$selected_uuid\", \"config\": $config_json}")
    if [ -z "$update_response" ] || ! echo "$update_response" | jq -e '.' > /dev/null 2>&1; then
        echo -e "${COLOR_RED}❌ Ошибка обновления конфигурации${COLOR_RESET}"
        return 1
    fi

    echo -e ""
    echo -e "${COLOR_GREEN}✅ WARP-настройки успешно добавлены в конфигурацию${COLOR_RESET}"
    echo -e ""
    echo -e "${COLOR_YELLOW}Добавленные компоненты:${COLOR_RESET}"
    echo -e "  ${COLOR_GREEN}➤${COLOR_RESET} Outbound: ${COLOR_YELLOW}warp-out${COLOR_RESET}"
    echo -e "  ${COLOR_GREEN}➤${COLOR_RESET} Routing rule: ${COLOR_YELLOW}warp-out${COLOR_RESET} (для доменов проверки IP)"
    echo -e ""
    echo -e "${COLOR_YELLOW}Для применения настроек перезапустите ноду:${COLOR_RESET}"
    echo -e "  ${COLOR_GREEN}docker compose -f /opt/docker-compose.yml restart remnanode${COLOR_RESET}"

    return 0
}

manage_warp_add_config
