package com.dne.ems.dto.ai;

import java.util.List;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.Builder;
import lombok.Data;
import lombok.experimental.SuperBuilder;

/**
 * 火山引擎聊天API请求DTO
 * 
 * <p>该类封装了向火山引擎AI聊天服务发送请求所需的所有数据结构。
 * 包括模型名称、消息列表和工具列表等核心组件。</p>
 *
 * @version 1.0
 * @since 2025-06
 */
@Data
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class VolcanoChatRequest {
    /**
     * 要使用的AI模型名称
     */
    private String model;
    
    /**
     * 对话消息列表，包含用户和系统的对话历史
     */
    private List<Message> messages;
    
    /**
     * 可用工具列表，定义AI可以调用的函数
     */
    private List<Tool> tools;

    /**
     * 表示对话中的一条消息
     * <p>包含角色信息和内容部分列表</p>
     */
    @Data
    @SuperBuilder
    public static class Message {
        private String role;
        private List<ContentPart> content;
    }
    
    /**
     * 内容部分接口，用于定义消息内容的不同类型
     * <p>作为TextContentPart和ImageUrlContentPart的共同父接口</p>
     */
    public interface ContentPart {
    }

    @Data
    @SuperBuilder
    public static class TextContentPart implements ContentPart {
        /**
         * 内容类型，固定为"text"
         */
        @Builder.Default
        private String type = "text";
        
        /**
         * 文本内容
         */
        private String text;
    }

    @Data
    @SuperBuilder
    public static class ImageUrlContentPart implements ContentPart {
        /**
         * 内容类型，固定为"image_url"
         */
        @Builder.Default
        private String type = "image_url";
        
        /**
         * 图片URL信息
         */
        @JsonProperty("image_url")
        private ImageUrl imageUrl;
    }

    @Data
    @Builder
    public static class ImageUrl {
        /**
         * 图片的URL地址
         */
        private String url;
    }

    @Data
    @Builder
    public static class Tool {
        /**
         * 工具类型
         */
        private String type;
        /**
         * 函数定义
         */
        private FunctionDef function;
    }

    @Data
    @Builder
    public static class FunctionDef {
        /**
         * 函数名称
         */
        private String name;
        /**
         * 函数描述
         */
        private String description;
        /**
         * 函数参数定义
         */
        private Parameters parameters;
    }

    @Data
    @Builder
    public static class Parameters {
        /**
         * 参数类型
         */
        private String type;
        /**
         * 参数属性定义
         */
        private Object properties;
        /**
         * 必需的参数列表
         */
        @JsonProperty("required")
        private List<String> required;
    }
}