package com.lesingle.edu.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lesingle.edu.dto.request.ClassCreateRequest;
import com.lesingle.edu.dto.request.ClassUpdateRequest;
import com.lesingle.edu.dto.response.StudentTransferHistoryItemResponse;
import com.lesingle.edu.entity.Clazz;

import java.util.List;

/**
 * 班级服务接口
 */
public interface ClassService extends com.baomidou.mybatisplus.extension.service.IService<Clazz> {

    /**
     * 创建班级
     */
    Clazz createClass(Long tenantId, ClassCreateRequest request);

    /**
     * 更新班级
     */
    Clazz updateClass(Long id, ClassUpdateRequest request);

    /**
     * 更新班级（带租户验证）
     */
    Clazz updateClassWithTenantCheck(Long id, Long tenantId, ClassUpdateRequest request);

    /**
     * 根据 ID 查询班级
     */
    Clazz getClassById(Long id);

    /**
     * 根据 ID 查询班级（带租户验证）
     */
    Clazz getClassByIdWithTenantCheck(Long id, Long tenantId);

    /**
     * 分页查询班级
     */
    Page<Clazz> getClassPage(Long tenantId, Integer pageNum, Integer pageSize, String keyword, String grade, String status);

    /**
     * 删除班级
     */
    void deleteClass(Long id);

    /**
     * 删除班级（带租户验证）
     */
    void deleteClassWithTenantCheck(Long id, Long tenantId);

    /**
     * 分配教师
     */
    void assignTeachers(Long classId, List<Long> teacherIds);

    /**
     * 分配教师（带租户验证）
     */
    void assignTeachersWithTenantCheck(Long classId, Long tenantId, List<Long> teacherIds);

    /**
     * 分配学生
     */
    void assignStudents(Long classId, List<Long> studentIds);

    /**
     * 分配学生（带租户验证）
     */
    void assignStudentsWithTenantCheck(Long classId, Long tenantId, List<Long> studentIds);

    /**
     * 将学生调至指定班级（结束当前班级关联，建立新关联）
     */
    void assignStudentToClass(Long studentId, Long classId, Long tenantId);

    /**
     * 获取班级教师 ID 列表
     */
    List<Long> getTeacherIdsByClassId(Long classId);

    /**
     * 获取学生在班级中的角色信息（role 字段）
     */
    String getTeacherRoleInClass(Long classId, Long teacherId);

    /**
     * 更新班级教师角色
     */
    void updateClassTeacherRole(Long classId, Long teacherId, String role, Boolean isPrimary);

    /**
     * 获取租户下活跃班级列表
     */
    List<Clazz> getActiveClassesByTenantId(Long tenantId);

    /**
     * 获取教师教授的班级列表（租户下、且教师已分配）
     */
    List<Clazz> getClassesByTeacherId(Long teacherId, Long tenantId);

    /**
     * 获取学生当前所在班级
     */
    Clazz getPrimaryClassByStudentId(Long studentId);

    /**
     * 获取学生调班历史（带租户验证）
     */
    List<StudentTransferHistoryItemResponse> getStudentClassHistory(Long studentId, Long tenantId);

}
