package com.ym.mec.biz.dal.dao;

import com.ym.mec.biz.dal.dto.ConditionDto;
import com.ym.mec.biz.dal.dto.StudentAttendanceViewDto;
import com.ym.mec.biz.dal.dto.SubjectApplyDetailDto;
import com.ym.mec.biz.dal.entity.StudentRegistration;
import com.ym.mec.biz.dal.entity.Subject;
import com.ym.mec.biz.dal.enums.YesOrNoEnum;
import com.ym.mec.common.dal.BaseDAO;
import org.apache.ibatis.annotations.Param;

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

public interface SubjectDao extends BaseDAO<Integer, Subject> {

    /**
     * 通过乐团编号查询科目列表
     *
     * @param musicGroupId
     * @return
     */
    List<Subject> findSubByMusicGroupId(String musicGroupId);

    /**
     * 通过乐团收费方式，获取默认的声部列表
     *
     * @param chargeTypeId
     * @return
     */
    List<Subject> findSubByChargeType(Integer chargeTypeId);

    /**
     * 根据父级id查询子级列表
     *
     * @param parentId
     * @return
     */
    List<Subject> findByParentId(@Param("parentId") Integer parentId, @Param("delFlag") YesOrNoEnum delFlag,@Param("tenantId")Integer tenantId);

    /**
     * 通过乐团收费类型，获取默认的声部列表
     *
     * @param chargeTypeId
     * @return
     */
    List<Subject> findDefaultSubByChargeTypeId(Integer chargeTypeId);

    /**
     * 通过乐团编号获取声部列表以及声部报名、缴费、计划人数
     *
     * @param musicGroupId
     * @return
     */
    List<SubjectApplyDetailDto> findSubApplyDetail(String musicGroupId);

    /**
     * 根据声部id字符串查询
     *
     * @param subIds
     * @return
     */
    List<String> findBySubIds(String subIds);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/26
     * 获取教师所属科目列表
     */
    List<Subject> findTeacherSubjects(Integer teacherId);

    List<ConditionDto> findSubjectConditions();

    /**
     * 根据声部编号列表获取声部名称map
     *
     * @param subjectIds
     * @return
     */
    List<Map<Integer, String>> queryNameByIds(@Param("subjectIds") String subjectIds);

    /**
     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.String>>
     * @Author: Joburgess
     * @Date: 2019/10/17
     * @params [subjectIds]
     * @describe 根据科目编号获取部门编号, 部门名称
     */
    List<Map<Long, String>> findBySubjecIds(@Param("subjectIds") String subjectIds);

    /**
     * 获取子级列表
     *
     * @return
     */
    List<Subject> findSubSubjects(@Param("tenantId") Integer tenantId);

    List<Subject> findBySubjectByIdList(@Param("subjectIdList") String subjectIdList);

    List<Subject> findBySubjectIds(@Param("subjectIds") List<Integer> subjectIds);

    /**
     * @describe 获取乐团下对应用户的科目名称
     * @author Joburgess
     * @date 2019/10/28
     * @param musicGroupId: 乐团编号
     * @param userIds: 用户编号列表
     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
     */
    List<Map<Integer,String>> findByMusicGroupUserSubject(@Param("musicGroupId") String musicGroupId,
                                                          @Param("userIds") List<Integer> userIds);

    /**
     * @describe
     * @author Joburgess
     * @date 2019/11/13
     * @param courseScheuleIds:
     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
     */
    List<Map<Integer,String>> findSubjectNameCourseMaps(@Param("courseScheduleIds") List<Long> courseScheuleIds);

    /**
     * @describe
     * @author Joburgess
     * @date 2019/11/13
     * @param courseScheuleIds:
     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
     */
    List<Map<Integer,String>> findClassGroupSubjectId(@Param("courseScheduleIds") List<Long> courseScheuleIds);

    /**
     * @describe
     * @author Joburgess
     * @date 2019/12/19
     * @param studentInfos:
     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
     */
    List<Map<Integer, String>> findStudentSubjectNameMaps(@Param("studentInfos") List<StudentAttendanceViewDto> studentInfos);

    /**
     * @describe
     * @author Joburgess
     * @date 2019/12/19
     * @param studentInfos:
     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
     */
    List<Map<Integer, Long>> findStudentSubjectIdMaps(@Param("studentInfos") List<StudentAttendanceViewDto> studentInfos);

    /**
     * 获取声部名称
     * @param subjectIdList
     * @return
     */
    String findNames(String subjectIdList);


    /**
     * 获取学生报名的声部
     * @param musicGroupId
     * @param userIds
     * @return
     */
    List<StudentRegistration> getRegisterSubject(@Param("musicGroupId") String musicGroupId,
                                                 @Param("userIds") List<Integer> userIds);
}
