package com.yj.dao;

import com.yj.bean.Book;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author yj
 * @create 2020-08-23 21:08
 *
 * BookDao接口定义了对书籍数据的操作方法，包括增删改查、分页查询、按价格范围查询、按名称或作者查询等功能。
 */
public interface BookDao {

    /**
     * 添加一本书籍到数据库
     * @param book 要添加的书籍对象
     * @return 受影响的行数，成功返回1，失败返回0
     */
    public int addBook(Book book);

    /**
     * 根据书籍ID删除书籍
     * @param id 要删除的书籍ID
     * @return 受影响的行数，成功返回1，失败返回0
     */
    public int deleteBookById(Integer id);

    /**
     * 更新书籍信息
     * @param book 包含更新信息的书籍对象
     * @return 受影响的行数，成功返回1，失败返回0
     */
    public int updateBook(Book book);

    /**
     * 根据书籍ID查询书籍信息
     * @param id 要查询的书籍ID
     * @return 查询到的书籍对象，如果未找到返回null
     */
    public Book queryBookById(Integer id);

    /**
     * 查询所有书籍信息
     * @return 包含所有书籍的列表
     */
    public List<Book> queryBooks();

    /**
     * 查询所有书籍的总记录数
     * @return 所有书籍的总记录数
     */
    Integer queryForPageTotalCount();

    /**
     * 分页查询书籍信息
     * @param begin 分页的起始索引
     * @param pageSize 每页显示的记录数
     * @return 当前页的书籍列表
     */
    List<Book> queryForPageItems(int begin, int pageSize);

    /**
     * 根据价格范围查询书籍的总记录数
     * @param min 价格范围的最小值
     * @param max 价格范围的最大值
     * @return 符合价格范围的书籍总记录数
     */
    Integer queryForPageTotalCountByPrice(int min, int max);

    /**
     * 根据价格范围分页查询书籍信息
     * @param begin 分页的起始索引
     * @param pageSize 每页显示的记录数
     * @param min 价格范围的最小值
     * @param max 价格范围的最大值
     * @return 当前页的书籍列表
     */
    List<Book> queryForPageItemsByPrice(int begin, int pageSize, int min, int max);

    /**
     * 根据书籍名称或作者查询书籍的总记录数
     * @param nameorauthor 书籍名称或作者的关键字
     * @return 符合条件的书籍总记录数
     */
    Integer queryForPageTotalCountByNameOrAuthor(String nameorauthor);

    /**
     * 根据书籍名称或作者分页查询书籍信息
     * @param begin 分页的起始索引
     * @param pageSize 每页显示的记录数
     * @param nameorauthor 书籍名称或作者的关键字
     * @return 当前页的书籍列表
     */
    List<Book> queryForPageItemsByNameOrAuthor(int begin, int pageSize, String nameorauthor);

    /**
     * 查询所有书籍并按某种顺序排序（如销量、价格等）
     * @return 按顺序排序的书籍列表
     */
    List<Book> queryForPageItemsOrder();

    /**
     * 查询所有书籍的总金额（价格总和）
     * @return 所有书籍的总金额
     */
    BigDecimal queryTotalMoney();

    /**
     * 查询书籍的总数量
     * @return 书籍的总数量
     */
    public Integer queryBooknums();
}