package com.ssyf.module.robot.domain.strategy;

import com.ssyf.module.robot.domain.entity.ChatConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 聊天策略工厂
 * 根据聊天配置选择合适的聊天策略
 */
@Slf4j
@Component
public class ChatStrategyFactory {
    
    @Autowired
    private List<ChatStrategy> chatStrategies;
    
    /**
     * 根据聊天配置和上下文获取合适的聊天策略
     * @param config 聊天配置
     * @param context 聊天上下文
     * @return 聊天策略，如果没有合适的策略则返回null
     */
    public ChatStrategy getChatStrategy(ChatConfig config, ChatContext context) {
        if (config == null) {
            log.warn("聊天配置为空，无法选择策略");
            return null;
        }
        
        // 检查配置是否启用
        if (config.getStatus() != 1) {
            log.debug("聊天配置未启用，配置ID：{}", config.getUuid());
            return null;
        }
        
        // 优先选择AI策略（如果AI开关打开）
        if (config.getAiSwitch() == 1) {
            ChatStrategy aiStrategy = findStrategyByType(ChatStrategyType.AI);
            if (aiStrategy != null) {
                log.debug("选择AI聊天策略，配置ID：{}", config.getUuid());
                return aiStrategy;
            }
        }
        
        // 使用模板策略作为备选
        ChatStrategy templateStrategy = findStrategyByType(ChatStrategyType.TEMPLATE);
        if (templateStrategy != null) {
            log.debug("选择模板聊天策略，配置ID：{}", config.getUuid());
            return templateStrategy;
        }
        
        log.warn("没有找到合适的聊天策略，配置ID：{}", config.getUuid());
        return null;
    }
    
    /**
     * 根据策略类型查找策略
     * @param strategyType 策略类型
     * @return 对应的策略实例
     */
    private ChatStrategy findStrategyByType(ChatStrategyType strategyType) {
        if (chatStrategies == null) {
            return null;
        }
        
        for (ChatStrategy strategy : chatStrategies) {
            if (strategy.getStrategyType() == strategyType) {
                return strategy;
            }
        }
        
        log.warn("未找到策略类型：{}", strategyType);
        return null;
    }
}