package com.yonge.cooleshow.biz.dal.service;

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

import com.baomidou.mybatisplus.extension.service.IService;
import com.microsvc.toolkit.middleware.live.message.TencentWrapper;
import com.yonge.cooleshow.biz.dal.dao.LiveRoomDao;
import com.yonge.cooleshow.biz.dal.dto.LiveRoomStatus;
import com.yonge.cooleshow.biz.dal.dto.TencentData;
import com.yonge.cooleshow.biz.dal.entity.*;
import com.yonge.cooleshow.biz.dal.enums.RoomTypeEnum;
import com.yonge.cooleshow.biz.dal.vo.TeacherLivingInfoVo;
import com.yonge.cooleshow.biz.dal.wrapper.liveroom.ImLiveBroadcastRoomMemberWrapper;
import com.yonge.cooleshow.biz.dal.wrapper.liveroom.LiveRoomWrapper;
import com.yonge.toolset.base.page.PageInfo;

/**
 * 直播房间与课程的关系表表(LiveRoom)表服务接口
 *
 * @author hgw
 * @since 2022-03-18 15:41:17
 */
public interface LiveRoomService extends IService<LiveRoom> {

    LiveRoomDao getDao();

    /**
     * 分页查询当前用户关联的房间信息
     *
     * @param param 参数
     *              <p>roomType 房间类型  LIVE-直播课  TEMP-临时直播间
     *              <p>liveState 直播状态 0未开始 1已开始 2已结束
     *              <p>page 页数
     *              <p>rows 每页数量
     */
    PageInfo<LiveRoom> queryPageRoom(Map<String, Object> param);

    /**
     * 校验房间信息，及个人信息
     *
     * @param roomUid 房间uid
     */
    RoomInfoCache studentCheckRoomInfo(String roomUid);


    /**
     * 主讲人查询并校验房间信息
     *
     * @param roomUid 房间uid
     * @return
     */
    LiveRoomWrapper.LiveRoomVo speakerCheckRoomInfo(String roomUid);

    /**
     * 定时任务创建直播间
     */
    void createCourseLiveRoom();

    /**
     * 定时任务-清理过期的房间
     */
    void destroyExpiredLiveRoom();

    /**
     * 手动关闭直播间
     *
     * @param roomUId 房间uid
     */
    void destroyLiveRoom(String roomUId);

    void updateLiveCourseSchedule(String preCreateRoomMinute, Map<Long, String> titleMap, Map<Long, String> remarkMap, RoomTypeEnum en, Date now, CourseSchedule c);

    /**
     * 创建临时房间-直播间
     */
    String createTempLiveRoom(Map<String, Object> param);

    /**
     * <p>主讲人处理进入和退出房间数据
     * <p>观看者只处理退出房间数据
     *
     * @param userState 用户状态数据
     */
    void opsRoom(List<ImUserStateSync> userState);

    /**
     * 同步点赞数量
     *
     * @param roomUid 房间uid
     * @param likeNum 点赞数
     */
    void syncLike(String roomUid, Integer likeNum);


    void setGroupMemberDefinedData(LiveRoomWrapper.LiveRoomVo  roomVo, Integer onlineUser, Integer totalUser);
    /**
     * 观看者-进入房间
     *
     * @param roomUid 房间uid
     * @param userId  观看者id
     */
    void joinRoom(String roomUid, Long userId);

    /**
     * 发送消息
     *
     * @param message
     */
    void publishRoomMessage(ImRoomMessage message);

    /**
     * 方便测试观察房间数据的方法
     */
    Map<String, Object> test(String roomUid);

    /**
     * 根据主讲人id查询直播进行中的直播间信息
     *
     * @param speakerId 房间uid
     */
    LiveRoom getLiveInRoomBySpeakerId(Long speakerId);
    
    /**
     * 查询老师正在直播的列表
     * 
     * @return
     */
    List<TeacherLivingInfoVo> queryTeacherLivingList();

    /**
     * 设置是否连麦
     *
     * @param roomUid 房间号
     * @param whetherMic 是否连麦 0： 是 1：否
     */
    void whetherMic(String roomUid, Integer whetherMic);

    /**
     * 直播间详情信息
     * @param liveRoomId 直播间编号
     * @param userId 分享用户ID
     * @return LiveRoomWrapper
     */
    LiveRoomWrapper findLiveRoomDetailInfoByRoomId(String liveRoomId, Long userId);

    void createLiveRoomVideoRecord(TencentData.CallbackSteamRecordEvent event);


    /**
     * 直播群成员在线状态回调处理
     *
     */
    void callbackOnMemberStateChange(TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange);
    /**
     * 群成员离开之后回调
     */
    void callbackAfterMemberExit(TencentData.CallbackAfterMemberExit callbackAfterMemberExit);

    /**
     * 新成员入群之后回调
     */
    void callbackAfterNewMemberJoin(TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin);

    // 定时任务凌晨2点，关闭腾讯直播间， 融云直播间自动关闭，不做处理
    void destroyLiveRoom();

    boolean tryDestroyLiveRoom(LiveRoom liveRoom);


    /**
     * 更新主播直播间状态
     *
     * @param status 直播间状态
     * @return
     */
    Boolean updateRoomStatus(LiveRoomStatus status);

    /**
     * 进入直播间检查数据
     *
     * @param roomUid 房间uid
     * @param userId  用户id
     * @param osType  默认学生端  0:pc端 1:学生端 2:老师端
     */
    LiveRoomWrapper.LiveRoomVo queryRoomAndCheck(String roomUid, Long userId, int osType);

    /**
     * 直播间推流状态查询
     *
     * @param roomUid 房间号
     */
    TencentWrapper.LiveStreamState roomLiveStreamStatus(String roomUid);


    /**
     * 查询直播间信息
     *
     * @param roomUid 直播间uid
     */
    LiveRoomWrapper.LiveRoomVo queryRoomInfo(String roomUid);


    ImLiveBroadcastRoomMemberWrapper.RoomMemberNumDto getRoomMemberNumDto(String roomUid);

    /**
     * 同步直播间点赞数
     *
     * @param roomUid 直播间uid
     * @return int
     */
    int syncLikeCount(String roomUid);


    List<LiveRoomWrapper.BaseRoomUserVo> queryRoomLimitOnlineUserInfo(String roomUid);


    /**
     * 修改用户连麦状态
     *
     * @param roomUid 直播房间id
     * @param userId 用户id
     * @param whetherMicStatus 连麦状态
     */
    void userWhetherMic(String roomUid, Long userId, Integer whetherMicStatus);

    long joinRoom(String roomUid, Long userId, Boolean microphoneFlag);

    /**
     * 更新直播推流时间
     * @param event TencentData.CallbackStreamStateEvent
     */
    void updateLiveRoomPushStreamTime(TencentData.CallbackStreamStateEvent event);

    void closeLive(String roomUid, Long speakerId, String sequence);

    void startLive(String roomUid, Integer speakerId, String sequence);

    /**
     * 只修改状态，不关闭三方直播
     *
     * @param room 直播间
     */
    void closeRoom(LiveRoom room);
}

