package com.vctgo.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vctgo.common.core.web.domain.AjaxResult;
import com.vctgo.system.api.domain.SysClassSetting;
import com.vctgo.system.api.domain.dto.ObserveChildhoodDto;
import com.vctgo.system.api.domain.dto.ObserveChildhoodNewDto;
import com.vctgo.system.api.domain.dto.ObserverTreeClassChildDto;
import com.vctgo.system.api.domain.dto.ToySysClassSettingDto;
import com.vctgo.system.domain.dto.SysClassSettingDto;
import com.vctgo.system.domain.dto.SysTreeClassInfo;
import com.vctgo.system.domain.vo.SysDownLocation;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 班级设置Service接口
 *
 * @author caesar
 * @date 2023-05-30
 */
public interface ISysClassSettingService extends IService<SysClassSetting> {
    /**
     * 查询班级设置
     *
     * @param id 班级设置主键
     * @return 班级设置
     */
    SysClassSetting selectSysClassSettingById(Long id);

    /**
     * 查询班级设置列表-分页
     *
     * @param sysClassSetting 班级设置
     * @return 班级设置集合
     */
    IPage<SysClassSetting> selectSysClassSettingPage(SysClassSetting sysClassSetting);

    /**
     * 获取当前老师绑定的班级列表
     *
     * @param sysClassSetting 班级设置
     * @return 班级设置集合
     */
    List<SysClassSetting> selectSysClassSettingBookList(SysClassSetting sysClassSetting);

    List<SysClassSettingDto> selectAreaClassList(SysClassSetting sysClassSetting);

    /**
     * 年份
     *
     * @return
     */
    List<SysClassSetting> getEnrollmentYearList();

    /**
     * 查询班级设置列表
     *
     * @param sysClassSetting 班级设置
     * @return 班级设置集合
     */
    List<SysClassSetting> selectSysClassSettingList(SysClassSetting sysClassSetting);


    /**
     * 查询年级列表
     */
    List<String> gradeInList();


    List<SysClassSetting> selectClassListByGradeIn(String gradeIn);

    /**
     * 获取班级树形结构
     *
     * @return 班级设置
     */
    List<SysTreeClassInfo> selectSysTreeClassList();

    /**
     * 获取班级树形结构
     *
     * @return 班级设置
     */
    SysTreeClassInfo selectSysTreeClassInfo();


    /**
     * 获取班级树形结构
     *
     * @return 班级设置
     */
    List<ObserverTreeClassChildDto> getTreeClassChildList(ObserveChildhoodNewDto observeChildhoodDto);

    /**
     * 新增班级设置
     *
     * @param sysClassSettingList 班级设置
     * @return 结果
     */
    int insertSysClassSetting(List<SysClassSetting> sysClassSettingList);

    /**
     * 修改班级设置
     *
     * @param sysClassSetting 班级设置
     * @return 结果
     */
    int updateSysClassSetting(SysClassSetting sysClassSetting);

    /**
     * 批量删除班级设置
     *
     * @param ids 需要删除的班级设置主键集合
     * @return 结果
     */
    int deleteSysClassSettingByIds(Long[] ids);

    /**
     * 删除班级设置信息
     *
     * @param id 班级设置主键
     * @return 结果
     */
    int deleteSysClassSettingById(Long id);

    /**
     * 批量导入班级数据
     *
     * @param file 文件
     * @return 结果
     */
    void importFile(MultipartFile file) throws Exception;

    /**
     * 通过名称查询班级是否重复
     */
    List<SysClassSetting> repeatCheck(SysClassSetting sysClassSetting);

    /**
     * 通过位置id获取已绑定的班级列表
     *
     * @param locationId 位置id
     * @return
     */
    List<SysClassSetting> bindClassList(String locationId);

    /**
     * 通过位置id获取未绑定的班级列表
     *
     * @param locationId 位置id
     * @return
     */
    List<SysClassSetting> unBindClassList(String locationId);

    /**
     * 逻辑删除幼儿园集团管理
     *
     * @param ids 区域id集合
     * @return 结果
     */
    int logicalDeleteByIds(Long[] ids);

    /**
     * 导出班级批量上传模板
     */
    ResponseEntity<InputStreamResource> exportBatchUploadTemplate(String fileName, HttpServletResponse response, HttpServletRequest request);

    /**
     * 获取所有班级列表
     */
    Long[] getLocationIdList(Long[] ids);

    /**
     * 获取所有班级列表
     */
    List<SysDownLocation> getDownLocationList(SysClassSetting sysClassSetting);

    /**
     * 通过老师信息获取当前老师绑定的班级信息
     *
     * @param userId 教师Id
     * @return
     */
    List<SysClassSetting> selectSysClassUserByUserId(Long userId);


    /**
     * 通过老师信息获取当前老师绑定的班级列表
     *
     * @param userId 教师Id
     * @return
     */
    List<SysClassSetting> selectSysClassListByUserId(Long userId);

    /**
     * 通过班级Id获取位置和区域信息
     *
     * @param classId 班级Id
     * @return
     */
    AjaxResult selectLocationAndAreaByClassId(String classId);

    /**
     * 通过年级或班级Id获取位置和区域信息
     *
     * @param gradeIn  年级
     * @param classIds 班级
     * @param selectType 查询类型  1  查询全部  2  按照条件查询
     * @return
     */
    AjaxResult selectLocationAndAreaByGradeInAndClass(String[] gradeIn, String[] classIds, String selectType);

    /**
     * 通过位置Id获取位置和区域信息
     *
     * @param locationIds 位置Id
     * @return
     */
    AjaxResult selectLocationAndAreaByLocationId(String[] locationIds);

    /**
     * 通过位置Id获取位置和区域信息
     *
     * @return
     */
    AjaxResult selectLocationIdAndClass();

    /**
     * 获取年级列表
     *
     * @return
     */
    AjaxResult selectGradeIn();

    /**
     * 获取班级列表
     *
     * @return
     */
    AjaxResult selectClass(String[] gradeIn);

    /**
     * 获取区域列表
     *
     * @return
     */
    AjaxResult selectArea(String[] classIds, String[] locationIds);

    /**
     * 获取位置列表
     *
     * @return
     */
    AjaxResult selectLocation();

    List<SysClassSetting> getClassListByLocationId(Long locationId);
    List<SysClassSettingDto> getClassListByLocationIdList(List<Long> locationIds);

    List<ToySysClassSettingDto> getLocationByGradeIn(ToySysClassSettingDto sysClassSettingDto);

    /**
     * 查询班级信息
     *
     * @param locationIds
     * @return
     */
    List<SysClassSetting> getClassSetting(String[] locationIds);

    /**
     * 获取班级与位置的关联
     *
     * @return
     */
    List<SysClassSetting> selectClassSettingAndLocation();

    /**
     * 获取班级与位置的关联
     * @param id
     * @return
     */
    SysClassSetting getClassSettingInfo(Long id);
}
