package tech.easyflow.admin.model.ai;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

import java.math.BigInteger;
import java.util.List;
import java.util.Map;

/**
 * 工作流设计器所需的安全选项视图。
 *
 * @param models 模型选项
 * @param knowledges 知识库选项
 * @param codeEngines 代码执行引擎选项
 */
public record WorkflowDesignerOptionsView(
        List<ModelOption> models,
        List<KnowledgeOption> knowledges,
        List<Map<String, Object>> codeEngines
) {

    /**
     * 模型安全选项。
     *
     * @param id 模型 ID
     * @param title 模型标题
     * @param description 模型描述
     * @param modelProvider 供应商安全摘要
     */
    public record ModelOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            String title,
            String description,
            ProviderOption modelProvider
    ) {
    }

    /**
     * 模型供应商安全摘要。
     *
     * @param providerName 供应商名称
     * @param providerType 供应商类型
     * @param icon 供应商图标
     */
    public record ProviderOption(String providerName, String providerType, String icon) {
    }

    /**
     * 知识库安全选项。
     *
     * @param id 知识库 ID
     * @param title 知识库标题
     * @param description 知识库描述
     */
    public record KnowledgeOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            String title,
            String description
    ) {
    }

    /**
     * 插件安全选项。
     *
     * @param id 插件 ID
     * @param name 插件名称
     * @param description 插件描述
     * @param icon 插件图标
     * @param tools 可用工具
     */
    public record PluginOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            String name,
            String description,
            String icon,
            List<PluginToolOption> tools
    ) {
    }

    /**
     * 插件工具安全选项。
     *
     * @param id 工具 ID
     * @param name 工具名称
     * @param description 工具描述
     */
    public record PluginToolOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            String name,
            String description
    ) {
    }

    /**
     * 数据源安全选项。
     *
     * @param id 数据源 ID
     * @param sourceName 数据源名称
     * @param sourceType 数据源类型
     */
    public record DataSourceOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            String sourceName,
            String sourceType
    ) {
    }

    /**
     * 数据目录安全选项。
     *
     * @param id 目录 ID
     * @param sourceId 数据源 ID
     * @param catalogName 目录名称
     * @param catalogDesc 目录描述
     */
    public record CatalogOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            @JsonSerialize(using = ToStringSerializer.class) BigInteger sourceId,
            String catalogName,
            String catalogDesc
    ) {
    }

    /**
     * 已接入数据集安全选项。
     *
     * @param id 数据集 ID
     * @param sourceId 数据源 ID
     * @param catalogId 目录 ID
     * @param tableName 数据表名称
     * @param tableDesc 数据表描述
     */
    public record DatasetOption(
            @JsonSerialize(using = ToStringSerializer.class) BigInteger id,
            @JsonSerialize(using = ToStringSerializer.class) BigInteger sourceId,
            @JsonSerialize(using = ToStringSerializer.class) BigInteger catalogId,
            String tableName,
            String tableDesc
    ) {
    }

    /**
     * 数据集字段安全视图。
     *
     * @param fieldName 字段名称
     * @param fieldDesc 字段描述
     * @param jdbcType JDBC 类型
     * @param fieldType 业务字段类型
     */
    public record DatasetFieldOption(
            String fieldName,
            String fieldDesc,
            String jdbcType,
            Integer fieldType
    ) {
    }

    /**
     * 数据集结构安全视图。
     *
     * @param tableName 数据表名称
     * @param tableDesc 数据表描述
     * @param fields 字段列表
     */
    public record DatasetSchemaOption(
            String tableName,
            String tableDesc,
            List<DatasetFieldOption> fields
    ) {
    }
}
