package cd.casic.plugin.register;

import cd.casic.plugin.PluginInfo;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;

import java.util.Arrays;

/**
 * @Author：mianbin
 * @Package：cd.casic.plugin.register
 * @Project：ops
 * @name：ApplicationContextPluginHandler
 * @Date：2024/03/19 14:48
 * @Filename：ApplicationContextPluginHandler
 * @description：Todo
 */
public class ApplicationContextPluginHandler implements BasePluginHandler {
    @Override
    public void initialize() throws Exception {

    }

    @Override
    public void registry(PluginInfo plugin) throws Exception {
        if (plugin.getApplicationContextIsRefresh()) {
            return;
        }
        plugin.getPluginApplicationContext().setClassLoader(plugin.getPluginWrapper().getPluginClassLoader());
        plugin.getPluginApplicationContext().getDefaultListableBeanFactory()
                .registerSingleton(plugin.getPluginWrapper().getPluginId().trim(),
                        plugin.getPluginWrapper().getPlugin());
        plugin.getPluginApplicationContext().refresh();
        plugin.setApplicationContextIsRefresh(true);
    }

    @Override
    public void unRegistry(PluginInfo plugin) throws Exception {
        // 获取插件ApplicationContext的DefaultListableBeanFactory实例
        DefaultListableBeanFactory beanFactory = plugin.getPluginApplicationContext().getDefaultListableBeanFactory();

        // 根据插件ID获取Bean的名称
//        String beanName = plugin.getPluginWrapper().getPluginId().trim();
//
//        // 删除已注册的Bean
//        if (beanFactory.containsBeanDefinition(beanName)) {
//            beanFactory.removeBeanDefinition(beanName);
//        }

        String[] beanNames = beanFactory.getBeanNamesForType(plugin.getPluginWrapper().getPlugin().getClass());
        Arrays.stream(beanNames)
                .filter(beanName -> beanName.equals(plugin.getPluginWrapper().getPluginId().trim()))
                .forEach(beanFactory::destroySingleton);
    }
}
