package com.qmth.teachcloud.common.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qmth.teachcloud.common.bean.dto.TaskPrintClassDto;
import com.qmth.teachcloud.common.bean.params.BasicStudentExtrasParam;
import com.qmth.teachcloud.common.bean.params.BasicStudentParams;
import com.qmth.teachcloud.common.bean.result.BasicExamStudentResult;
import com.qmth.teachcloud.common.entity.BasicStudent;
import com.qmth.teachcloud.common.entity.SysUser;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 学校id 服务类
 * </p>
 *
 * @author wangliang
 * @since 2021-08-02
 */
public interface BasicStudentService extends IService<BasicStudent> {

    IPage<BasicStudent> listPage(Page<BasicStudent> page, String classId);

    List<TaskPrintClassDto> listByClass(Long schoolId, Set<String> stringList);

    /**
     * 学生基础信息分页查询
     *
     * @param queryParams 查询参数（学生学号或姓名）
     * @param collegeId   校区主键
     * @param majorId     专业主键
     * @param clazzId     班级ID
     * @param pageNumber  分页页码
     * @param pageSize    分页容量
     * @return 分页结果
     */
    IPage<BasicExamStudentResult> basicStudentPage(String queryParams, Long collegeId, Long majorId, Long clazzId, int pageNumber, int pageSize);

    /**
     * 根据id查询基础学生数据
     *
     * @param id 学生id
     * @return 学生信息
     */
    BasicExamStudentResult findById(Long id);

    /**
     * 学生基础信息查询
     *
     * @param schoolId        学校id
     * @param examId
     * @param teacher
     * @param className
     * @param studentCodeList 学号集合
     * @return 学生查询结果
     */
    List<BasicExamStudentResult> basicStudentList(Long schoolId, Long examId, String courseCode, String teacher, String className, List<String> studentCodeList);

    /**
     * 新增/编辑 学生基础信息
     *
     * @param basicStudentParams 基础学生信息参数
     * @return id
     */
    Long saveBasicStudent(BasicStudentParams basicStudentParams);

    /**
     * 保存 - 基础学生信息和学生附加信息（院、专、班）
     *
     * @param basicStudentExtrasParamList 参数集合
     * @param requestUser                 请求人
     * @param saveBasicStudent            是否保存基础学生数据
     */
    void saveBasicStudentWithExtrasList(List<BasicStudentExtrasParam> basicStudentExtrasParamList, SysUser requestUser, boolean saveBasicStudent, Map<String, Object> map) throws IllegalAccessException;

    /**
     * 批量删除学生基本信息（逻辑）
     *
     * @param idList 要删除的学生主键集合
     * @return 是否删除成功
     */
    Boolean removeBasicStudentBatch(List<Long> idList);

    /**
     * 根据条件删除基础学生信息
     *
     * @param queryParams 学生参数（学号或姓名）
     * @param collegeId   学院主键
     * @param majorId     专业主键
     * @param clazzIdList 班级主键集合
     * @return 是否删除成功
     */
    Boolean removeBasicStudentByCondition(String queryParams, Long collegeId, Long majorId, Set<Long> clazzIdList);

    /**
     * 执行批量导入学生逻辑
     *
     * @param finalList 基础学生数据集合
     * @param map       参数
     * @return 结果
     */
    Map<String, Object> executeBasicStudentImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map) throws IllegalAccessException;

    void exportData(HttpServletResponse response, String queryParams, Long collegeId, Long majorId, Set<Long> clazzIdList) throws Exception;

    boolean importBasicStudent(Map<String, Object> map, MultipartFile file);
}