package com.ym.mec.biz.service;

import com.ym.mec.biz.dal.dto.*;
import com.ym.mec.biz.dal.entity.PracticeGroup;
import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
import com.ym.mec.biz.dal.page.PracticeGroupQueryInfo;
import com.ym.mec.biz.dal.page.StudentBuyPracticeQueryInfo;
import com.ym.mec.biz.dal.page.StudentQueryInfo;
import com.ym.mec.common.entity.HttpResponseResult;
import com.ym.mec.common.page.PageInfo;
import com.ym.mec.common.service.BaseService;

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

public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {

	/**
	 * @describe 获取学生的陪练课
	 * @author Joburgess
	 * @date 2020/2/3
	 * @param userId:
	 * @return java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleDto>
	 */
	List<CourseScheduleDto> findUserPracticeCourses(Integer userId);

	/**
	 * @describe 检测用户是否能够申请免费陪练课
	 * @author Joburgess
	 * @date 2020/2/22
	 * @param userId:
	 * @return java.util.Map<java.lang.String,java.lang.Object>
	 */
	Map<String,Object> checkCanApplyFreePracticeGroup(Integer userId);

	/**
	 * 给学生指派老师
	 * @param practiceGroup: 申请参数
	 * @return
	 */
	Integer searchTeacherId(PracticeGroup practiceGroup);

	/**
	 * @describe 给广州分部的学生指派老师
	 * @author Joburgess
	 * @date 2020/2/4
	 * @param practiceGroup:
	 * @return java.lang.Integer
	 */
	Integer searchTeacherIdForGuangZhou(PracticeGroup practiceGroup);

    /**
     * @describe 获取陪练课预约参数
     * @author Joburgess
     * @date 2020/1/31
     * @param userId: 用户编号
     * @return java.util.Map
     */
    Map getPracticeApplyParams(Integer userId);

    /**
     * @describe 获取陪练课可预约声部
     * @author Joburgess
     * @date 2020/3/5
     * @param :
     * @return com.ym.mec.common.entity.HttpResponseResult
     */
	Object getPracticeApplySubjects();

    /**
     * @describe 获取可以预约的教师
     * @author Joburgess
     * @date 2020/2/9
     * @param userId: 用户编号
     * @param subjectId: 声部编号
     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
     */
	List<SimpleUserDto> getEnableApplyTeachers(Integer userId, Integer subjectId);

	/**
	 * @describe 获取指定教师的空闲时间
	 * @author Joburgess
	 * @date 2020/2/10
	 * @param userId: 用户编号
	 * @param teacherId: 教师编号
	 * @param firstClassTime: 第一节课开始时间
	 * @return java.util.Map
	 */
	Map getTeacherFreeTimes(Integer userId, Integer teacherId, Date firstClassTime);

    /**
     * @describe 获取指定学员所在分部下的教师空闲时间
     * @author Joburgess
     * @date 2020/2/2
     * @param userId: 用户编号
	 * @param subjectId: 声部编号
     * @param firstClassTime: 第一节课开始时间
     * @return java.util.Map
     */
    Map getTeachersFreeTimes(Integer userId, Integer subjectId, Date firstClassTime);

    /**
     * @describe 获取指定日期内课一预约课程的时间
     * @author Joburgess
     * @date 2020/2/2
     * @param startDay: 天数
     * @param endDay: 天数
     * @return java.util.Map
     */
	List<Date> getEnableApplyDates(Date startDay,Date endDay);


	List<Date> getEnableApplyDatesIncludeAllTimes(Date startDay,Date endDay);

	/**
	 * @describe 陪练课预约
	 * @author Joburgess
	 * @date 2020/1/31
	 * @param practiceGroup: 预约信息
	 * @return java.util.Map
	 */
	Map practiceApply(PracticeGroup practiceGroup);

	/**
	 * 获取陪练课列表
	 * @param queryInfo
	 * @return
	 */
	PageInfo<PracticeGroupDto> findPracticeGroups(PracticeGroupQueryInfo queryInfo);

	/**
	 * 获取陪练课课程计划
	 * @param queryInfo
	 * @return
	 */
	Object findPracticeGroupCourseSchedules(PracticeGroupQueryInfo queryInfo);

	/**
	 * @describe 获取学生上一次购买的记录
	 * @author Joburgess
	 * @date 2020/2/18
	 * @param userId:
	 * @return com.ym.mec.biz.dal.entity.PracticeGroup
	 */
	PracticeGroup findUserLatestPracticeGroup(Integer userId, Long groupId);

    /**
     * @describe 获取陪练课预约参数——付费
     * @author Joburgess
     * @date 2020/1/31
     * @param userId: 用户编号
     * @return java.util.Map
     */
    Map getPayPracticeApplyParams(Integer userId, Integer organId);

	/**
	 * @describe 获取可以预约的教师——付费
	 * @author Joburgess
	 * @date 2020/2/9
	 * @param userId: 用户编号
	 * @param subjectId: 声部编号
	 * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
	 */
	List<SimpleUserDto> getEnableApplyTeachersWithPay(Integer userId, Integer subjectId);

    /**
     * @describe 获取指定教师的空闲时间——付费
     * @author Joburgess
     * @date 2020/2/10
     * @param userId: 用户编号
     * @param teacherId: 教师编号
     * @param firstClassTime: 第一节课开始时间
     * @param buyMonths: 购买月数
     * @return java.util.Map
     */
    Map getPayPracticeTeacherFreeTimes(Integer userId, Integer teacherId, Integer buyMonths, boolean renew, Long groupId);

    /**
     * @describe 获取一周内可以预约课程的时间——付费
     * @author Joburgess
     * @date 2020/2/2
     * @return java.util.Map
     */
    Map<Integer, List<String>> getEnableApplyDatesWithWeek();

    /**
     * @describe 陪练课购买
     * @author Joburgess
     * @date 2020/2/17
     * @param practiceGroupBuyParams: 购买参数
     * @return void
     */
    HttpResponseResult buyPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams);

    /**
     * @describe 支付订单回调
     * @author Joburgess
     * @date 2020/2/17
     * @param order: 支付订单
     * @return void
     */
	void orderCallback(StudentPaymentOrder order);

	/**
	 * @describe 获取用户历史购买的陪练课
	 * @author Joburgess
	 * @date 2020/2/18
	 * @param userId:
	 * @return java.util.List<com.ym.mec.biz.dal.dto.PracticeCourseDto>
	 */
	List<PracticeCourseDto> findUserHistoryBuyPracticeGroups(Integer userId, Long groupId);

	/**
	 * @describe 查询订单信息
	 * @author Joburgess
	 * @date 2020/2/18
	 * @param orderNo: 订单编号
	 * @return com.ym.mec.biz.dal.dto.PracticeBuyResultDto
	 */
	PracticeBuyResultDto queryOrderInfo(String orderNo);

	/**
	 * @describe
	 * @author Joburgess
	 * @date 2020/2/21
	 * @param practiceGroupId:
	 * @return com.ym.mec.common.entity.HttpResponseResult
	 */
	HttpResponseResult repay(Integer userId,Integer practiceGroupId, boolean useBalancePayment) throws Exception;

	/**
	 * @describe 更新历史陪练课程组状态
	 * @author Joburgess
	 * @date 2020/2/23
	 * @param :
	 * @return void
	 */
	void updateHistoryPracticeGroupStatus();

	/**
	 * @describe 获取用户待支付的课程组订单
	 * @author Joburgess
	 * @date 2020/2/26
	 * @param userId:
	 * @return java.util.Map<java.lang.String,java.lang.Object>
	 */
	Map<String, Object> checkExistWaitPayOrder(Integer userId, Long groupId);

	/**
	 * @describe 取消待支付的订单
	 * @author Joburgess
	 * @date 2020/2/26
	 * @param userId: 用户编号
	 * @param groupId:
	 * @return void
	 */
	HttpResponseResult cancelWaitPayOrder(Integer userId, Integer groupId);

	/**
	 * @describe 推送练习报告
	 * @author Joburgess
	 * @date 2020/2/28
	 * @param expiredDate: 报告的截至时间
	 * @param pushType: 推送类型：JIGUANG、SMS、ALL
	 * @return void
	 */
	void pushStudyReport(Date expiredDate,String pushType);

	/**
	 * 获取陪练课列表
	 * @param queryInfo
	 * @return
	 */
	PageInfo<PracticeGroupDto> findPracticeGroupReviews(PracticeGroupQueryInfo queryInfo);

	/**
	 * 购买过网管课的学员列表
	 * @param queryInfo
	 * @return
	 */
	PageInfo<StudentBuyPracticeDto> studentBuys(StudentBuyPracticeQueryInfo queryInfo);

	/**
	 * @describe 获取转化失败的学员列表
	 * @author Joburgess
	 * @date 2020/4/23
	 * @param queryInfo:
	 * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.SimpleUserDto>
	 */
	PageInfo<SimpleUserDto> findConvertDefeatStudents(StudentQueryInfo queryInfo);


	/**
	 * 修改网管课备注
	 * @param groupId
	 * @param memo
	 */
    void updateMemo(Long groupId, String memo);
    
    /**
     * 用户是否购买网管课
     * @param userId
     * @return
     */
    boolean isPurchasedPracticeCourse(Integer userId);

    /**
     * @describe 网管课续费提醒
     * @author Joburgess
     * @date 2020.05.29
     * @return void
     */
    void practiceGroupRenewRemind();
}
