package com.yj.service.impl;

import com.yj.bean.Book;
import com.yj.bean.Page;
import com.yj.bean.User;
import com.yj.dao.UserDao;
import com.yj.dao.impl.UserDaoImpl;
import com.yj.service.UserService;

import java.util.List;

/**
 * @author yj
 * @create 2020-08-21 15:34
 */
public class UserServiceImpl implements UserService {

    // 用户数据访问对象，使用UserDaoImpl实现
    private UserDao userDao = new UserDaoImpl();

    /**
     * 注册用户
     * @param user 要注册的用户对象
     */
    @Override
    public void registUser(User user) {
        userDao.saveUser(user); // 保存用户信息
    }

    /**
     * 用户登录
     * @param user 包含用户名和密码的用户对象
     * @return 如果登录成功返回用户对象，否则返回null
     */
    @Override
    public User login(User user) {
        return userDao.querybyUsernameAndPassword(user.getUsername(), user.getPassword()); // 验证用户名和密码
    }

    /**
     * 检查用户名是否存在
     * @param username 要检查的用户名
     * @return 如果不存在则返回false，反之则返回true
     */
    @Override
    public boolean existsUsername(String username) {
        if (userDao.querybyUsername(username) == null) {
            return false; // 用户名不存在
        } else {
            return true; // 用户名存在
        }
    }

    /**
     * 添加新用户
     * @param user 要添加的用户对象
     */
    @Override
    public void addUser(User user) {
        userDao.addUser(user); // 调用数据访问层添加用户
    }

    /**
     * 根据用户ID删除用户
     * @param i 用户ID
     */
    @Override
    public void deleteUserById(int i) {
        userDao.deleteUserById(i); // 调用数据访问层删除用户
    }

    /**
     * 更新用户信息
     * @param user 要更新的用户对象
     */
    @Override
    public void updateUser(User user) {
        userDao.updateUser(user); // 调用数据访问层更新用户
    }

    /**
     * 根据用户ID查询用户信息
     * @param id 用户ID
     * @return 返回对应的用户对象，如果用户不存在则返回null
     */
    @Override
    public User queryUserById(Integer id) {
        return userDao.queryUserById(id); // 调用数据访问层查询用户
    }

    /**
     * 查询所有用户的信息
     * @return 返回用户列表
     */
    @Override
    public List<User> queryUsers() {
        return userDao.queryUsers(); // 调用数据访问层获取所有用户
    }

    @Override
    public Page<User> page(int pageNo, int pageSize) {
        Page<User> page = new Page<User>(); // 创建一个新的分页对象

        // 设置每页记录数
        page.setPageSize(pageSize); // 将每页的记录数设置为方法传入的pageSize

        // 设置总记录数
        Integer pageTotalCount = userDao.queryForPageTotalCount(); // 从数据库中获取总记录数
        page.setPageTotalCount(pageTotalCount); // 将总记录数设置到分页对象中

        // 计算总页码
        Integer pageTotal = pageTotalCount / pageSize; // 根据总记录数和每页大小计算总页数
        if (pageTotalCount % pageSize > 0) { // 如果有剩余记录，则总页数加一
            pageTotal += 1;
        }

        // 设置当前页
        if (pageNo > pageTotal) { // 如果请求的当前页码大于总页码，则设置为最后一页
            pageNo = pageTotal;
        }
        if (pageNo < 1) { // 如果请求的当前页码小于1，则设置为第一页
            pageNo = 1;
        }
        page.setPageNo(pageNo); // 将最终确定的当前页码设置到分页对象中

        // 设置总页码
        page.setPageTotal(pageTotal); // 将计算出来的总页码设置到分页对象中

        // 计算当前页的起始记录索引
        int begin = (page.getPageNo() - 1) * pageSize; // 计算当前页的开始位置
        // 查询当前页的数据项
        List<User> items = userDao.queryForPageItems(begin, pageSize); // 从数据库中查询当前页的数据
        page.setItems(items); // 将查询到的数据设置到分页对象中

        return page; // 返回包含分页信息的分页对象
    }

}
