package com.yaoai.api.dto.ai;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;

import java.util.List;

/**
 * 分镜视频结构化生成请求。
 * 替代旧的“prompt 内嵌 @图N + image_keys[] 顺序绑定”方式。
 */
@Data
public class StructuredVideoGenerateRequest {

    /** 关联剧集（可选） */
    private Long episodeId;

    /** 关联分镜（可选） */
    private Long storyboardId;

    /** @图1 角色图（旧版单角色字段，characterImageKeys 为空时使用） */
    private String characterImageKey;

    /** V16：多角色出镜，按 @图1..@图N 顺序，和 characterImageKey 至少传一个 */
    @Size(max = 5, message = "出镜角色最多 5 个")
    private List<String> characterImageKeys;

    /** 场景图（可选）。角色/场景/道具至少传一种参考图，由 service 层校验。 */
    private String sceneImageKey;

    /** 用户结构化提示词（旧版 5 段，和 freeformPrompt 二选一，至少一项非空） */
    @Valid
    private UserPrompt userPrompt;

    /** V17：单段 freeform 提示词（前端简化为单输入框后的主要入口） */
    private String freeformPrompt;

    /** @图 + 道具图（可选，按顺序对应 @图N、@图...，最大 5 张） */
    @Size(max = 5, message = "道具图最多 5 张")
    private List<String> propImageKeys;

    /** 风格图（可选，固定为最后一张） */
    private String styleImageKey;

    /** 首帧参考图（可选，作为视频生成参考图参与，不强制模型首帧锁定） */
    private String firstFrameImageKey;

    /** 尾帧参考图（可选，作为视频生成参考图参与，不强制模型尾帧锁定） */
    private String lastFrameImageKey;

    /** 视频时长（秒） */
    @Min(value = 5, message = "视频时长最短 5 秒")
    @Max(value = 15, message = "视频时长最长 15 秒")
    private Integer duration = 15;

    /** 16:9 / 9:16 / 1:1 */
    @Pattern(regexp = "16:9|9:16|1:1", message = "宽高比仅支持 16:9 / 9:16 / 1:1")
    private String ratio = "16:9";

    /** @deprecated 模型统一由运营端视频模型配置决定，客户端传入值会被忽略。 */
    @Deprecated
    private String model;

    /** 是否生成配音 */
    private Boolean generateAudio = Boolean.FALSE;
}
