package com.itheima.service.impl;

import com.itheima.dao.VisitorDao;  // 导入VisitorDao接口，用于数据访问操作
import com.itheima.po.PageInfo;    // 导入PageInfo类，用于封装分页信息
import com.itheima.po.Visitor;     // 导入Visitor类，用于表示访客对象
import com.itheima.service.VisitorService;  // 导入VisitorService接口，该类实现该接口
import org.springframework.beans.factory.annotation.Autowired;  // 导入自动注入的注解
import org.springframework.stereotype.Service;  // 导入Service注解，标识这是一个Service类
import org.springframework.transaction.annotation.Transactional;  // 导入事务管理注解

import java.util.List;  // 导入List类，用于存储多个访客对象

/**
 * 访客Service接口实现类
 */
@Service("visitorService")  // 标注该类为一个Spring管理的服务组件，名称为visitorService
@Transactional  // 启用事务管理，确保该类中的数据库操作要么全部成功，要么全部回滚，保证数据一致性和完整性
public class VisitorServiceImpl implements VisitorService {
    // 自动注入VisitorDao，DAO层用于与数据库交互
    @Autowired
    private VisitorDao visitorDao;

    /**
     * 分页查询访客信息
     * @param v_name 访客姓名
     * @param v_phone 访客电话
     * @param pageIndex 当前页码
     * @param pageSize 每页显示的记录数
     * @return 返回分页信息（PageInfo）
     */
    @Override
    public PageInfo<Visitor> findPageInfo(String v_name, Integer v_phone, Integer pageIndex, Integer pageSize) {
        // 创建PageInfo对象，用于封装分页信息
        PageInfo<Visitor> pi = new PageInfo<Visitor>();
        pi.setPageIndex(pageIndex);  // 设置当前页码
        pi.setPageSize(pageSize);    // 设置每页显示的记录数

        // 获取符合条件的总记录数
        Integer totalCount = visitorDao.totalCount(v_name, v_phone);

        // 如果总记录数大于0，进行分页查询
        if (totalCount > 0) {
            pi.setTotalCount(totalCount);  // 设置总记录数

            // 根据页码和每页大小计算出查询的起始位置，并获取当前页的访客列表
            // currentPage = (pageIndex - 1) * pageSize，当前页码减去1，乘以每页记录数，得到查询的起始位置
            List<Visitor> visitorList = visitorDao.getVisitorList(
                    v_name, v_phone, 
                    (pi.getPageIndex() - 1) * pi.getPageSize(), pi.getPageSize()
            );

            pi.setList(visitorList);  // 设置当前页的访客列表
        }

        return pi;  // 返回封装了分页信息的PageInfo对象
    }

    /**
     * 获取所有访客信息
     * @return 返回所有访客的列表
     */
    @Override
    public List<Visitor> getAll() {
        // 调用DAO层的getAll方法获取所有访客信息
        List<Visitor> visitorList = visitorDao.getAll();
        return visitorList;  // 返回所有访客的列表
    }

    /**
     * 添加访客信息
     * @param visitor 访客对象，包含要添加的访客信息
     * @return 返回受影响的行数，通常为1表示插入成功
     */
    @Override
    public int addVisitor(Visitor visitor) {
        // 调用DAO层的addVisitor方法添加新的访客记录
        return visitorDao.addVisitor(visitor);
    }
}
