package com.platform.plugs.live.handlers;

import com.platform.plugs.common.rpc.RpcResponse;
import com.platform.plugs.live.annotation.RpcParam;
import com.platform.plugs.live.config.LiveCasterConfig;
import com.platform.plugs.live.responseEntity.*;

import java.util.Date;
import java.util.List;

/**
 * @Author TONG
 * @Date 2019/3/6 15:22
 **/
public interface ILiveCasterHandler {


    void configLiveCaster(LiveCasterConfig liveCasterConfig);

    /**
     * 创建并初始化导播台
     * @return
     */
    RpcResponse<Caster> createCasterAndInitCasterConfig();

    /**
     * 创建并初始化导播台
     * @param casterName  导播台名称
     * @return
     */
    RpcResponse<Caster> createCasterAndInitCasterConfig(String casterName);

    /**
     * 创建导播台
     * @return
     */
    RpcResponse<Caster> createCaster();

    /**
     * 创建导播台
     * @param casterName  导播台名称
     * @return
     */
    RpcResponse<Caster> createCaster(String casterName);

    /**
     * 创建导播台
     * @param casterName 导播台名称
     * @param casterTemplate 预设分辨率
     * @return
     */
    RpcResponse<Caster> createCaster(String casterName, String casterTemplate);

    /**
     * 创建导播台
     * @param casterName 导播台名称，不填，默认为CasterId
     * @param casterTemplate 预设分辨率
     * @param expireTime 过期时间
     * @return
     */
    RpcResponse<Caster> createCaster(String casterName, String casterTemplate, Date expireTime);

    /**
     * 删除导播台
     * @param casterId 导播台id
     * @return
     */
    RpcResponse deleteCaster(@RpcParam String casterId);

    /**
     * 查询导播台列表
     * @return
     */
    RpcResponse<List<Caster>> describeCasters();

    /**
     * 查询导播台
     * @param casterId 导播台id
     * @return
     */
    RpcResponse<Caster> describeCaster(@RpcParam String casterId);

    /**
     * 查询导播台配置
     * @param casterId 导播台id
     * @return
     */
    RpcResponse<CasterConfig> describeCasterConfig(@RpcParam String casterId);

    /**
     * 配置导播台，全量覆盖配置信息，若指定参数置为空则清除导播台该项配置。
     * @return
     */
    RpcResponse setCasterConfig(CasterConfig config);

    /**
     * 启动导播台，若PVW、PGM场景不存在则创建，启动PVW、PGM场景，启动底层音视频处理任务。
     * @param casterId 导播台id
     * @return
     */
    RpcResponse<StartCaster> startCaster(@RpcParam String casterId);

    /**
     * 停止导播台，停止PVW、PGM场景，清理输出配置，停止底层音视频处理任务。
     * @param casterId 导播台id
     * @return
     */
    RpcResponse stopCaster(@RpcParam String casterId);

    /**
     * 查询场景信息列表，预监和用户场景列表
     * @param casterId 导播台id
     * @return
     */
    RpcResponse<CasterScenes> describeCasterScenes(String casterId);

    /**
     * 查询场景信息列表，预监和用户场景列表
     * @param casterId 导播台id
     * @param sceneId 场景id
     * @return
     */
    RpcResponse<CasterScenes> describeCasterScenes(@RpcParam String casterId, String sceneId);

    /**
     * 将原场景配置应用至目标场景并生效，仅限PVW场景配置拷贝至PGM场景
     *
     * @param casterId 导播台id
     * @param fromSceneId 原场景ID，仅限于PVM场景
     * @param toSceneId 目标场景ID，仅限于PGM场景
     * @return
     */
    RpcResponse copyCasterSceneConfig(@RpcParam String casterId, @RpcParam String fromSceneId, @RpcParam String toSceneId);

