package cn.ppdxzz.service.impl;

import cn.ppdxzz.dao.StudentDao;
import cn.ppdxzz.domain.Student;
import cn.ppdxzz.poi.WriteExcel;
import cn.ppdxzz.service.StudentService;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * StudentServiceImpl类实现了StudentService接口，提供学生信息的管理功能。
 */
@Service("studentService")
public class StudentServiceImpl implements StudentService {

    private StudentDao studentDao;

    @Autowired
    public void setStudentDao(StudentDao studentDao) {
        this.studentDao = studentDao;
    }

    /**
     * 查询所有学生信息，支持分页。
     * @param page 当前页码
     * @param size 每页显示的记录数
     * @return 学生列表
     * @throws Exception 异常处理
     */
    @Override
    public List<Student> findAll(int page, int size) throws Exception {
        PageHelper.startPage(page, size);
        return studentDao.findAll();
    }

    /**
     * 根据学号查询学生信息。
     * @param sno 学号
     * @return 学生对象
     * @throws Exception 异常处理
     */
    @Override
    public Student findBySno(String sno) throws Exception {
        return studentDao.findBySno(sno);
    }

    /**
     * 模糊查询学生信息，支持分页。
     * @param page 当前页码
     * @param size 每页显示的记录数
     * @param keyword 查询关键字
     * @return 学生列表
     * @throws Exception 异常处理
     */
    @Override
    public List<Student> search(int page, int size, String keyword) throws Exception {
        PageHelper.startPage(page, size);
        return studentDao.search(keyword);
    }

    /**
     * 添加学生信息。
     * @param student 学生对象
     * @return 是否添加成功
     * @throws Exception 异常处理
     */
    @Override
    public boolean add(Student student) throws Exception {
        if (student == null || student.getName() == null || student.getSex() == null || student.getSno() == null
                || student.getPhone() == null || student.getPlace() == null || student.getDorm_id() == null
                || student.getTeacher() == null || student.getStu_class() == null || student.getStatus() == null) {
            return false;
        }
        studentDao.add(student);
        return true;
    }

    /**
     * 根据学号删除学生信息。
     * @param sno 学号
     * @throws Exception 异常处理
     */
    @Override
    public void delete(String sno) throws Exception {
        studentDao.delete(sno);
    }

    /**
     * 修改学生信息。
     * @param student 学生对象
     * @throws Exception 异常处理
     */
    @Override
    public void update(Student student) throws Exception {
        studentDao.update(student);
    }

    /**
     * 导出学生信息到Excel文件。
     * @return 输入流，用于读取生成的Excel文件
     * @throws Exception 异常处理
     */
    @Override
    public InputStream getInputStream() throws Exception {
        // Excel中的每列列名，依次对应数据库的字段
        String[] title = new String[]{"姓名", "性别", "学号", "班级", "联系方式", "家庭住址", "宿舍号", "育人导师", "状态"};
        List<Student> students = studentDao.findAll();
        List<Object[]> datalist = new ArrayList<>();
        for (int i = 0; i < students.size(); i++) {
            Object[] obj = new Object[9];
            obj[0] = students.get(i).getName();
            obj[1] = students.get(i).getSex();
            obj[2] = students.get(i).getSno();
            obj[3] = students.get(i).getStu_class();
            obj[4] = students.get(i).getPhone();
            obj[5] = students.get(i).getPlace();
            obj[6] = students.get(i).getDorm_id();
            obj[7] = students.get(i).getTeacher();
            obj[8] = students.get(i).getStatus();
            datalist.add(obj);
        }
        WriteExcel excel = new WriteExcel(title, datalist);
        return excel.export();
    }

    /**
     * 根据宿舍号查询状态为status的学生。
     * @param dorm_id 宿舍号
     * @param status 状态值
     * @return 学生列表
     * @throws Exception 异常处理
     */
    @Override
    public List<Student> findByDormId(String dorm_id, Integer status) throws Exception {
        return studentDao.findByDormId(dorm_id, status);
    }

    /**
     * 查询育人导师为teacher的学生集合，支持分页。
     * @param page 当前页码
     * @param size 每页显示的记录数
     * @param teacher 育人导师名称
     * @return 学生列表
     * @throws Exception 异常处理
     */
    @Override
    public List<Student> findByTeacher(int page, int size, String teacher) throws Exception {
        PageHelper.startPage(page, size);
        return studentDao.findByTeacher(teacher);
    }

    /**
     * 根据育人导师和关键字模糊查询学生信息，支持分页。
     * @param page 当前页码
     * @param size 每页显示的记录数
     * @param teacher 育人导师名称
     * @param keyword 查询关键字
     * @return 学生列表
     * @throws Exception 异常处理
     */
    @Override
    public List<Student> searchStudent(int page, int size, String teacher, String keyword) throws Exception {
        PageHelper.startPage(page, size);
        return studentDao.searchStudent(teacher, keyword);
    }
}
