package com.yaoai.pipeline.dto;

import lombok.Builder;
import lombok.Data;

import java.util.List;
import java.util.Map;

/**
 * 结构化视频生成的 pipeline 内部 DTO。
 * 由 controller 层从 yaoai-api 的 {@code StructuredVideoGenerateRequest} 映射而来，
 * 避免 yaoai-pipeline 反向依赖 yaoai-api。
 */
@Data
@Builder
public class StructuredVideoSubmission {

    private Long userId;
    private Long episodeId;
    private Long storyboardId;

    /** @图1 角色图 TOS key（旧版单角色字段，保留兼容；当 characterImageKeys 非空时忽略） */
    private String characterImageKey;
    /** V16：多角色出镜，按 @图1..@图N 顺序排列；非空时优先于 characterImageKey */
    private List<String> characterImageKeys;
    /** 场景图 TOS key（紧跟在最后一个角色图之后） */
    private String sceneImageKey;
    /** @图3+ 道具图 TOS key 列表（可空） */
    private List<String> propImageKeys;
    /** 风格图 TOS key（可空，永远是最后一张） */
    private String styleImageKey;
    /** 首帧参考图 TOS key（可空，作为额外参考图参与） */
    private String firstFrameImageKey;
    /** 尾帧参考图 TOS key（可空，作为额外参考图参与） */
    private String lastFrameImageKey;

    /** 用户原始结构化输入（5 段或单段 freeform），用于落库存证 */
    private Map<String, String> userPromptRaw;

    /** 拆开的 5 段，传给 SeedancePromptBuilder（与 freeformPrompt 二选一） */
    private String characterAction;
    private String sceneEvent;
    private String cameraMovement;
    private String lightingAtmosphere;
    private String videoStyle;

    /** V17：单段 freeform 提示词，非空时优先于上面 5 段 */
    private String freeformPrompt;

    private Integer durationSeconds;
    private String ratio;
    /** Seedance 模型 ID，为空时由 SeedanceServiceImpl 兜底为 ArkProperties.videoModel */
    private String model;
    private Boolean generateAudio;
}
