package com.pangu.school.service;

import com.pangu.school.domain.dto.SchoolCreateDTO;
import com.pangu.school.domain.dto.SchoolQueryDTO;
import com.pangu.school.domain.entity.School;
import com.pangu.school.domain.vo.SchoolTreeVO;
import com.pangu.school.domain.vo.SchoolVO;

import java.util.List;

/**
 * 学校服务接口
 * @author pangu
 */
public interface ISchoolService {

    /**
     * 查询学校树形结构
     * @param regionId 区域ID（可选）
     * @return 学校树
     */
    List<SchoolTreeVO> selectSchoolTree(Long regionId);

    /**
     * 查询学校列表
     * @param query 查询条件
     * @return 学校列表
     */
    List<SchoolVO> selectSchoolList(SchoolQueryDTO query);

    /**
     * 根据ID查询学校
     * @param schoolId 学校ID
     * @return 学校信息
     */
    SchoolVO selectSchoolById(Long schoolId);

    /**
     * 新增学校
     * @param dto 学校信息
     * @return 影响行数
     */
    int insertSchool(SchoolCreateDTO dto);

    /**
     * 修改学校
     * @param school 学校信息
     * @return 影响行数
     */
    int updateSchool(School school);

    /**
     * 删除学校（软删除）
     * @param schoolId 学校ID
     * @return 影响行数
     */
    int deleteSchool(Long schoolId);

    /**
     * 为学校挂载年级
     * @param schoolId 学校ID
     * @param gradeIds 年级ID列表
     * @return 影响行数
     */
    int bindGrades(Long schoolId, List<Long> gradeIds);

    /**
     * 为年级挂载班级
     * @param schoolGradeId 学校年级关联ID
     * @param classIds 班级ID列表
     * @return 影响行数
     */
    int bindClasses(Long schoolGradeId, List<Long> classIds);

    /**
     * 删除学校年级
     * @param schoolGradeId 学校年级关联ID
     * @return 影响行数
     */
    int deleteSchoolGrade(Long schoolGradeId);

    /**
     * 删除学校班级
     * @param schoolClassId 学校班级关联ID
     * @return 影响行数
     */
    int deleteSchoolClass(Long schoolClassId);

    /**
     * 根据学校名称和区域ID查询学校ID
     * @param schoolName 学校名称
     * @param regionId 区域ID
     * @return 学校ID
     */
    Long getSchoolIdByName(String schoolName, Long regionId);

    /**
     * 根据学校ID和年级名称查询学校年级ID
     * @param schoolId 学校ID
     * @param gradeName 年级名称
     * @return 学校年级关联ID
     */
    Long getSchoolGradeId(Long schoolId, String gradeName);

    /**
     * 根据学校年级ID和班级名称查询学校班级ID
     * @param schoolGradeId 学校年级ID
     * @param className 班级名称
     * @return 学校班级关联ID
     */
    Long getSchoolClassId(Long schoolGradeId, String className);
}
