package com.easyagents.agent.runtime.message;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 媒体内容块。
 */
public class AgentMediaBlock extends AgentContentBlock {

    private String mimeType;
    private String reference;
    private String url;
    private String data;
    private Integer minPixels;
    private Integer maxPixels;
    private Float fps;
    private Integer maxFrames;
    private Integer totalPixels;
    private String mediaKind;

    /**
     * 创建媒体块。
     *
     * @param mediaKind 媒体类型
     */
    public AgentMediaBlock(String mediaKind) {
        super(resolveType(mediaKind));
        this.mediaKind = mediaKind;
    }

    /**
     * 获取媒体类型。
     *
     * @return 媒体类型
     */
    public String getMediaKind() {
        return mediaKind;
    }

    /**
     * 设置媒体类型。
     *
     * @param mediaKind 媒体类型
     */
    public void setMediaKind(String mediaKind) {
        this.mediaKind = mediaKind;
    }

    /**
     * 获取 MIME 类型。
     *
     * @return MIME 类型
     */
    public String getMimeType() {
        return mimeType;
    }

    /**
     * 设置 MIME 类型。
     *
     * @param mimeType MIME 类型
     */
    public void setMimeType(String mimeType) {
        this.mimeType = mimeType;
    }

    /**
     * 获取由业务侧解析的稳定媒体引用。
     *
     * @return 媒体引用
     */
    public String getReference() {
        return reference;
    }

    /**
     * 设置由业务侧解析的稳定媒体引用。
     *
     * @param reference 媒体引用
     */
    public void setReference(String reference) {
        this.reference = reference;
    }

    /**
     * 获取 URL。
     *
     * @return URL
     */
    public String getUrl() {
        return url;
    }

    /**
     * 设置 URL。
     *
     * @param url URL
     */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
     * 获取 Base64 数据。
     *
     * @return Base64 数据
     */
    public String getData() {
        return data;
    }

    /**
     * 设置 Base64 数据。
     *
     * @param data Base64 数据
     */
    public void setData(String data) {
        this.data = data;
    }

    /**
     * 获取最小像素。
     *
     * @return 最小像素
     */
    public Integer getMinPixels() {
        return minPixels;
    }

    /**
     * 设置最小像素。
     *
     * @param minPixels 最小像素
     */
    public void setMinPixels(Integer minPixels) {
        this.minPixels = minPixels;
    }

    /**
     * 获取最大像素。
     *
     * @return 最大像素
     */
    public Integer getMaxPixels() {
        return maxPixels;
    }

    /**
     * 设置最大像素。
     *
     * @param maxPixels 最大像素
     */
    public void setMaxPixels(Integer maxPixels) {
        this.maxPixels = maxPixels;
    }

    /**
     * 获取帧率。
     *
     * @return 帧率
     */
    public Float getFps() {
        return fps;
    }

    /**
     * 设置帧率。
     *
     * @param fps 帧率
     */
    public void setFps(Float fps) {
        this.fps = fps;
    }

    /**
     * 获取最大帧数。
     *
     * @return 最大帧数
     */
    public Integer getMaxFrames() {
        return maxFrames;
    }

    /**
     * 设置最大帧数。
     *
     * @param maxFrames 最大帧数
     */
    public void setMaxFrames(Integer maxFrames) {
        this.maxFrames = maxFrames;
    }

    /**
     * 获取总像素。
     *
     * @return 总像素
     */
    public Integer getTotalPixels() {
        return totalPixels;
    }

    /**
     * 设置总像素。
     *
     * @param totalPixels 总像素
     */
    public void setTotalPixels(Integer totalPixels) {
        this.totalPixels = totalPixels;
    }

    private static AgentContentBlockType resolveType(String mediaKind) {
        if ("audio".equalsIgnoreCase(mediaKind)) {
            return AgentContentBlockType.AUDIO;
        }
        if ("video".equalsIgnoreCase(mediaKind)) {
            return AgentContentBlockType.VIDEO;
        }
        return AgentContentBlockType.IMAGE;
    }

    /**
     * 额外元数据。
     *
     * @return 额外元数据
     */
    public Map<String, Object> toMetadata() {
        Map<String, Object> metadata = new LinkedHashMap<>(getMetadata());
        metadata.put("mediaKind", mediaKind);
        metadata.put("mimeType", mimeType);
        metadata.put("reference", reference);
        metadata.put("url", url);
        metadata.put("data", data);
        metadata.put("minPixels", minPixels);
        metadata.put("maxPixels", maxPixels);
        metadata.put("fps", fps);
        metadata.put("maxFrames", maxFrames);
        metadata.put("totalPixels", totalPixels);
        return metadata;
    }
}
