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

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentCourseSearch;
import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentSearch;
import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
import com.yonge.cooleshow.biz.dal.vo.*;
import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
import com.yonge.cooleshow.common.entity.HttpResponseResult;
import com.yonge.toolset.mybatis.page.PageInfo;
import org.redisson.api.RMap;

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

/**
 * 课程组表(CourseGroup)表服务接口
 *
 * @author hgw
 * @since 2022-03-18 15:29:10
 */
public interface CourseGroupService extends IService<CourseGroup> {

    CourseGroupDao getDao();

    /**
     * 查询课程组详情-直播课详情
     *
     * @param groupId 课程组id
     */
    LiveCourseInfoVo queryLiveCourseInfo(Long groupId);

    /**
     * 分页查询课程组列表
     *
     * @param param 传入参数
     *              <p> - teacherId    老师id
     *              <p> - groupStatus  课程组状态  ING(进行中)  NOT_SALE(未开售,未上架) APPLY(报名中,销售中) COMPLETE(已完成)
     *              <p> - row 条数
     *              <p> - page 页数
     *              <p> - search 模糊搜索关键字
     */
    PageInfo<CourseGroupVo> queryPageLiveCourseGroup(Map<String, Object> param);

    void addLiveCourse(LiveCourseGroupDto dto);

    /**
     * 创建直播课程组时将课时写到缓存当作锁定的时间
     */
    List<CourseTimeEntity> lockCourseToCache(CheckCourseTimeDto dto);

    /**
     * 创建直播课程组-解除锁定课程时间-删除写到缓存当作锁定的课时
     */
    void unlockCourseToCache(Long teacherId);

    /**
     * 获取老师锁定的直播课时数据的缓存
     *
     * @param teacherId 老师id
     * @return 缓存 key teacherId value List<CourseTimeEntity>
     */
    RMap<Long, List<CourseTimeEntity>> getLiveLockTimeCache(Long teacherId);

    /**
     * 平台方 老师详情直播课列表
     *
     * @param page  分页
     * @param query 查询条件
     * @return page
     */
    IPage<LiveCourseGroupVo> selectAdminLivePage(IPage<LiveCourseGroupVo> page, LiveCourseGroupSearch query);

    /**
     * 课程详情 购买学生
     *
     * @param page  分页
     * @param query 查询条件
     * @return page
     */
    IPage<LiveCourseGroupStudentVo> selectAdminLiveStudentPage(IPage<LiveCourseGroupStudentVo> page,
                                                               LiveCourseGroupStudentSearch query);

    /**
     * 直播课程详情 课程计划
     *
     * @param courseGroupId 课程组id
     * @return
     */
    List<LiveCourseGroupPlanVo> selectAdminLivePlan(Long courseGroupId);

    /**
     * 直播课详情 直播课信息
     *
     * @param courseGroupId 直播课id
     * @return
     */
    LiveCourseGroupVo detail(Long courseGroupId);

    /**
     * 直播详情 直播课学生到课状态
     *
     * @param page  分页信息
     * @param query 查询条件
     * @return
     */
    IPage<LiveCourseGroupStudentCourseVo> selectAdminLiveStudentCoursePage(IPage<LiveCourseGroupStudentCourseVo> page, LiveCourseGroupStudentCourseSearch query);

    /**
     * 学生购买直播课程组
     *
     * @param orderReqInfo 订单信息
     */
    HttpResponseResult<OrderCreateRes> buyLiveCourse(OrderReq.OrderReqInfo orderReqInfo);

    /**
     * 学生购买直播课程-成功-回调
     */
    void buyLiveCourseSuccess(UserOrderDetailVo orderParam);

    /**
     * 学生购买直播课程-取消-回调
     */
    void buyLiveCourseCancel(UserOrderDetailVo orderParam);

    /**
     * <p>定时将符合开售日期的未开售的直播课课程组修改为报名中状态-每隔10分钟执行一次
     * <p>定时将符合结束售卖日期的在售卖中的直播课课程组修改为取消或者成课状态状态-每隔10分钟执行一次
     */
    void opsCourseGroup();

}

