package cn.ppdxzz.dao;

import cn.ppdxzz.domain.Student;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * Description:学生类的持久层接口，用于定义对学生信息进行数据库操作的方法
 */
@Repository
public interface StudentDao {

    /**
     * 查询所有学生信息
     * @return 返回包含所有学生信息的列表
     * @throws Exception 如果查询过程中发生错误则抛出异常
     */
    @Select("select * from students")
    List<Student> findAll() throws Exception;

    /**
     * 通过学号sno查询学生信息
     * @param sno 学生的学号
     * @return 返回对应学号的学生信息
     * @throws Exception 如果查询过程中发生错误则抛出异常
     */
    @Select("select * from students where sno = #{sno}")
    Student findBySno(String sno) throws Exception;

    /**
     * 模糊查询学生信息
     * @param keyword 搜索关键字
     * @return 返回匹配关键字的学生信息列表
     * @throws Exception 如果查询过程中发生错误则抛出异常
     */
    @Select("select * from students where name like '%${keyword}%' or sex like '%${keyword}%' or sno like '%${keyword}%' or  stu_class like '%${keyword}%' or phone like '%${keyword}%' or place like '%${keyword}%' or dorm_id like '%${keyword}%' or teacher like '%${keyword}%' ")
    List<Student> search(@Param(value = "keyword") String keyword) throws Exception;

    /**
     * 添加学生信息
     * @param student 要添加的学生对象
     * @throws Exception 如果添加过程中发生错误则抛出异常
     */
    @Insert("insert into students(name, sex, sno, stu_class, phone, place, dorm_id, teacher, status) values(#{name},#{sex},#{sno},#{stu_class},#{phone},#{place},#{dorm_id},#{teacher},#{status})")
    void add(Student student) throws Exception;

    /**
     * 根据学号删除学生信息
     * @param sno 学生的学号
     * @throws Exception 如果删除过程中发生错误则抛出异常
     */
    @Delete("delete from students where sno = #{sno}")
    void delete(String sno) throws Exception;

    /**
     * 根据学号修改学生信息
     * @param student 更新后的学生对象
     * @throws Exception 如果更新过程中发生错误则抛出异常
     */
    @Update("update students set name = #{name},sex = #{sex},sno = #{sno},stu_class = #{stu_class},phone = #{phone},place = #{place},dorm_id = #{dorm_id},teacher = #{teacher},status = #{status} where id = #{id}")
    void update(Student student) throws Exception;

    /**
     * 根据宿舍号和状态查询学生信息
     * @param dorm_id 宿舍号
     * @param status 学生状态
     * @return 返回符合条件的学生信息列表
     * @throws Exception 如果查询过程中发生错误则抛出异常
     */
    @Select("select * from students where dorm_id = #{dorm_id} and status = #{status}")
    List<Student> findByDormId(@Param(value = "dorm_id") String dorm_id,@Param(value = "status") Integer status) throws Exception;

    /**
     * 查询指定育人导师所带的所有学生信息
     * @param teacher 育人导师的名字
     * @return 返回该育人导师所带的学生信息列表
     * @throws Exception 如果查询过程中发生错误则抛出异常
     */
    @Select("select * from students where teacher = #{teacher}")
    List<Student> findByTeacher(String teacher) throws Exception;

    /**
     * 模糊查询固定育人导师所带的学生信息
     * @param teacher 育人导师的名字
     * @param keyword 搜索关键字
     * @return 返回匹配关键字的该育人导师所带的学生信息列表
     * @throws Exception 如果查询过程中发生错误则抛出异常
     */
    @Select("select * from students where teacher = #{teacher} and sno = #{keyword} ")
    List<Student> searchStudent(@Param(value = "teacher") String teacher,@Param(value = "keyword") String keyword) throws Exception;
}
