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

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

import com.baomidou.mybatisplus.extension.service.IService;
import com.yonge.cooleshow.biz.dal.dao.LiveRoomDao;
import com.yonge.cooleshow.biz.dal.entity.ImRoomMessage;
import com.yonge.cooleshow.biz.dal.entity.ImUserStateSync;
import com.yonge.cooleshow.biz.dal.entity.LiveRoom;
import com.yonge.cooleshow.biz.dal.entity.RoomInfoCache;
import com.yonge.cooleshow.biz.dal.vo.TeacherLivingInfoVo;
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
     * @param userId  主讲人id
     * @return
     */
    RoomInfoCache speakerCheckRoomInfo(String roomUid);

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

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

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

    /**
     * 创建临时房间-直播间
     */
    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);

    /**
     * 主讲人-进入房间
     *
     * @param roomUid 房间uid
     * @param userId  主讲人id
     */
    RoomInfoCache speakerJoinRoom(String roomUid);

    /**
     * 观看者-进入房间
     *
     * @param roomUid 房间uid
     * @param userId  观看者id
     */
    RoomInfoCache 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);
}

