#!/usr/bin/env bash
# MTProto Proxy Ultimate Installer v4.1
# Автор оригинала: @nazuyam (бот @nazuvpn_bot)
# v4.1 — правки VPN-HUB, см. блок «Что исправлено» ниже.
#
# ЧТО ИСПРАВЛЕНО ОТНОСИТЕЛЬНО v4.0:
#  1. Формат FakeTLS-секрета. Было: "ee" + hex(домен) + добивка = всегда 32 символа —
#     домен лежал ВНУТРИ секретной части, а стандартный вид (его ждут клиенты Telegram)
#     это "ee" + 32 hex (16 байт секрета) + hex(домена). Стало — по стандарту.
#  2. Энтропия. При длинном домене на случайную часть оставалось 2 символа
#     (www.google.com) — секрет подбирался перебором. Теперь всегда ровно 16 байт.
#  3. Длинные домены роняли установку: www.microsoft.com давал отрицательную длину →
#     "head: illegal byte count". Теперь длина домена ни на что не влияет.
#  4. Разделены секрет СЕРВЕРА (32 hex в контейнер) и секрет КЛИЕНТА (ee-форма в ссылку).
#     Побочно чинит смену TAG: раньше в контейнер уходил клиентский секрет.
#  5. Убрана зависимость от xxd (нет в базовой Ubuntu ≤22.04) — используется od из coreutils.
set -e

MAGENTA='\033[1;35m'; PURPLE='\033[0;35m'; GREEN='\033[0;32m'; RED='\033[0;31m'
YELLOW='\033[1;33m'; CYAN='\033[0;36m'; BOLD='\033[1m'; DIM='\033[2m'; NC='\033[0m'

ok()   { printf "${GREEN}[✓]${NC} %s\n" "$1"; }
err()  { printf "${RED}[✗]${NC} %s\n" "$1"; }
info() { printf "${CYAN}[→]${NC} %s\n" "$1"; }
warn() { printf "${YELLOW}[!]${NC} %s\n" "$1"; }

CONF=~/mtproto_config.txt

banner() {
    clear
    printf "${MAGENTA}${BOLD}\n"
    printf "╔══════════════════════════════════════════════╗\n"
    printf "║                                              ║\n"
    printf "║     MTProto Proxy Ultimate Installer v4.1    ║\n"
    printf "║                                              ║\n"
    printf "║     ${PURPLE}Автор: @nazuyam${MAGENTA}                          ║\n"
    printf "║     ${PURPLE}Владелец @nazuvpn_bot${MAGENTA}                    ║\n"
    printf "║                                              ║\n"
    printf "╚══════════════════════════════════════════════╝\n"
    printf "${NC}\n"
}

divider() { printf "${MAGENTA}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"; }

[[ $(id -u) -ne 0 ]] && { err "Запусти от root: sudo bash install-mtproto.sh"; exit 1; }

# ── hex-хелперы на coreutils (od есть везде, xxd — нет) ──
to_hex()   { printf '%s' "$1" | od -An -tx1 -v | tr -d ' \n'; }
rand_hex() { head -c "$1" /dev/urandom | od -An -tx1 -v | tr -d ' \n'; }

install_docker() {
    info "Устанавливаем Docker..."
    apt update -qq 2>/dev/null || true
    apt install -y -qq docker.io curl 2>/dev/null || true
    command -v docker >/dev/null || { err "Docker не установился — поставь вручную и запусти скрипт снова"; exit 1; }
    systemctl enable --now docker >/dev/null 2>&1 || true
    ok "Docker готов"
}

