package tech.easyflow.admin.controller.ai.support;

import org.springframework.stereotype.Component;
import tech.easyflow.agent.entity.Agent;
import tech.easyflow.ai.entity.Bot;
import tech.easyflow.ai.entity.DocumentCollection;
import tech.easyflow.ai.entity.Plugin;
import tech.easyflow.ai.entity.Workflow;
import tech.easyflow.skill.entity.Skill;
import tech.easyflow.system.service.SysAccountService;

import javax.annotation.Resource;
import java.math.BigInteger;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.Function;

/**
 * 为 AI 资源批量补充创建人展示名称。
 *
 * <p>该组件只做展示字段填充，不参与权限或查询逻辑。</p>
 *
 * @author Codex
 * @since 2026-04-12
 */
@Component
public class AiResourceCreatorNameSupport {

    @Resource
    private SysAccountService sysAccountService;

    /**
     * 批量填充工作流创建人名称。
     *
     * @param workflows 工作流集合
     */
    public void fillWorkflowCreatorNames(Collection<Workflow> workflows) {
        fillCreatorNames(workflows, Workflow::getCreatedBy, Workflow::setCreatedByName);
    }

    /**
     * 批量填充聊天助手创建人名称。
     *
     * @param bots 聊天助手集合
     */
    public void fillBotCreatorNames(Collection<Bot> bots) {
        fillCreatorNames(bots, Bot::getCreatedBy, Bot::setCreatedByName);
    }

    /**
     * 批量填充知识库创建人名称。
     *
     * @param collections 知识库集合
     */
    public void fillDocumentCollectionCreatorNames(Collection<DocumentCollection> collections) {
        fillCreatorNames(collections, DocumentCollection::getCreatedBy, DocumentCollection::setCreatedByName);
    }

    /**
     * 批量填充插件创建人名称。
     *
     * @param plugins 插件集合
     */
    public void fillPluginCreatorNames(Collection<Plugin> plugins) {
        fillCreatorNames(plugins, Plugin::getCreatedBy, Plugin::setCreatedByName);
    }

    /**
     * 批量填充 Agent 创建人名称。
     *
     * @param agents Agent 集合
     */
    public void fillAgentCreatorNames(Collection<Agent> agents) {
        fillCreatorNames(agents, Agent::getCreatedBy, Agent::setCreatedByName);
    }

    /**
     * 批量填充 Skill 创建人名称。
     *
     * @param skills Skill 集合
     */
    public void fillSkillCreatorNames(Collection<Skill> skills) {
        fillCreatorNames(skills, Skill::getCreatedBy, Skill::setCreatedByName);
    }

    /**
     * 通用的创建人名称填充逻辑。
     *
     * @param resources           资源集合
     * @param createdByGetter     创建人 ID 提取函数
     * @param createdByNameSetter 创建人名称回填函数
     * @param <T>                 资源类型
     */
    private <T> void fillCreatorNames(
            Collection<T> resources,
            Function<T, Number> createdByGetter,
            BiConsumer<T, String> createdByNameSetter
    ) {
        if (resources == null || resources.isEmpty()) {
            return;
        }
        LinkedHashSet<BigInteger> creatorIds = resources.stream()
                .map(createdByGetter)
                .map(this::toBigInteger)
                .filter(Objects::nonNull)
                .collect(java.util.stream.Collectors.toCollection(LinkedHashSet::new));
        if (creatorIds.isEmpty()) {
            return;
        }

        Map<BigInteger, String> displayNameMap = sysAccountService.resolveDisplayNameMap(creatorIds);
        for (T resource : resources) {
            BigInteger creatorId = toBigInteger(createdByGetter.apply(resource));
            if (creatorId == null) {
                continue;
            }
            createdByNameSetter.accept(resource, displayNameMap.getOrDefault(creatorId, creatorId.toString()));
        }
    }

    /**
     * 统一把不同数值类型转换为 {@link BigInteger}。
     *
     * @param value 原始数值
     * @return 归一化后的 {@link BigInteger}
     */
    private BigInteger toBigInteger(Number value) {
        if (value == null) {
            return null;
        }
        if (value instanceof BigInteger) {
            return (BigInteger) value;
        }
        return BigInteger.valueOf(value.longValue());
    }
}
