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;

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

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

    /** 视频时长（秒） */
    @Min(value = 5, message = "视频时长最短 5 秒")
    @Max(value = 30, message = "视频时长最长 30 秒")
    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";

    /** Seedance 模型 ID（doubao-seedance-2-0-260128 / doubao-seedance-2-0-fast-260128），为空走 ArkProperties 默认值 */
    @Pattern(regexp = "doubao-seedance-2-0-260128|doubao-seedance-2-0-fast-260128",
            message = "模型仅支持 Seedance 2.0 标准 / 极速")
    private String model;

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