package com.ym.mec.biz.service;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.ym.mec.biz.dal.dto.*;
import com.ym.mec.biz.dal.entity.ApprovalStatus;
import com.ym.mec.biz.dal.entity.MusicGroup;
import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
import com.ym.mec.biz.dal.entity.StudentPreRegistration;
import com.ym.mec.biz.dal.entity.StudentRegistration;
import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
import com.ym.mec.common.entity.ImGroupMember;
import com.ym.mec.common.page.PageInfo;
import com.ym.mec.common.service.BaseService;

public interface MusicGroupService extends BaseService<String, MusicGroup> {
	/**
	 * 建团申请数据提交
	 * @param subFeeSettingDto
	 * @Author superzou
	 */
	String createGroup(SubFeeSettingDto subFeeSettingDto) throws Exception;
	
	/**
	 * 预报名
	 * @param studentPreRegistration
	 * @return
	 */
	boolean preRegister(StudentPreRegistration studentPreRegistration);
	
	/**
	 * 结束预报名
	 * @param musicGroupId
	 * @param isCheckStudentNum
	 * @return
	 */
	boolean finishPreApply(String musicGroupId,boolean isCheckStudentNum);

	/**
	 * 发送家长会通知
	 * @param userId
	 * @param musicGroupId
	 * @param meetingDate
	 * @param address
	 * @return
	 */
	boolean sendParentMeetingNotice(Integer userId, String musicGroupId, Date meetingDate, String address);

	/**
	 * 零星缴费
	 * @param sporadicPayDto
	 * @return
	 */
	Map sporadicPay(SporadicPayDto sporadicPayDto) throws Exception;

	/**
	 * 缴费
	 * @param registerPayDto
	 * @return
	 */
	Map pay(RegisterPayDto registerPayDto) throws Exception;

	/**
	 * 继续缴费
	 * @param registerPayDto
	 * @return
	 */
	Map rePay(RegisterPayDto registerPayDto) throws Exception;

	/**
	 * 获取学生所在乐团详情
	 * @return
	 */
	List<MusicCardDto> queryUserMusicGroups(Integer userId);

	/**
	 * 获取个人中心乐团数据
	 * @param id
	 * @return
	 */
	MusicCardDto queryPersonalMusicGroups(Integer id);

	/**
	 * 根据学员编号获取相关老师列表
	 * @param studentId
	 * @return
	 */
	List<BasicUserDto> findTeachersByStuId(Integer studentId,String search);

	/**
	 * 取消乐团
	 * @param musicGroupId 乐团编号
	 */
	boolean cancelMusicGroup(String musicGroupId);

	/**
	 * 删除乐团
	 * @param musicGroupId 乐团编号
	 * @return
	 */
	boolean deleteMusicGroup(String musicGroupId);

	/**
	 * 暂停乐团
	 * @param musicGroupId 乐团编号
	 */
	boolean pauseMusicGroup(String musicGroupId);

	/**
	 * 恢复乐团
	 * @param musicGroupId 乐团编号
	 */
	boolean resumeMusicGroup(String musicGroupId);

	/**
	 * 延长缴费时间
	 * @param musicGroupId 乐团编号
	 * @param expireDate 延长缴费的截止日期
	 * @return
	 */
	boolean extensionPaymentExpireDate(String musicGroupId, Date expireDate);

	/**
	 * 延长缴费
	 * @param musicGroupId 乐团编号
	 * @param expireDate 延长缴费的截止日期
	 * @return
	 */
	boolean extensionApplyExpireDate(String musicGroupId, Date expireDate);

	/**
	 * 延长预报名时间
	 * @param musicGroupId 乐团编号
	 * @param expireDate 预报名的截止日期
	 * @return
	 */
	boolean extensionPreApplyExpireDate(String musicGroupId, Date expireDate);

	/**
	 * 申请退团
	 * @param musicGroupId 乐团编号
	 * @param reason
	 * @return
	 */
	boolean applyQuitMusicGroup(String musicGroupId, String reason);

	/**
	 * 取消退团
	 * @param userId
	 * @param musicGroupId
	 * @param reason
	 * @return
	 */
	boolean cancelQuitMusicGroup(Integer userId, String musicGroupId, String reason);

	/**
	 * 审批退团
	 * @param id
	 * @param status
	 * @param reason
	 * @param isRefundCourseFee 是否退还课程费用
	 * @param isRefundInstrumentFee 是否退还乐器费用
	 * @param isRefundTeachingAssistantsFee 是否退还教辅费用
	 * @return
	 */
	boolean approveQuitMusicGroup(Long id, ApprovalStatus status, String reason, boolean isRefundCourseFee, boolean isRefundInstrumentFee,
			boolean isRefundTeachingAssistantsFee);

	/**
	 * 一键退团
	 * @param musicGroupId
	 * @param userId
	 * @param reason
	 * @param isRefundCourseFee 是否退还课程费用
	 * @param isRefundInstrumentFee 是否退还乐器费用
	 * @param isRefundTeachingAssistantsFee 是否退还教辅费用
	 * @return
	 */
	boolean directQuitMusicGroup(String musicGroupId, Integer userId, String reason, boolean isRefundCourseFee, boolean isRefundInstrumentFee,
			boolean isRefundTeachingAssistantsFee);

