package com.czg.config;

import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.registry.nacos.NacosNamingServiceWrapper;
import org.apache.dubbo.registry.nacos.NacosRegistry;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author yjjie
 * @date 2025/12/19 16:44
 */
@Slf4j
public class FilteredNacosRegistry extends NacosRegistry {

    // 定义需要过滤的方法名黑名单（可根据业务调整）
    private static final List<String> FILTER_METHODS = Arrays.asList(
            "updateBatch",
            "saveOrUpdateBatch",
            "getOneByEntityId",
            "getByEntityIdOpt",
            "saveBatch",
            "removeByMap",
            "getByIdOpt",
            "getOneOpt",
            "getOneAs",
            "getObjOpt",
            "getObjAs",
            "getObjAsOpt",
            "objList",
            "objListAs",
            "listByMap",
            "queryChain",
            "updateChain",
            "getObj"
    );


    /**
     * 适配 Dubbo 3.3 版本的构造函数
     *
     * @param url           Dubbo 注册中心URL
     * @param namingService NacosNamingServiceWrapper（Dubbo 3.3 特有包装类）
     */
    public FilteredNacosRegistry(URL url, NacosNamingServiceWrapper namingService) {
        // 调用父类2参数构造（URL + NacosNamingServiceWrapper）
        super(url, namingService);
    }

    @Override
    public void register(URL url) {
        // 1. 获取原始注册的方法列表
        String originalMethods = url.getParameter("methods");
//        log.info("【过滤提示】服务 {} 注册方法：{}", url.getServiceInterface(), originalMethods);
        if (originalMethods != null && !originalMethods.isEmpty()) {
            // 2. 过滤黑名单中的方法名
            List<String> filteredMethods = Arrays.stream(originalMethods.split(","))
                    // 去除首尾空格
                    .map(String::trim)
                    // 过滤指定方法
                    .filter(method -> !FILTER_METHODS.contains(method))
                    .collect(Collectors.toList());

            // 3. 处理过滤后的结果
            if (filteredMethods.isEmpty()) {
                // 若所有方法都被过滤，直接终止注册（可选：根据业务决定是否保留服务注册）
//                log.info("【过滤提示】服务 {} 所有方法均被过滤，终止注册", url.getServiceInterface());
                return;
            } else {
                // 替换 URL 中的 methods 参数为过滤后的列表
                url = url.addParameter("methods", String.join(",", filteredMethods));
//                log.info("【过滤提示】服务 {} 注册方法：{}", url.getServiceInterface(), filteredMethods);
            }
        }

        // 执行父类的注册逻辑（将过滤后的URL注册到Nacos）
        super.register(url);
    }
}
