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.auth.api.entity.SysUser;
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.LiveSaleOutDto;
import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
import com.yonge.cooleshow.biz.dal.dto.search.*;
import com.yonge.cooleshow.biz.dal.entity.*;
import com.yonge.cooleshow.biz.dal.vo.*;
import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
import com.yonge.cooleshow.common.entity.HttpResponseResult;
import com.yonge.toolset.base.page.PageInfo;
import org.redisson.api.RMap;

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

/**
 * 课程组表(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);

    /**
     * 取消课程组-下架课程组
     *
     * @param groupId 课程组
     */
    void cancelCourseGroup(Long groupId);

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

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

    /**
     * 获取老师锁定课时数据的缓存-设置过期时间
     *
     * @param teacherId 老师id
     * @return 缓存
     */
    RMap<Long, List<CourseTimeEntity>> getExpireLiveLockTimeCache(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();

    /***
     * 直播课退款单-创建后
     * @param: userOrderRefund
     * @updateTime 2022/5/9 15:11
     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes>
     */
    void refundAfter(UserOrderDetailVo userOrderDetailVo);

    /***
     * 直播课退款单-退款成功
     * @param: userOrderRefund
     * @updateTime 2022/5/9 15:11
     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes>
     */
    void refundSuccess(UserOrderDetailVo userOrderDetailVo);

    /***
     * 直播课退款单-退款失败
     * @param: userOrderRefund
     * @updateTime 2022/5/9 15:11
     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes>
     */
    void refundCancel(UserOrderDetailVo userOrderDetailVo);

    /**
     * 课程组管理-陪练课
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPracticeVo> selectPracticeGroup(IPage<CourseGroupPracticeVo> page, CourseGroupSearch search);

    /**
     * 课程组管理-陪练课-详情
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPracticeDetailVo> selectPracticeGroupDetail(IPage<CourseGroupPracticeDetailVo> page, CourseGroupDetailSearch search);

    /**
     * 课程组管理-直播课
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupLiveVo> selectLiveGroup(IPage<CourseGroupLiveVo> page, CourseGroupSearch search);

    /**
     * 课程组管理-直播课-购买学员
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseSchedulePaymentVo> selectLiveGroupStudent(IPage<CourseSchedulePaymentVo> page, CourseGroupSearch search);

    /**
     * 课程组管理-直播课-教学计划
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseSchedulePlanVo> selectLiveGroupPlan(IPage<CourseSchedulePlanVo> page, CourseGroupSearch search);

    /**
     * 课程组管理-视频课
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupVideoVo> selectVideoGroup(IPage<CourseGroupVideoVo> page, CourseGroupSearch search);

    /**
     * 课程组管理-视频课-购买学员
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupStudentVo> selectVideoGroupStudent(IPage<CourseGroupStudentVo> page, CourseGroupSearch search);

    /**
     * 课程组管理-视频课-教学计划
     *
     * @param page
     * @param search
     * @return
     */
    IPage<VideoLessonGroupDetail> selectVideoGroupPlan(IPage<VideoLessonGroupDetail> page, CourseGroupSearch search);

    /**
     * 课程组管理-直播课-课程信息
     *
     * @param groupId
     * @return
     */
    CourseGroupInfoVo selectLiveGroupInfo(Long groupId);

    /**
     * 课程组管理-琴房课
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoVo> selectPianoGroup(IPage<CourseGroupPianoVo> page, CourseGroupSearch search);

    /**
     * 课程组管理-琴房课-详情
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoDetailVo> selectPianoGroupDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search);

    /**
     * 课程组管理-琴房课-详情-学员名单
     *
     * @param courseId
     * @return
     */
    List<StudentSignVo> studentSign(Long courseId, String type);

    /**
     * 学员管理-琴房课
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoVo> selectPianoGroupStudent(IPage<CourseGroupPianoVo> page, CourseGroupSearch search);

    /**
     * 学员管理-琴房课-详情
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoDetailVo> selectPianoGroupStudentDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search);

    /**
     * 老师管理-琴房课
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoVo> selectPianoGroupTeacher(IPage<CourseGroupPianoVo> page, CourseGroupSearch search);

    /**
     * 老师管理-琴房课-详情
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoDetailVo> selectPianoGroupTeacherDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search);

    /**
     * 直播课分享分润
     *
     * @param sysUser 推荐人
     * @param liveGroupId 直播课程组id
     * @return
     */
    ShareProfitVo shareLiveCourseProfit(SysUser sysUser, Long liveGroupId);

    /**
     * 课程上架/下架
     *
     * @return
     */
    Boolean liveSaleOut(LiveSaleOutDto dto);

    /**
     * 报名中的直播课声部
     *
     * @return
     */
    List<Subject> liveSubject();

    /**
     * 修改直播课程组
     *
     * @param dto
     */
    void updateLiveCourse(LiveCourseGroupDto dto);
}