	/**
	 *  续费
	 * @param calenderId 缴费项目编号
	 * @param userId 用户编号
	 * @param isUseBalancePayment 是否使用余额付款
	 * @return
	 */
	Map renew(Long calenderId, Integer userId, boolean isUseBalancePayment) throws Exception;

	/**
	 * 学生支付订单
	 * @param studentPaymentOrder
	 * @return
	 */
	boolean renewForCallback(StudentPaymentOrder studentPaymentOrder) throws IOException;

	/**
	 * 课酬调整
	 * @param courseScheduleId 课程编号
	 * @param teacherId 老师编号
	 * @param salary 老师薪水
	 * @param subsidy 老师补贴
	 * @param scope 范围(one,all)
	 * @return
	 */
	boolean updateTeacherCoursesSalary(Long courseScheduleId, Integer teacherId, BigDecimal salary, BigDecimal subsidy, String scope);

	/**
	 * 获取乐团列表
	 * @param queryInfo
	 * @return
	 */
	PageInfo<MusicGroup> queryMusicGroupPage(MusicGroupQueryInfo queryInfo);

	/**
	 * 获取乐团列表
	 * @param queryInfo
	 * @return
	 */
	PageInfo<MusicGroup> findEduTeacherMusicGroups(MusicGroupQueryInfo queryInfo);

	/**
	 * 修改乐团基本信息
	 * @param subFeeSettingDto
	 */
	void updateBaseInfo(SubFeeSettingDto subFeeSettingDto) throws Exception;

	/**
	 * 获取修改乐团时的基本信息数据
	 * @param musicGroupId
	 * @return
	 */
	SubFeeSettingDto findMusicGroupBasicInfo(String musicGroupId);

	/**
	 * 获取乐团列表
	 * @param musicGroupIds
	 * @return
	 */
	List<MusicGroup> queryListByIds(Set<String> musicGroupIds);

	/**
	 * 乐团详情--课酬调整--课程教师列表
	 * @param courseScheduleId
	 * @return
	 */
	List<CourseScheduleTeachersDto> queryTeacherSalary(Long courseScheduleId,Integer teacherId);

	/**
	 * 开启缴费（报名中 -->  缴费中）
	 * @param musicGroupId
	 * @return
	 */
	MusicGroup openPay(String musicGroupId, String expireDate) throws Exception;

	/**
	 * 获取乐团详情
	 * @param musicGroupId
	 * @return
	 */
	MusicGroup getMusicGroupDetail(String musicGroupId);

	/**
	 * 获取乐团老师列表
	 * @param musicGroupId
	 * @return
	 */
	List<ImGroupMember> queryMusicGroupTeachers(String musicGroupId);

	/**
	 * 乐团确认成立
	 * @param musicGroupId
	 */
	void musicGroupFound(String musicGroupId) throws Exception;

	/**
	 * 乐团修改，获取乐团声部信息数据
	 * @param musicGroupId
	 * @return
	 */
	SubFeeSettingDto findMusicGroupSubjectInfo(String musicGroupId);

	/**
	 * 修改乐团声部、商品组信息
	 * @param subFeeSettingDto
	 */
	void updateSubjectInfo(SubFeeSettingDto subFeeSettingDto) throws Exception;

	/**
	 * 修改乐团计划招生人数
	 * @param updateExpectedNumDtos
	 * @return
	 */
	void updateExpectedStudentNum(List<UpdateExpectedNumDto> updateExpectedNumDtos);

	/**
	 * 开启乐团（筹备中 -->  进行中）
	 * @param musicGroupId
	 */
	void musicGroupAction(String musicGroupId) throws Exception;

	/**
	 * 提交审核（草稿 -> 审核中）
	 * @param musicGroupId
	 */
	void musicGroupAudit(String musicGroupId) throws Exception;

	/**
	 * 审核失败（审核中 -> 审核失败）
	 * @param musicGroupId
	 */
	void musicGroupAuditFailed(String musicGroupId, String memo) throws Exception;

	/**
	 * 审核通过（审核中 -> 预报名）
	 * @param musicGroupId
	 */
	void musicGroupAuditSuccess(String musicGroupId) throws Exception;

	/**
	 * 乐团筹备结束后，3.0乐团推送小班课缴费信息
	 * @param musicGroupId
	 */
	int pushMessage(String musicGroupId, String classGroupIds) throws IOException;

	/**
	 * @describe 获取分部乐团列表名称
	 * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
	 * @author zouxuan
	 * @date 2020/9/7
	 * @time 14:28
	 * @param :
	 * @return java.util.List<com.ym.mec.biz.dal.dto.MusicCardDto>
	 */
	List<MusicCardDto> queryOrganMusicInfos(Integer organId);

	/**
	 * 补全musicGroupStudentFee表数据
	 * @param musicGroupIds
	 */
//	void musicGroupStudentFeePatch(List<String> musicGroupIds);

	/**
	 * 给乐团添加报名学生
	 * @param musicGroupId 乐团id
	 * @param registerIds 学员注册id
	 * @return 添加学员记录
	 */
	List<StudentRegistration> addMusicGroupRegs(String musicGroupId,List<Long> registerIds);


	/**
	 * 关闭乐团
	 * @param closeMusicGroupDto 乐团关闭信息
	 * @return 关闭结果
	 */
	Boolean closeMusicGroup(CloseMusicGroupDto closeMusicGroupDto);
}
