package com.qmth.teachcloud.common.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qmth.teachcloud.common.bean.params.BasicCourseParams;
import com.qmth.teachcloud.common.bean.result.BasicCourseResult;
import com.qmth.teachcloud.common.bean.result.TeachCourseSelectResult;
import com.qmth.teachcloud.common.entity.BasicCourse;
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.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 课程表 服务类
 * </p>
 *
 * @author xf
 * @since 2021-03-23
 */
public interface BasicCourseService extends IService<BasicCourse> {

    List<BasicCourse> listCoursesByUserId(Long userId);

    BasicCourse findByCourseCode(String courseCode, Long schoolId);

    /**
     * 创建课程
     *
     * @param schoolId   学校id
     * @param courseCode 课程编号
     * @param courseName 课程名称
     */
    void createCourse(Long schoolId, String courseCode, String courseName);

    // dev_2.2.0

    /**
     * 查询课程信息-分页查询
     *
     * @param belongOrgId     所属机构id
     * @param courseName      课程名称（模糊查询）
     * @param startCreateTime 课程创建时间（起始）
     * @param endCreateTime   课程创建时间（终止）
     * @param pageNumber      分页页码
     * @param pageSize        分页容量
     * @return 查询结果
     */
    IPage<BasicCourseResult> basicCoursePage(Long belongOrgId, String courseName, Long startCreateTime, Long endCreateTime, int pageNumber, int pageSize);

    /**
     * 新增/编辑 课程基础信息
     *
     * @param basicCourseParams 基础课程信息参数
     * @return 新增或编辑的课程id
     */
    Long saveBasicCourse(BasicCourseParams basicCourseParams, SysUser sysUser);

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

    /**
     * 根据查询条件批量删除基础课程
     *
     * @param belongOrgId     所属机构id
     * @param courseName      课程名称（模糊查询）
     * @param startCreateTime 课程创建时间（起始）
     * @param endCreateTime   课程创建时间（终止）
     */
    Boolean removeBasicCourseBatchByQuery(Long belongOrgId, String courseName, Long startCreateTime, Long endCreateTime);

    /**
     * 处理导入课程数据
     *
     * @param file 文件
     */
    List<BasicCourseParams> executeImportBasicCourseLogic(MultipartFile file) throws IOException, NoSuchFieldException;

    /**
     * 执行批量导入课程逻辑
     *
     * @param finalList 基础课程数据集合
     */
    List<BasicCourseParams> executeBasicCourseImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList,
            Map<Integer, List<String>> errorMap);

    /**
     * @param schoolId
     * @param courseCode
     * @return
     */
    Long getOrgIdBySchoolIdAndCourseCode(Long schoolId, String courseCode);

    void exportData(HttpServletResponse response, Long belongOrgId, String courseName, Long startCreateTime, Long endCreateTime) throws Exception;

    /**
     * 根据机构id选择老师
     *
     * @param orgId       机构id
     * @param examId      考试id
     * @param courseName
     * @param requestUser 请求用户
     * @return 可选基础课程结果
     */
    List<TeachCourseSelectResult> listByOrgId(Long orgId, Long examId, String courseName, SysUser requestUser);

    BasicCourse getByCode(String courseCode);
}
