package cn.fateverse.query.handler.reader;

import cn.fateverse.common.code.model.EngineResult;
import cn.fateverse.query.entity.DataAdapter;
import cn.fateverse.query.handler.engine.EngineExecuteHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * @author Clay
 * @date 2023-10-29  19:31
 */
@Slf4j
@Component
public class EngineExecuteHandlerReader {


    private final List<EngineExecuteHandler> handlerList;

    public EngineExecuteHandlerReader(List<EngineExecuteHandler> handlerList) {
        this.handlerList = handlerList;
    }


    /**
     * 预处理方法，用于对传入的数据适配器进行预处理
     *
     * @param dataAdapter 数据适配器
     */
    public void preconditioning(DataAdapter dataAdapter) {
        // 遍历引擎执行处理器列表
        for (EngineExecuteHandler engineExecuteHandler : handlerList) {
            // 执行预处理方法
            Boolean result = engineExecuteHandler.preconditioning(dataAdapter);
            if (result) {
                return;
            }
        }
    }


    /**
     * 执行方法
     *
     * @param dataAdapter 数据适配器
     * @param data        数据列表
     * @return 执行结果
     */
    public EngineResult execute(DataAdapter dataAdapter, Object data, boolean development) {
        // 遍历引擎执行处理器列表
        for (EngineExecuteHandler engineExecuteHandler : handlerList) {
            // 执行数据适配器的处理方法
            EngineResult result = engineExecuteHandler.execute(dataAdapter, data, development);
            if (result != null) {
                return result;
            }
        }
        // 若未找到匹配的数据适配器处理器，则返回null
        return null;
    }


    public Boolean remove(DataAdapter dataAdapter) {
        // 遍历引擎执行处理器列表
        for (EngineExecuteHandler engineExecuteHandler : handlerList) {
            // 执行数据适配器的处理方法
            Boolean result = engineExecuteHandler.remove(dataAdapter);
            if (result) {
                return true;
            }
        }
        // 若未找到匹配的数据适配器处理器，则返回null
        return false;
    }


}