    /**
     * 全量设置场景配置，清空场景配置，并将布局信息设置并生效至指定场景
     *
     * @param casterId 导播台id
     * @param sceneId 场景ID
     * @param layoutId 布局ID
     * @param componentIds 组件ID列表，数组内按照由下至上的顺序排列组件
     * @return
     */
    RpcResponse setCasterSceneConfig(@RpcParam String casterId, @RpcParam String sceneId, @RpcParam String layoutId, @RpcParam List<String> componentIds);

    /**
     * 增量设置场景配置，不清空原配置，布局信息在原场景上增量修改，效率较全量设置高
     * @param casterId 导播台id
     * @param sceneId 场景ID
     * @param layoutId 布局ID
     * @param componentIds 组件ID列表，数组内按照由下至上的顺序排列组件
     * @return
     */
    RpcResponse updateCasterSceneConfig(@RpcParam String casterId, @RpcParam String sceneId, @RpcParam String layoutId, List<String> componentIds);

    /**
     * 清除指定场景配置信息
     * @param casterId 导播台id
     * @param sceneId 场景ID
     * @return
     */
    RpcResponse deleteCasterSceneComponentConfig(@RpcParam String casterId, @RpcParam String sceneId);

    /**
     * 清除指定场景配置信息
     * @param casterId 导播台id
     * @param sceneId 场景ID
     * @return
     */
    RpcResponse deleteCasterSceneLayoutConfig(@RpcParam String casterId, @RpcParam String sceneId);

    /**
     * 清除指定场景配置信息
     * @param casterId 导播台id
     * @param sceneId 场景ID
     * @return
     */
    RpcResponse deleteCasterSceneAllConfig(@RpcParam String casterId, @RpcParam String sceneId);

    /**
     * 启动指定场景，限制仅用于PVW的打开。
     * @param casterId 导播台id
     * @param sceneId 场景ID
     * @return
     */
    RpcResponse<String> startCasterScene(@RpcParam String casterId, @RpcParam String sceneId);

    /**
     * 停止指定场景，限制仅用于PVW的关闭。
     * @param casterId 导播台id
     * @param sceneId 场景ID
     * @return
     */
    RpcResponse stopCasterScene(@RpcParam String casterId, @RpcParam String sceneId);

    /**
     * 更新场景音频配置
     * @param casterId 导播台id
     * @param sceneId 场景ID
     * @param followEnable 是否启用音频跟随。 默认：启用音频跟随 0：混音模式，1：音频跟随视频模式，为空则保持最近一次配置不变。
     * @param audioLayers Audiolayer配置列表。
    AudioLayers不为空时MixList也不能为空，需保持一致。
     * @param mixList 资源位置locationId关联列表。与audioLayers顺序保持一致，若启用Channel时，引用Channel的LocationId，否则引用视频源的LocationId。
     * @return
     */
    RpcResponse updateCasterSceneAudio(@RpcParam String casterId, @RpcParam String sceneId, Integer followEnable, List<AudioLayer> audioLayers,
                                       List<String> mixList);

    /**
     * 查询场景音频配置信息
     * @param casterId 导播台id
     * @param sceneId 场景ID
     * @return
     */
    RpcResponse describeCasterSceneAudio(@RpcParam String casterId, @RpcParam String sceneId);

    /**
     * 添加视频源，视频源数量受限于导播台输入路数。
     * @param casterId 导播台ID。
     * @param resourceName 视频源名称。
     * @param locationId 用于标志视频源位置，定义布局内画面的引用编号，每个位置至多关联一个资源，格式需符合“RV01…RV12”。
     * @return
     */
    RpcResponse<CasterVideoResource> addCasterVideoResource(@RpcParam String casterId, @RpcParam String resourceName, String locationId);

