#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

CONF_FILE="/etc/nginx/conf.d/cloud_phone_proxy.conf"
WRAP_DIR="/var/www/proxy-wrap"
META_FILE="/etc/nginx/conf.d/cloud_phone_proxy.meta"
NGINX_CONF="/etc/nginx/nginx.conf"
TMP_SED_BAK=".sedtmp.bak"
DEFAULT_SITE="/etc/nginx/sites-enabled/default"
DEFAULT_SITE_BAK="/etc/nginx/sites-enabled/default.bak.ysj"
NOTES_FILE="/etc/nginx/conf.d/cloud_phone_proxy.notes"

if [ -t 1 ]; then
    B_CYAN='\033[1;36m'
    B_GREEN='\033[1;32m'
    B_YELLOW='\033[1;33m'
    B_RED='\033[1;31m'
    NC='\033[0m'
else
    B_CYAN=''
    B_GREEN=''
    B_YELLOW=''
    B_RED=''
    NC=''
fi
[ -t 0 ] && stty erase '^H' 2>/dev/null || true

pause_return() {
    echo ""
    printf "%b" "${B_GREEN}按回车返回...${NC}"
    read -r _
}

prompt_input() {
    local prompt="$1"
    local result
    printf "%b" "$prompt" >&2
    read -r result
    printf '%s' "$result"
}

check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "${B_RED}[致命错误] 请使用 root 身份运行此脚本。${NC}"
        exit 1
    fi
}

safe_sed() {
    local sed_expr="$1"
    local target_file="$2"
    [ -f "$target_file" ] || return 0
    sed -i"${TMP_SED_BAK}" "$sed_expr" "$target_file" 2>/dev/null || true
    rm -f "${target_file}${TMP_SED_BAK}"
}

clean_websocket_map() {
    safe_sed '/^[[:space:]]*map \$http_upgrade \$connection_upgrade {/,/^[[:space:]]*}/d' "$NGINX_CONF"
    safe_sed '/^[[:space:]]*$/N; /^\n$/D' "$NGINX_CONF"
}

