package cd.casic.plugin.register;

import cd.casic.plugin.PluginInfo;
import cd.casic.plugin.register.config.ConfigurationFileHandler;
import cd.casic.plugin.register.config.SpringAutoConfigurationFileHandler;
import cd.casic.plugin.register.database.DatabaseHandler;
import cd.casic.plugin.register.group.ClassGroupHandler;
import cd.casic.plugin.register.mongoplus.MongoHandler;
import cd.casic.plugin.register.mybatis.mybatisplus.MybatisPlusHandler;
import cd.casic.plugin.register.websocket.WebSocketHandler;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @Author：mianbin
 * @Package：cd.casic.plugin.handler
 * @Project：ops
 * @name：LoadPluginHandle
 * @Date：2024/03/18 15:46
 * @Filename：LoadPluginHandle
 * @description：Todo
 */
@Component
@Slf4j
public class StartPluginManagerHandler implements BasePluginHandler {
    List<BasePluginHandler> pluginRegisterList = Collections.synchronizedList(new ArrayList<>());

    @PostConstruct
    @Override
    public void initialize() throws Exception {
        pluginRegisterList.clear();
        pluginRegisterList.add(new ClassGroupHandler());
        // pluginRegisterList.add(new AnnotationHandler());
        pluginRegisterList.add(new ConfigurationFileHandler());
        pluginRegisterList.add(new SpringAutoConfigurationFileHandler());
        pluginRegisterList.add(new SpringBeanRegisterHandler());
        pluginRegisterList.add(new MybatisPlusHandler());
        // pluginRegisterList.add(new MybatisHandler());
        pluginRegisterList.add(new ResourcesHandler());
        pluginRegisterList.add(new ApplicationContextPluginHandler());
        pluginRegisterList.add(new DatabaseHandler());
        pluginRegisterList.add(new ControllerHandler());
        pluginRegisterList.add(new WebSocketHandler());
        pluginRegisterList.add(new SpringDocHandler());
        pluginRegisterList.add(new MongoHandler());
        for (BasePluginHandler pluginHandle : pluginRegisterList) {
            pluginHandle.initialize();
        }
    }

    @Override
    public void registry(PluginInfo plugin) throws Exception {
        for (BasePluginHandler pluginHandler : pluginRegisterList) {
            pluginHandler.registry(plugin);
        }
    }

    @Override
    public void unRegistry(PluginInfo plugin) throws Exception {
        for (BasePluginHandler pluginHandler : pluginRegisterList) {
            pluginHandler.unRegistry(plugin);
        }
//        for (int i = pluginRegisterList.size() - 1; i >= 0; i--){
//            pluginRegisterList.get(i).unRegistry(plugin);
//        }
        plugin.getClassList().clear();
        plugin.setClassList(null);
    }
}