    /**
     * 添加视频源，视频源数量受限于导播台输入路数。
     * @param casterId 导播台ID。
     * @param resourceName 视频源名称。
     * @param locationId 用于标志视频源位置，定义布局内画面的引用编号，每个位置至多关联一个资源，格式需符合“RV01…RV12”。
     * @param liveStreamUrl 直播流地址，视频源类型为直播流时必输。
     * @return
     */
    RpcResponse<CasterVideoResource> addCasterVideoLiveStreamResource(@RpcParam String casterId, @RpcParam String resourceName, String locationId, @RpcParam String liveStreamUrl);

    /**
     * 删除视频资源。
     * @param casterId 导播台ID
     * @param resourceId 资源ID
     * @return
     */
    RpcResponse deleteCasterVideoResource(@RpcParam String casterId, @RpcParam String resourceId);

    /**
     * 修改视频资源。
     * @param casterId 导播台ID
     * @param resourceId 资源ID
     * @param resourceName 视频源名称
     * @param liveStreamUrl 直播流地址
     * @return
     */
    RpcResponse modifyCasterVideoLiveStreamResource(@RpcParam String casterId, @RpcParam String resourceId, String resourceName, @RpcParam String liveStreamUrl);

    /**
     * 查询视频源。
     * @param casterId 导播台ID
     * @return
     */
    RpcResponse<List<CasterVideoResource>> describeCasterVideoResources(@RpcParam String casterId);

    /**
     * 添加导播台布局。
     * @param casterId 导播台Id
     * @param videoLayers Videolayer配置列表，元素为视频画面的配置信息，如宽高、位置等，画面层次按列表顺序排列
     * @param audioLayers Audiolayer配置列表，元素为音频配置信息，无层次关系
     * @param blendList 元素为资源的位置ID（locationId参见添加视频源），与VideoLayers元素顺序对应
     * @param mixList 元素为资源的位置ID（locationId参见添加视频源），与VideoLayers元素顺序对应
     * @return
     */
    RpcResponse addCasterLayout(@RpcParam String casterId, @RpcParam List<VideoLayer> videoLayers, @RpcParam List<AudioLayer> audioLayers,
                                @RpcParam List<String> blendList, @RpcParam List<String> mixList);

    /**
     * 删除布局数据。
     * @param casterId 导播台Id
     * @param layoutId 布局Id
     * @return
     */
    RpcResponse deleteCasterLayout(@RpcParam String casterId, @RpcParam String layoutId);

    /**
     * 查询布局列表。
     * @param casterId 导播台Id
     * @param layoutId 布局Id，若未指定，则查询导播台下所有布局列表
     * @return
     */
    RpcResponse<List<CasterLayout>> describeCasterLayouts(@RpcParam String casterId, String layoutId);

    /**
     * 修改布局配置，传递修改项，非修改内容无需传递。
     * @param casterId 导播台Id。
     * @param layoutId 布局Id。
     * @param videoLayers Videolayer配置列表，采用数组默认序列。
     * @param audioLayers Audiolayer配置列表。
     * @param blendList 元素为资源的位置ID（locationId参见添加视频源），与VideoLayers元素顺序对应。
     * @param mixList 元素为资源的位置ID（locationId参见添加视频源），与VideoLayers元素顺序对应。
     * @return
     */
    RpcResponse modifyCasterLayout(@RpcParam String casterId, @RpcParam String layoutId, List<VideoLayer> videoLayers,
                                   List<AudioLayer> audioLayers, List<String> blendList, List<String> mixList);

    /**
     * 查询导播台通道信息列表。
     * @param casterId 导播台Id
     * @return
     */
    RpcResponse describeCasterChannels(@RpcParam String casterId);

    /**
     * 采用视频源同步模式时需要将视频资源设置到通道中。
     * @param casterId 导播台Id。
     * @param channelId 通道Id。
     * 布局画面的引用编号，每个通道位置至多设置一个资源，数量受限于导播台创建时的通道路数。
     * 格式符合“RV01...RV12”。
     * @param resourceId 视频源Id。
     * @param seekOffset 仅对文件视频有效，直播源无效，必须大于0，表示从相对于首帧的偏差时间作为开始读取的位置。
     * 单位：毫秒(ms)
     * @param playStatus 仅对文件视频有效，直播源无效。
     * 播放状态： 1：播放， 0：暂停。默认为：1：播放
     * @return
     */
    RpcResponse setCasterChannel(@RpcParam String casterId, @RpcParam String channelId, @RpcParam String resourceId, Integer seekOffset, Integer playStatus);