install_proxy() {
    printf "\n${MAGENTA}${BOLD}Выбери домен для FakeTLS маскировки:${NC}\n\n"
    printf "  ${CYAN}1${NC}) ${PURPLE}ya.ru${NC} ${DIM}(Рекомендуется)${NC}\n"
    printf "  ${CYAN}2${NC}) ${PURPLE}dzen.ru${NC}\n"
    printf "  ${CYAN}3${NC}) ${PURPLE}www.google.com${NC}\n"
    printf "  ${CYAN}4${NC}) ${PURPLE}www.microsoft.com${NC}\n"
    printf "  ${CYAN}5${NC}) ${PURPLE}Свой домен${NC}\n\n"
    read -rp "  Номер [1-5]: " DOMAIN_CHOICE

    case $DOMAIN_CHOICE in
        2) FAKE="dzen.ru" ;;
        3) FAKE="www.google.com" ;;
        4) FAKE="www.microsoft.com" ;;
        5) read -rp "  Введи домен: " FAKE ;;
        *) FAKE="ya.ru" ;;
    esac

    printf "\n"; divider
    printf "${MAGENTA}${BOLD}  Тип секрета:${NC}\n\n"
    printf "  ${CYAN}1${NC}) ${PURPLE}FakeTLS${NC} ${DIM}(маскировка под домен, ee...)${NC}\n"
    printf "  ${CYAN}2${NC}) ${PURPLE}Обычный hex${NC} ${DIM}(случайные 32 символа, без маскировки)${NC}\n"
    printf "  ${CYAN}3${NC}) ${PURPLE}Свой секрет${NC} ${DIM}(ввести готовый)${NC}\n\n"
    read -rp "  Номер [1-3]: " SECRET_TYPE

    # SECRET_SRV — уходит в контейнер (ровно 32 hex = 16 байт)
    # SECRET_CLI — уходит в ссылку клиенту (для FakeTLS = ee + SECRET_SRV + hex(домен))
    case $SECRET_TYPE in
        2)
            SECRET_SRV=$(rand_hex 16)
            SECRET_CLI="$SECRET_SRV"
            MODE="Обычный hex"
            ;;
        3)
            printf "\n"; read -rp "  Введи свой секрет: " CUSTOM
            CUSTOM=$(printf '%s' "$CUSTOM" | tr -d ' ')
            if [[ "$CUSTOM" == ee* ]]; then
                SECRET_SRV="${CUSTOM:2:32}"          # из ee-формы берём именно 16-байтную часть
                SECRET_CLI="$CUSTOM"
                MODE="FakeTLS (свой)"
            else
                SECRET_SRV="$CUSTOM"
                SECRET_CLI="$CUSTOM"
                MODE="Свой секрет"
            fi
            if [[ ${#SECRET_SRV} -ne 32 ]]; then
                err "Секрет сервера должен быть 32 hex-символа (сейчас ${#SECRET_SRV}). Отмена."
                return 1
            fi
            ;;
        *)
            # ⭐ стандартный FakeTLS: ee + 32 hex + hex(домен). Длина домена НЕ ограничена.
            SECRET_SRV=$(rand_hex 16)
            SECRET_CLI="ee${SECRET_SRV}$(to_hex "$FAKE")"
            MODE="FakeTLS"
            ;;
    esac

    printf "\n"; divider
    printf "${MAGENTA}${BOLD}  Сгенерированный секрет:${NC}\n"
    divider; printf "\n"
    printf "  ${DIM}Домен:${NC}          ${PURPLE}%s${NC}\n" "$FAKE"
    printf "  ${DIM}Тип секрета:${NC}    ${PURPLE}%s${NC}\n" "$MODE"
    printf "  ${DIM}Секрет сервера:${NC} ${YELLOW}%s${NC} ${DIM}(%s симв.)${NC}\n" "$SECRET_SRV" "${#SECRET_SRV}"
    printf "  ${DIM}Секрет клиента:${NC} ${YELLOW}%s${NC} ${DIM}(%s симв.)${NC}\n" "$SECRET_CLI" "${#SECRET_CLI}"
    printf "\n"

    printf "${MAGENTA}${BOLD}Выбери порт:${NC}\n\n"
    printf "  ${CYAN}1${NC}) ${PURPLE}443${NC} ${DIM}(Стандартный HTTPS)${NC}\n"
    printf "  ${CYAN}2${NC}) ${PURPLE}8443${NC}\n"
    printf "  ${CYAN}3${NC}) ${PURPLE}80${NC}\n"
    printf "  ${CYAN}4${NC}) ${PURPLE}Свой порт${NC}\n\n"
    read -rp "  Номер [1-4]: " PORT_CHOICE

    case $PORT_CHOICE in
        2) PORT="8443" ;;
        3) PORT="80" ;;
        4) read -rp "  Введи порт: " PORT ;;
        *) PORT="443" ;;
    esac

    printf "\n"; info "Проверяем порт ${PURPLE}${PORT}${NC}..."
    if command -v ss >/dev/null && ss -tuln | grep -q ":${PORT} "; then
        warn "Порт ${PURPLE}${PORT}${NC} занят! Ищем свободный..."
        for alt in 8443 8444 8445 8080 8888; do
            if ! ss -tuln | grep -q ":${alt} "; then
                PORT=$alt; ok "Найден свободный порт: ${PURPLE}${PORT}${NC}"; break
            fi
        done
    else
        ok "Порт ${PURPLE}${PORT}${NC} свободен"
    fi

    IP=$(curl -s --max-time 10 ifconfig.me || true)
    [[ -z "$IP" ]] && read -rp "  Не удалось определить IP. Введи вручную: " IP

    printf "\n${MAGENTA}${BOLD}Спонсорский канал:${NC}\n\n"
    printf "  ${CYAN}1${NC}) ${PURPLE}Пропустить${NC} ${DIM}(без канала)${NC}\n"
    printf "  ${CYAN}2${NC}) ${PURPLE}Добавить TAG${NC} ${DIM}(получить в @MTProxybot)${NC}\n\n"
    read -rp "  Номер [1-2]: " SPONSOR_CHOICE

    TAG=""
    if [[ "$SPONSOR_CHOICE" == "2" ]]; then
        printf "\n"
        printf "  ${DIM}1. Открой @MTProxybot в Telegram${NC}\n"
        printf "  ${DIM}2. Отправь /newproxy${NC}\n"
        printf "  ${DIM}3. Введи: ${PURPLE}%s:%s${NC}\n" "$IP" "$PORT"
        printf "  ${DIM}4. Введи секрет: ${YELLOW}%s${NC}\n" "$SECRET_CLI"
        printf "  ${DIM}5. Бот выдаст TAG (32 символа)${NC}\n"
        printf "  ${DIM}6. Отправь /setpromo и выбери канал${NC}\n\n"
        read -rp "  Введи TAG от бота: " TAG
        if [[ -z "$TAG" || ${#TAG} -ne 32 ]]; then
            warn "TAG должен быть 32 символа. Продолжаем без него."; TAG=""
        else
            ok "TAG принят: ${YELLOW}${TAG}${NC}"
        fi
    fi

    printf "\n"; divider
    printf "${MAGENTA}${BOLD}  Запуск прокси${NC}\n"
    divider; printf "\n"

    docker stop mtproto-proxy >/dev/null 2>&1 || true
    docker rm mtproto-proxy   >/dev/null 2>&1 || true

    if [[ -n "$TAG" ]]; then
        docker run -d --name mtproto-proxy --restart unless-stopped \
            -p "${PORT}":443 -e SECRET="${SECRET_SRV}" -e TAG="${TAG}" \
            telegrammessenger/proxy >/dev/null 2>&1
    else
        docker run -d --name mtproto-proxy --restart unless-stopped \
            -p "${PORT}":443 -e SECRET="${SECRET_SRV}" \
            telegrammessenger/proxy >/dev/null 2>&1
    fi

    sleep 3

    if docker ps --format '{{.Names}}' | grep -q mtproto-proxy; then
        LINK="https://t.me/proxy?server=${IP}&port=${PORT}&secret=${SECRET_CLI}"

        printf "${GREEN}${BOLD}╔══════════════════════════════════════════════╗${NC}\n"
        printf "${GREEN}${BOLD}║               ПРОКСИ ГОТОВ!                  ║${NC}\n"
        printf "${GREEN}${BOLD}╚══════════════════════════════════════════════╝${NC}\n\n"
        printf "  ${DIM}Сервер:${NC}         ${PURPLE}%s${NC}\n" "$IP"
        printf "  ${DIM}Порт:${NC}           ${PURPLE}%s${NC}\n" "$PORT"
        printf "  ${DIM}Секрет клиента:${NC} ${YELLOW}%s${NC}\n" "$SECRET_CLI"
        printf "  ${DIM}FakeTLS домен:${NC}  ${MAGENTA}%s${NC}\n" "$FAKE"
        [[ -n "$TAG" ]] && printf "  ${DIM}Спонсор TAG:${NC}    ${GREEN}%s${NC}\n" "$TAG"
        printf "\n  ${DIM}Ссылка:${NC}\n  ${GREEN}%s${NC}\n\n" "$LINK"

        divider
        printf "${MAGENTA}${BOLD}  Как подключить:${NC}\n"
        divider; printf "\n"
        printf "  ${PURPLE}${BOLD}Android/iOS:${NC}\n"
        printf "  ${DIM}→ Нажми на ссылку выше, Telegram сам предложит подключить${NC}\n\n"
        printf "  ${PURPLE}${BOLD}Вручную:${NC}\n"
        printf "  ${DIM}→ Настройки → Данные и память → Прокси → Добавить${NC}\n"
        printf "  ${DIM}→ Тип: MTProto · Сервер:${NC} ${PURPLE}%s${NC} ${DIM}· Порт:${NC} ${PURPLE}%s${NC}\n" "$IP" "$PORT"
        printf "  ${DIM}→ Секрет:${NC} ${YELLOW}%s${NC}\n\n" "$SECRET_CLI"

        cat > "$CONF" << EOF
SERVER=${IP}
PORT=${PORT}
SECRET_SRV=${SECRET_SRV}
SECRET_CLI=${SECRET_CLI}
DOMAIN=${FAKE}
LINK=${LINK}
TAG=${TAG}
EOF
        ok "Конфиг сохранён: ${PURPLE}${CONF}${NC}"

        printf "\n${MAGENTA}${BOLD}  Логи контейнера:${NC}\n${DIM}"
        docker logs --tail 5 mtproto-proxy 2>&1 || true
        printf "${NC}\n"
    else
        err "Не удалось запустить контейнер!"
        printf "${DIM}"; docker logs mtproto-proxy 2>&1 || true; printf "${NC}\n"
        return 1
    fi
}

remove_proxy() {
    printf "\n${RED}${BOLD}  Удаление прокси...${NC}\n"
    docker stop mtproto-proxy >/dev/null 2>&1 && ok "Контейнер остановлен" || warn "Контейнер не запущен"
    docker rm mtproto-proxy   >/dev/null 2>&1 && ok "Контейнер удалён"     || warn "Контейнер не найден"
    rm -f "$CONF" 2>/dev/null && ok "Конфиг удалён"
    ok "Всё чисто"
}

show_status() {
    printf "\n${MAGENTA}${BOLD}  Статус прокси:${NC}\n"; divider
    if docker ps --format '{{.Names}}' | grep -q mtproto-proxy; then
        ok "Прокси запущен"
        printf "\n${DIM}"
        docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "NAMES|mtproto-proxy"
        printf "${NC}\n"
        printf "\n${MAGENTA}${BOLD}  Логи (последние 10 строк):${NC}\n${DIM}"
        docker logs --tail 10 mtproto-proxy 2>&1 || true
        printf "${NC}\n"
        if [[ -f "$CONF" ]]; then
            printf "\n${MAGENTA}${BOLD}  Конфиг:${NC}\n${DIM}"; cat "$CONF"; printf "${NC}\n"
        fi
    else
        warn "Прокси не запущен"
    fi
}

show_config() {
    printf "\n${MAGENTA}${BOLD}  Конфигурация:${NC}\n"; divider
    if [[ -f "$CONF" ]]; then
        printf "${DIM}"; cat "$CONF"; printf "${NC}\n"
        # shellcheck disable=SC1090
        source "$CONF"
        printf "\n  ${DIM}Ссылка:${NC}\n  ${GREEN}%s${NC}\n" "$LINK"
    else
        warn "Конфиг не найден. Сначала установи прокси."
    fi
}

restart_proxy() {
    info "Перезапуск..."
    docker restart mtproto-proxy >/dev/null 2>&1 && ok "Прокси перезапущен" || warn "Прокси не запущен"
}

change_tag() {
    printf "\n${MAGENTA}${BOLD}  Смена спонсорского TAG:${NC}\n"; divider
    if ! docker ps --format '{{.Names}}' | grep -q mtproto-proxy; then
        warn "Прокси не запущен. Сначала установи."; return
    fi
    [[ -f "$CONF" ]] || { warn "Конфиг не найден."; return; }
    # shellcheck disable=SC1090
    source "$CONF"
    printf "\n  ${DIM}Текущий TAG:${NC} ${YELLOW}%s${NC}\n" "${TAG:-не установлен}"
    printf "  ${DIM}Порт:${NC} ${PURPLE}%s${NC}\n\n" "$PORT"
    printf "  ${DIM}Получи новый TAG в @MTProxybot (/newproxy)${NC}\n\n"
    read -rp "  Введи новый TAG (32 символа): " NEW_TAG
    if [[ -z "$NEW_TAG" || ${#NEW_TAG} -ne 32 ]]; then
        warn "TAG должен быть 32 символа. Отмена."; return
    fi
    docker stop mtproto-proxy >/dev/null 2>&1 || true
    docker rm mtproto-proxy   >/dev/null 2>&1 || true
    # ⭐ в контейнер уходит СЕРВЕРНЫЙ секрет (в v4.0 сюда по ошибке попадал клиентский)
    docker run -d --name mtproto-proxy --restart unless-stopped \
        -p "${PORT:-443}":443 -e SECRET="${SECRET_SRV}" -e TAG="${NEW_TAG}" \
        telegrammessenger/proxy >/dev/null 2>&1
    sleep 3
    if docker ps --format '{{.Names}}' | grep -q mtproto-proxy; then
        ok "Прокси перезапущен с новым TAG: ${YELLOW}${NEW_TAG}${NC}"
        sed -i "s/^TAG=.*/TAG=${NEW_TAG}/" "$CONF" 2>/dev/null || true
    else
        err "Ошибка перезапуска"
    fi
}

while true; do
    banner
    printf "${MAGENTA}${BOLD}  МЕНЮ:${NC}\n"; divider; printf "\n"
    printf "  ${CYAN}1${NC}) ${PURPLE}${BOLD}Установить прокси${NC}        ${DIM}(полная установка с нуля)${NC}\n"
    printf "  ${CYAN}2${NC}) ${PURPLE}${BOLD}Показать статус${NC}          ${DIM}(логи, порты, конфиг)${NC}\n"
    printf "  ${CYAN}3${NC}) ${PURPLE}${BOLD}Показать конфиг${NC}          ${DIM}(ссылка, секрет, IP)${NC}\n"
    printf "  ${CYAN}4${NC}) ${PURPLE}${BOLD}Перезапустить прокси${NC}     ${DIM}(если завис или глючит)${NC}\n"
    printf "  ${CYAN}5${NC}) ${PURPLE}${BOLD}Сменить спонсор TAG${NC}      ${DIM}(новый канал для продвижения)${NC}\n"
    printf "  ${CYAN}6${NC}) ${RED}${BOLD}Удалить прокси${NC}           ${DIM}(полное удаление)${NC}\n"
    printf "  ${CYAN}0${NC}) ${PURPLE}Выход${NC}\n\n"
    divider; printf "\n"
    read -rp "  Выбери действие [0-6]: " CHOICE
    printf "\n"

    case $CHOICE in
        1) command -v docker >/dev/null || install_docker; install_proxy || true ;;
        2) show_status ;;
        3) show_config ;;
        4) restart_proxy ;;
        5) change_tag ;;
        6) remove_proxy ;;
        0)
            printf "${MAGENTA}${BOLD}  Пока! 👋${NC}\n\n"
            printf "  ${PURPLE}Автор: @nazuyam${NC}\n"
            printf "  ${PURPLE}Бот: @nazuvpn_bot${NC}\n\n"
            exit 0
            ;;
        *) warn "Неверный выбор. Попробуй ещё раз." ;;
    esac

    printf "\n"; read -rp "  Нажми Enter чтобы продолжить..."
done
