package com.sjyt.icom.asst.service.impl;

import com.sjyt.icom.asst.common.event.SrsCallBackEvent;
import com.sjyt.icom.asst.common.model.srs.*;
import com.sjyt.icom.asst.context.handle.srs.RtspHandleContext;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/***
 * @author renyanru
 * @version V1.0.0
 * @date 2022/6/22 15:48
 */
@Slf4j
@Service
@AllArgsConstructor
public class SrsCallBackService extends BaseSrsCallBackService {
    private final RtspHandleContext rtspHandleContext;

    /**
     * 用户推流(即直播)时触发
     *
     * @param data data
     * @return 返回0允许推流，返回非0拒绝推流
     */
    @Override
    public int publish(SrsCallBackOnPublish data) {
        SrsCallBackEvent srsCallBackEvent = convertUnPublish(data);
        return rtspHandleContext.todo(srsCallBackEvent);
    }

    /**
     * 客户端断开连接时触发
     * 客户端断开包括客户端主动断开和客户端被动断开（服务器主动停止客户端推流断开）
     *
     * @param data data
     * @return r
     */
    @Override
    public int close(SrsCallBackOnClose data) {
        return rtspHandleContext.todo(convertClose(data));
    }

    /**
     * 客户端连接SRS服务器时回调函数请求此接口
     *
     * @param data data
     * @return 返回0表示校验成功，非0为失败
     */
    @Override
    public int connect(SrsCallBackOnConnect data) {
        return rtspHandleContext.todo(convertConnect(data));
    }

    /**
     * 客户端停止推流时触发
     *
     * @param data data
     * @return 包括客户端主动停止推流和客户端被动停止推流（服务器主动停止客户端推流）
     */
    @Override
    public int unpublished(SrsCallBackOnUnPublish data) {
        return rtspHandleContext.todo(convertUnPublish(data));

    }

    /**
     * 客户端拉流（播放）时触发
     *
     * @param data data
     * @return 0表示允许拉流，非0表示拒绝拉流
     */
    @Override
    public int play(SrsCallBackOnPlay data) {
        return rtspHandleContext.todo(convertPlay(data));
    }

    /**
     * 客户端停止播放时触发
     * 官方介绍客户端停止播放时触发，可再次播放，实际通过PC端和移动端谷歌/火狐浏览器（webRTC协议拉流仅支持这俩浏览器）测试貌似仅服务器主动踢流时会触发此回调，
     * 客户端端主动暂停后可再播放，不会触发此回调，客户端关闭窗口会触发此回调
     *
     * @param data data
     * @return r
     */
    @Override
    public int stop(SrsCallBackOnStop data) {
        return rtspHandleContext.todo(convertStop(data));
    }
}
