package com.itheima.service.impl;

import com.itheima.dao.DormitoryDao;
import com.itheima.po.Dormitory;
import com.itheima.po.PageInfo;
import com.itheima.service.DormitoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 宿舍管理 Service 接口实现类
 */
@Service("dormitoryService") // 将该类标识为 Spring 服务类，能够被 Spring 容器自动管理
@Transactional // 开启事务管理，确保在操作宿舍数据时进行事务控制
public class DormitoryServiceImpl implements DormitoryService {
    
    // 自动注入 DormitoryDao，DAO层处理宿舍数据的操作
    @Autowired
    private DormitoryDao dormitoryDao;

    /**
     * 分页查询宿舍信息
     * @param a_name 宿舍名称
     * @param s_dormitoryid 宿舍ID
     * @param d_dormbuilding 宿舍楼
     * @param pageIndex 当前页码
     * @param pageSize 每页显示的条数
     * @return 返回分页信息
     */
    @Override
    public PageInfo<Dormitory> findPageInfo(String a_name, Integer s_dormitoryid, String d_dormbuilding, Integer pageIndex, Integer pageSize) {
        PageInfo<Dormitory> pi = new PageInfo<Dormitory>(); // 创建分页信息对象
        pi.setPageIndex(pageIndex); // 设置当前页码
        pi.setPageSize(pageSize); // 设置每页显示的条数
        
        // 获取总条数，分页需要使用总记录数来计算总页数
        Integer totalCount = dormitoryDao.totalCount(a_name, s_dormitoryid, d_dormbuilding);
        
        // 如果总条数大于0，则进行分页查询
        if (totalCount > 0) {
            pi.setTotalCount(totalCount); // 设置总记录数
            // 计算分页查询时的开始行数
            List<Dormitory> dormitoryList = dormitoryDao.getDormitoryList(
                a_name, s_dormitoryid, d_dormbuilding, 
                (pi.getPageIndex() - 1) * pi.getPageSize(), pi.getPageSize()
            );
            pi.setList(dormitoryList); // 设置当前页的数据列表
        }
        return pi; // 返回分页信息
    }

    /**
     * 获取所有宿舍信息
     * @return 返回所有宿舍信息的列表
     */
    @Override
    public List<Dormitory> getAll() {
        List<Dormitory> dormitoryList = dormitoryDao.getAll(); // 调用 DAO 层获取所有宿舍信息
        return dormitoryList; // 返回宿舍信息列表
    }

    /**
     * 添加宿舍信息
     * @param dormitory 要添加的宿舍对象
     * @return 返回添加操作的结果
     */
    @Override
    public int addDormitory(Dormitory dormitory) {
        return dormitoryDao.addDormitory(dormitory); // 调用 DAO 层的添加宿舍方法
    }

    /**
     * 根据宿舍ID删除宿舍信息
     * @param d_id 宿舍ID
     * @return 返回删除操作的结果
     */
    @Override
    public int deleteDormitory(Integer d_id) {
        return dormitoryDao.deleteDormitory(d_id); // 调用 DAO 层删除宿舍信息的方法
    }

    /**
     * 修改宿舍信息
     * @param dormitory 要修改的宿舍对象
     * @return 返回修改操作的结果
     */
    @Override
    public int updateDormitory(Dormitory dormitory) {
        return dormitoryDao.updateDormitory(dormitory); // 调用 DAO 层修改宿舍信息的方法
    }

    /**
     * 根据宿舍ID查询单个宿舍的信息
     * @param d_id 宿舍ID
     * @return 返回对应宿舍的详细信息
     */
    @Override
    public Dormitory findDormitoryById(Integer d_id) {
        Dormitory d = dormitoryDao.findDormitoryById(d_id); // 调用 DAO 层根据宿舍ID查询宿舍信息
        return d; // 返回宿舍对象
    }

    /**
     * 查询宿舍中的学生信息
     * @param dormitory 宿舍对象，包含查询条件
     * @return 返回宿舍中的学生信息列表
     */
    @Override
    public List<Dormitory> findDormitoryStudent(Dormitory dormitory) {
        List<Dormitory> d = dormitoryDao.findDormitoryStudent(dormitory); // 调用 DAO 层查询宿舍人员信息的方法
        return d; // 返回宿舍学生信息列表
    }
}