    /**
     * 添加组件
     * @param casterId 导播间Id
     * @param componentName 组件名称，默认为组件ID
     * @param locationId 用于指定组件位置，每个位置至多设置一个组件，格式需符合“RC01…RC99”
     * @param componentType 组件的类型，只能是预设值的一种: “text”、”image”、”caption”等
     * @param effect 组件显示的特效。默认值：none none：无 animateH：水平滚动 animateV：垂直滚动
     * @param componentLayer 设置该组件Layer的尺寸，布局等信息
     * @param textLayerContent 设置该Layer元素属性
     * @param imageLayerContent 设置该Layer元素属性
     * @param captionLayerContent 设置该Layer元素属性
     * @return
     */
    RpcResponse<CasterComponent> addCasterComponent(
            @RpcParam String casterId, String componentName, @RpcParam String locationId,
            @RpcParam String componentType, String effect,
            CasterComponent.ComponentLayer componentLayer, CasterComponent.TextLayerContent textLayerContent,
            CasterComponent.ImageLayerContent imageLayerContent, CasterComponent.CaptionLayerContent captionLayerContent);

    /**
     * 删除组件
     * @param casterId 导播间Id
     * @param componentId 组件ID
     * @return
     */
    RpcResponse deleteCasterComponent(@RpcParam String casterId, @RpcParam String componentId);

    /**
     * 修改组件
     * @param casterId 导播间Id
     * @param componentId 组件ID
     * @param componentName 组件名称，默认为组件ID
     * @param componentType 组件的类型，只能是预设值的一种: “text”、”image”、”caption”等
     * @param effect 组件显示的特效。默认值：none none：无 animateH：水平滚动 animateV：垂直滚动
     * @param componentLayer 设置该组件Layer的尺寸，布局等信息
     * @param textLayerContent 设置该Layer元素属性
     * @param imageLayerContent 设置该Layer元素属性
     * @param captionLayerContent 设置该Layer元素属性
     * @return
     */
    RpcResponse modifyCasterComponent(
            @RpcParam String casterId,  @RpcParam String componentId, String componentName,
            @RpcParam String componentType, String effect,
            CasterComponent.ComponentLayer componentLayer, CasterComponent.TextLayerContent textLayerContent,
            CasterComponent.ImageLayerContent imageLayerContent, CasterComponent.CaptionLayerContent captionLayerContent);

    /**
     * 查询组件
     * @param casterId 导播台ID
     * @param componentId 组件ID
     * @return
     */
    RpcResponse<List<CasterComponent>> describeCasterComponents(@RpcParam String casterId, String componentId);

    /**
     * 查询导播台流信息列表
     * @param casterId 导播台ID
     * @return
     */
    RpcResponse<List<CasterStream>> describeCasterStreamUrl(@RpcParam String casterId);

    /**
     * 将指定场景画面紧急切换至备播视频，限制仅用于PGM场景的备播切换
     * @param casterId 导播台ID
     * @param sceneId 场景ID
     * @return
     */
    RpcResponse effectCasterUrgent(@RpcParam String casterId, @RpcParam String sceneId);

    /**
     * 更新备播片,将视频资源生效至指定场景，场景引用该视频资源时有效。
     * @param casterId 导播台ID
     * @param sceneId 场景ID
     * @param resourceId 资源ID
     * @return
     */
    RpcResponse effectCasterVideoResource(@RpcParam String casterId, @RpcParam String sceneId, @RpcParam String resourceId);
}