ensure_websocket_map() {
    if grep -q 'map \$http_upgrade \$connection_upgrade' "$NGINX_CONF" 2>/dev/null; then
        clean_websocket_map
    fi
    safe_sed '/^http {/a\
    map $http_upgrade $connection_upgrade {\
        default upgrade;\
        '\'''\''      close;\
    }' "$NGINX_CONF"
}

detect_ssl_cert() {
    local domain="$1"
    local fullchain="/etc/letsencrypt/live/${domain}/fullchain.pem"
    local privkey="/etc/letsencrypt/live/${domain}/privkey.pem"
    local cert_home="/home/web/certs/${domain}_cert.pem"
    local key_home="/home/web/certs/${domain}_key.pem"

    if [ -f "$fullchain" ] && [ -f "$privkey" ]; then
        echo "${fullchain}|${privkey}"
        return 0
    fi
    if [ -f "$cert_home" ] && [ -f "$key_home" ]; then
        echo "${cert_home}|${key_home}"
        return 0
    fi
    return 1
}

extract_share_code() {
    local input="$1"
    local clean_str
    clean_str=$(echo "$input" | sed 's/#.*//; s/[[:space:]]//g; s/https\?:\/\///g')
    echo "$clean_str" | grep -oE '/ci/[A-Za-z0-9]+' | head -n 1 | sed 's|^/ci/||' || true
}

write_wrapper_html() {
    mkdir -p "$WRAP_DIR"
    cat > "${WRAP_DIR}/index.html" <<'EOF'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<title>远程设备</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
html,body{height:100%;overflow:hidden;background:#111}
iframe{position:fixed;top:0;left:0;width:100%;height:100%;border:0}
</style>
</head>
<body>
<iframe id="frame" allow="camera;microphone;clipboard-read;clipboard-write;fullscreen;display-capture" allowfullscreen></iframe>
<script>
(function(){
  var m = location.pathname.match(/^\/v\/([^/]+)/);
  if (m) document.getElementById('frame').src = '/i/' + m[1];
})();
</script>
</body>
</html>
EOF
    chmod 644 "${WRAP_DIR}/index.html"
    chmod 755 "$WRAP_DIR"
}

clean_domain() {
    local raw="$1"
    echo "$raw" \
        | sed 's/#.*//' \
        | sed -e 's|^https\?://||' -e 's|/.*$||' -e 's|:.*$||' \
        | tr -d '[:space:]'
}

write_nginx_config() {
    local local_domain="$1"
    local target_host="$2"
    local cert_file="$3"
    local key_file="$4"
    local access_scheme="http"
    local http_redirect=""
    local ssl_block="    listen 80;
    server_name ${local_domain};"

    if [ -n "$cert_file" ] && [ -n "$key_file" ]; then
        access_scheme="https"
        http_redirect="server {
    listen 80;
    server_name ${local_domain};
    return 301 https://\$host\$request_uri;
}
"
        ssl_block="    listen 443 ssl http2;
    server_name ${local_domain};
    ssl_certificate     ${cert_file};
    ssl_certificate_key ${key_file};
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    gzip off;
    proxy_set_header Accept-Encoding \"\";"
    fi

    cat > "${CONF_FILE}.tmp" <<EOF
# 云手机隐藏代理 - 由 ysj.sh 自动生成
${http_redirect}server {
${ssl_block}

    location ~ ^/v/[A-Za-z0-9]+\$ {
        root ${WRAP_DIR};
        try_files /index.html =404;
    }

    location ~ ^/ci/([A-Za-z0-9]+)\$ {
        return 302 ${access_scheme}://\$host/v/\$1;
    }

    location ~ ^/i/([A-Za-z0-9]+)\$ {
        proxy_pass https://${target_host}/ci/\$1;
        proxy_ssl_server_name on;
        proxy_http_version 1.1;
        proxy_set_header Host ${target_host};
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto ${access_scheme};
        proxy_set_header X-Forwarded-Host \$host;
        proxy_redirect https://${target_host}/ ${access_scheme}://\$host/;
        proxy_redirect http://${target_host}/ ${access_scheme}://\$host/;
        proxy_cookie_domain ${target_host} \$host;
        proxy_buffering off;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }

    location ~ ^/(api|openapi)/ {
        proxy_pass https://${target_host};
        proxy_ssl_server_name on;
        proxy_http_version 1.1;
        proxy_set_header Host ${target_host};
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto ${access_scheme};
        proxy_set_header X-Forwarded-Host \$host;
        proxy_cookie_domain ${target_host} \$host;
        proxy_buffering off;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }

    location / {
        proxy_pass https://${target_host};
        proxy_ssl_server_name on;
        proxy_http_version 1.1;
        proxy_set_header Host ${target_host};
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto \$scheme;
        proxy_set_header X-Forwarded-Host \$host;
        proxy_set_header Upgrade \$http_upgrade;
        proxy_set_header Connection \$connection_upgrade;
        proxy_redirect https://${target_host}/ ${access_scheme}://\$host/;
        proxy_redirect http://${target_host}/ ${access_scheme}://\$host/;
        sub_filter_once off;
        sub_filter_types text/css application/javascript application/json text/plain application/xml text/html;
        sub_filter "https://${target_host}" "${access_scheme}://\$host";
        sub_filter "http://${target_host}" "${access_scheme}://\$host";
        sub_filter "wss://${target_host}" "wss://\$host";
        sub_filter "ws://${target_host}" "wss://\$host";
        sub_filter "//${target_host}" "//\$host";
        sub_filter "\"${target_host}\"" "\"\$host\"";
        sub_filter "'${target_host}'" "'\$host'";
        proxy_cookie_domain ${target_host} \$host;
        proxy_buffering off;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }
}
EOF
    mv -f "${CONF_FILE}.tmp" "$CONF_FILE"

    cat > "${META_FILE}.tmp" <<EOF
LOCAL_DOMAIN=${local_domain}
TARGET_HOST=${target_host}
ACCESS_SCHEME=${access_scheme}
CONF_PATH=${CONF_FILE}
EOF
    mv -f "${META_FILE}.tmp" "$META_FILE"
}

get_public_ip() {
    local ip
    ip=$(curl -4 -s --max-time 3 api.ipify.org 2>/dev/null || true)
    if [[ ! "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
        ip=$(curl -4 -s --max-time 3 ifconfig.me 2>/dev/null || true)
    fi
    [[ "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] && echo "$ip" || echo ""
}

show_dashboard() {
    local local_domain="$1"
    local target_host="$2"
    local access_scheme="$3"
    local share_code="$4"
    local conf_path="${5:-$CONF_FILE}"
    local ip_addr
    ip_addr=$(get_public_ip)

    echo -e "\n${B_GREEN}==========================================================${NC}"
    echo -e " ${B_CYAN}本地域名      :${NC} ${B_YELLOW}${access_scheme}://${local_domain}${NC}"
    [ -n "$ip_addr" ] && echo -e " ${B_CYAN}服务器公网 IP :${NC} ${B_YELLOW}${ip_addr}${NC}"
    echo -e " ${B_CYAN}目标域名      :${NC} ${B_YELLOW}https://${target_host}${NC}"
    echo -e " ${B_CYAN}分享链接格式  :${NC} ${B_YELLOW}${access_scheme}://${local_domain}/v/分享码${NC}"
    [ -n "$share_code" ] && echo -e " ${B_CYAN}隐藏链接      :${NC} ${B_YELLOW}${access_scheme}://${local_domain}/v/${share_code}${NC}"
    echo -e " ${B_CYAN}Nginx 配置    :${NC} ${B_YELLOW}${conf_path}${NC}"
    echo -e "${B_YELLOW} 提示: 只分享 /v/xxx 链接即可。${NC}"
    echo -e "${B_GREEN}==========================================================${NC}"
}

load_existing_config() {
    unset LOCAL_DOMAIN TARGET_HOST ACCESS_SCHEME CONF_PATH
    if [ -f "$META_FILE" ]; then
        # shellcheck disable=SC1090
        source "$META_FILE"
        CONF_PATH="${CONF_PATH:-$CONF_FILE}"
        [ -f "$CONF_PATH" ] || CONF_PATH="$CONF_FILE"
        LOCAL_DOMAIN="${LOCAL_DOMAIN:-}"
        TARGET_HOST="${TARGET_HOST:-console.chinac.com}"
        ACCESS_SCHEME="${ACCESS_SCHEME:-https}"
        return 0
    fi

    local old_conf="/etc/nginx/conf.d/vps_proxy.conf"
    if [ -f "$old_conf" ]; then
        LOCAL_DOMAIN=$(grep -E '^[[:space:]]*server_name' "$old_conf" | head -n 1 | awk '{print $2}' | sed 's/;//')
        TARGET_HOST=$(grep -oE 'proxy_pass https://[^/; ]+' "$old_conf" | head -n 1 | sed 's|proxy_pass https://||')
        TARGET_HOST="${TARGET_HOST:-console.chinac.com}"
        if grep -q 'listen 443 ssl' "$old_conf" 2>/dev/null; then
            ACCESS_SCHEME="https"
        else
            ACCESS_SCHEME="http"
        fi
        CONF_PATH="$old_conf"
        return 0
    fi
    return 1
}

add_note() {
    local share_code="$1"
    local original_link="$2"
    local remark="$3"
    local ts
    ts=$(date +%s)
    printf '%s\t%s\t%s\t%s\n' "$ts" "$share_code" "$remark" "$original_link" >> "$NOTES_FILE"
}

render_notes() {
    local local_domain="${1:-}"
    local access_scheme="${2:-}"
    [ -f "$NOTES_FILE" ] || return 0
    awk -F '\t' 'NF>=2 {print}' "$NOTES_FILE" 2>/dev/null | sort -nr -k1,1 | awk -F '\t' -v domain="$local_domain" -v scheme="$access_scheme" '{
        i++
        ts=$1
        code=$2
        remark=$3
        orig=$4
        if (remark=="") remark="(无备注)"
        link=orig
        if (domain!="" && scheme!="") link=scheme "://" domain "/v/" code
        printf " %2d) %s | %s | %s\n", i, code, remark, link
    }'
}

delete_note_by_index() {
    local idx="$1"
    [ -f "$NOTES_FILE" ] || return 0
    if ! [[ "$idx" =~ ^[0-9]+$ ]]; then
        return 1
    fi

    local sel
    sel=$(awk -F '\t' 'NF>=2 {print}' "$NOTES_FILE" 2>/dev/null | sort -nr -k1,1 | awk -v want="$idx" 'NR==want {print $0}')
    if [ -z "$sel" ]; then
        return 1
    fi

    awk -F '\t' -v sel="$sel" 'NF>=2 {line=$0; if (line!=sel) print line}' "$NOTES_FILE" > "${NOTES_FILE}.tmp"
    mv -f "${NOTES_FILE}.tmp" "$NOTES_FILE"
}

update_note_remark_by_index() {
    local idx="$1"
    local new_remark="$2"
    [ -f "$NOTES_FILE" ] || return 1
    if ! [[ "$idx" =~ ^[0-9]+$ ]]; then
        return 1
    fi
    if [ -z "$new_remark" ]; then
        return 1
    fi

    local sel
    sel=$(awk -F '\t' 'NF>=2 {print}' "$NOTES_FILE" 2>/dev/null | sort -nr -k1,1 | awk -v want="$idx" 'NR==want {print $0}')
    if [ -z "$sel" ]; then
        return 1
    fi

    local sel_ts sel_code sel_orig
    sel_ts=$(printf '%s' "$sel" | awk -F '\t' '{print $1}')
    sel_code=$(printf '%s' "$sel" | awk -F '\t' '{print $2}')
    sel_orig=$(printf '%s' "$sel" | awk -F '\t' '{print $4}')

    awk -F '\t' -v ts="$sel_ts" -v code="$sel_code" -v remark="$new_remark" -v orig="$sel_orig" 'BEGIN{OFS="\t"} {
        if (NF>=2 && $1==ts && $2==code) {
            print $1,$2,remark,orig
        } else if (NF>=2) {
            print $0
        }
    }' "$NOTES_FILE" > "${NOTES_FILE}.tmp"
    mv -f "${NOTES_FILE}.tmp" "$NOTES_FILE"
}

disable_default_site() {
    if [ -e "$DEFAULT_SITE" ] && [ ! -e "$DEFAULT_SITE_BAK" ]; then
        mv "$DEFAULT_SITE" "$DEFAULT_SITE_BAK"
        echo -e "${B_YELLOW}[处理] 已停用默认站点: ${DEFAULT_SITE}${NC}"
    fi
}

restore_default_site() {
    if [ -e "$DEFAULT_SITE_BAK" ] && [ ! -e "$DEFAULT_SITE" ]; then
        mv "$DEFAULT_SITE_BAK" "$DEFAULT_SITE"
        echo -e "${B_YELLOW}[恢复] 已恢复默认站点: ${DEFAULT_SITE}${NC}"
    fi
}

convert_link_menu() {
    local share_input share_code converted
    local remark
    if ! load_existing_config; then
        echo -e "${B_RED}[错误] 未找到代理配置，请先执行 1 安装。${NC}"
        pause_return
        return
    fi

    echo ""
    echo -e "${B_CYAN}示例原链接：${NC}${B_YELLOW}https://console.chinac.com/ci/1OAAmgtzBSw${NC}"
    share_input=$(prompt_input "${B_GREEN}原始链接：${NC}")
    share_code=$(extract_share_code "$share_input")
    if [ -z "$share_code" ]; then
        share_code=$(prompt_input "${B_GREEN}未识别到分享码，请手动输入：${NC}")
        share_code=$(echo "$share_code" | tr -d '[:space:]')
    fi
    if [ -z "$share_code" ]; then
        echo -e "${B_RED}[错误] 分享码不能为空。${NC}"
        sleep 1
        return
    fi

    converted="${ACCESS_SCHEME}://${LOCAL_DOMAIN}/v/${share_code}"
    echo -e "\n${B_GREEN}转换完成。${NC}"
    echo -e "${B_CYAN}原链接：${NC} ${share_input}"
    echo -e "${B_CYAN}隐藏链接：${NC} ${B_YELLOW}${converted}${NC}"
    while true; do
        remark=$(prompt_input "${B_GREEN}备注（必填）：${NC}")
        [ -n "$remark" ] && break
    done
    add_note "$share_code" "$share_input" "$remark"
    pause_return
}

install_or_reinstall() {
    local conf_list ngx_conf
    local IP_RAW local_domain_raw local_domain target_host
    local cert_file key_file ssl_info old_vps_conf bak test_link test_code
    local remark

    echo -e "${B_CYAN}[步骤 1] 安装 nginx 和 curl...${NC}"
    apt-get install -f -y >/dev/null 2>&1 || true
    if ! (apt update && apt install -y nginx curl); then
        echo -e "${B_RED}[错误] 依赖安装失败，请检查软件源或网络。${NC}"
        sleep 2
        return
    fi

    conf_list=$(find /etc/nginx -type f -name "*.conf" 2>/dev/null || true)
    if [ -n "$conf_list" ]; then
        while IFS= read -r ngx_conf; do
            [ -n "$ngx_conf" ] && safe_sed '/listen \[::\]/d' "$ngx_conf"
        done <<< "$conf_list"
    fi

    ensure_websocket_map
    write_wrapper_html
    disable_default_site
    systemctl enable nginx >/dev/null 2>&1 || true
    systemctl restart nginx
    sleep 1

    IP_RAW=$(get_public_ip)
    local_domain_raw=$(prompt_input "${B_GREEN}输入你的域名（留空则使用公网 IP）：${NC}")
    local_domain=$(clean_domain "$local_domain_raw")
    [ -z "$local_domain" ] && local_domain="$IP_RAW"
    if [ -z "$local_domain" ]; then
        echo -e "${B_RED}[错误] 域名和公网 IP 都为空，无法继续。${NC}"
        sleep 2
        return
    fi

    target_host="console.chinac.com"

    cert_file=""
    key_file=""
    if ssl_info=$(detect_ssl_cert "$local_domain"); then
        cert_file="${ssl_info%%|*}"
        key_file="${ssl_info##*|}"
        echo -e "${B_GREEN}[成功] 检测到 SSL 证书，已启用 HTTPS。${NC}"
    else
        echo -e "${B_YELLOW}[提示] 未检测到 SSL 证书，将使用 HTTP。${NC}"
    fi

    write_nginx_config "$local_domain" "$target_host" "$cert_file" "$key_file"

    old_vps_conf="/etc/nginx/conf.d/vps_proxy.conf"
    if [ -f "$old_vps_conf" ]; then
        bak="${old_vps_conf}.bak.$(date +%Y%m%d_%H%M%S)"
        mv "$old_vps_conf" "$bak"
        echo -e "${B_YELLOW}[备份] 旧配置已保存到 ${bak}${NC}"
    fi

    if nginx -t >/dev/null 2>&1; then
        nginx -s reload >/dev/null 2>&1
        echo -e "${B_GREEN}[成功] Nginx 配置已重新加载。${NC}"
    else
        echo -e "${B_RED}[错误] Nginx 配置校验失败，请手动执行 nginx -t 查看详情。${NC}"
        sleep 3
        return
    fi

    test_link=$(prompt_input "${B_GREEN}粘贴原始分享链接测试转换：${NC}")
    test_code=$(extract_share_code "$test_link")
    show_dashboard "$local_domain" "$target_host" "$([ -n "$cert_file" ] && echo "https" || echo "http")" "$test_code"
    if [ -n "$test_code" ]; then
        while true; do
            remark=$(prompt_input "${B_GREEN}备注（必填）：${NC}")
            [ -n "$remark" ] && break
        done
        add_note "$test_code" "$test_link" "$remark"
    fi
    pause_return
}

uninstall_proxy() {
    local old_vps_conf bak clean_map confirm

    echo -e "${B_RED}警告：这将删除当前代理配置文件。${NC}"
    confirm=$(prompt_input "输入 y 确认卸载，其它任意键取消：")
    if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
        echo -e "${B_YELLOW}已取消。${NC}"
        sleep 1
        return
    fi

    rm -f "$CONF_FILE" "$META_FILE" "$NOTES_FILE"
    old_vps_conf="/etc/nginx/conf.d/vps_proxy.conf"
    if [ -f "$old_vps_conf" ] && grep -qE 'CloudMobile|cloud_phone|/v/' "$old_vps_conf" 2>/dev/null; then
        bak="${old_vps_conf}.bak.$(date +%Y%m%d_%H%M%S)"
        mv "$old_vps_conf" "$bak"
        echo -e "${B_YELLOW}[备份] 旧代理配置已归档到 ${bak}${NC}"
    fi

    rm -rf "$WRAP_DIR"
    clean_map=$(prompt_input "是否同时删除 nginx.conf 中的 websocket map？(y/N): ")
    if [[ "$clean_map" == "y" || "$clean_map" == "Y" ]]; then
        clean_websocket_map
        echo -e "${B_GREEN}[清理] websocket map 已移除。${NC}"
    fi
    restore_default_site

    nginx -t >/dev/null 2>&1 && nginx -s reload >/dev/null 2>&1 || true
    echo -e "${B_GREEN}代理配置已卸载，Nginx 程序保留。${NC}"
    exit 0
}

main_menu() {
    local choice
    local del_idx edit_idx new_remark
    while true; do
        clear
        echo -e "${B_CYAN}##########################################################${NC}"
        echo -e "${B_CYAN}#           云手机隐藏代理工具 ysj.sh（修复版）          #${NC}"
        echo -e "${B_CYAN}##########################################################${NC}"
        echo ""
        echo -e "${B_GREEN} 1) 安装或重装代理（星界版）${NC}"
        echo -e "${B_GREEN} 2) 转换原始分享链接${NC}"
        echo -e "${B_CYAN} 3) 查看当前代理配置${NC}"
        echo -e "${B_RED} 4) 卸载代理配置${NC}"
        echo -e "${B_YELLOW} 0) 退出${NC}"
        echo ""
        choice=$(prompt_input "请选择操作：")
        case "$choice" in
            1) install_or_reinstall ;;
            2) convert_link_menu ;;
            3)
                echo -e "${B_CYAN}正在读取当前配置...${NC}"
                if load_existing_config; then
                    show_dashboard "$LOCAL_DOMAIN" "$TARGET_HOST" "$ACCESS_SCHEME" "" "$CONF_PATH"
                else
                    echo -e "${B_RED}当前尚未安装代理。${NC}"
                fi
                echo ""
                echo -e "${B_CYAN}备注列表（自动排序）：${NC}"
                if [ -f "$NOTES_FILE" ]; then
                    if load_existing_config; then
                        render_notes "$LOCAL_DOMAIN" "$ACCESS_SCHEME"
                    else
                        render_notes
                    fi
                    echo ""
                    edit_idx=$(prompt_input "${B_GREEN}输入序号修改备注（回车跳过）：${NC}")
                    if [ -n "$edit_idx" ]; then
                        while true; do
                            new_remark=$(prompt_input "${B_GREEN}新备注（必填）：${NC}")
                            [ -n "$new_remark" ] && break
                        done
                        if update_note_remark_by_index "$edit_idx" "$new_remark"; then
                            echo -e "${B_GREEN}已更新备注序号：${edit_idx}${NC}"
                        else
                            echo -e "${B_RED}更新失败：序号无效。${NC}"
                        fi
                    fi
                    del_idx=$(prompt_input "${B_GREEN}输入序号删除备注（回车跳过）：${NC}")
                    if [ -n "$del_idx" ]; then
                        if delete_note_by_index "$del_idx"; then
                            echo -e "${B_GREEN}已删除备注序号：${del_idx}${NC}"
                        else
                            echo -e "${B_RED}删除失败：序号无效。${NC}"
                        fi
                    fi
                else
                    echo -e "${B_YELLOW}(暂无备注)${NC}"
                fi
                pause_return
                ;;
            4) uninstall_proxy ;;
            0)
                echo -e "${B_YELLOW}脚本已退出。${NC}"
                exit 0
                ;;
            *)
                echo -e "${B_RED}无效输入，请输入 0-4。${NC}"
                sleep 1
                ;;
        esac
    done
}

check_root
main_menu
