package com.yj.service;

import com.yj.bean.Book;
import com.yj.bean.Page;

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

/**
 * @author yj
 * @create 2020-08-24 14:40
 *
 * BookService接口定义了与书籍相关的业务逻辑操作，包括书籍的增删改查、分页查询、按价格范围查询、按名称或作者查询等功能。
 */
public interface BookService {

    /**
     * 添加一本书籍
     * @param book 要添加的书籍对象
     */
    public void addBook(Book book);

    /**
     * 更新书籍信息
     * @param book 包含更新信息的书籍对象
     */
    public void updateBook(Book book);

    /**
     * 根据书籍ID删除书籍
     * @param id 要删除的书籍ID
     */
    public void deleteBookById(Integer id);

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

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

    /**
     * 分页查询书籍信息
     * @param pageNo 当前页码
     * @param pageSize 每页显示的记录数
     * @return 分页对象，包含当前页的书籍列表和分页信息
     */
    Page<Book> page(int pageNo, int pageSize);

    /**
     * 根据价格范围分页查询书籍信息
     * @param pageNo 当前页码
     * @param pageSize 每页显示的记录数
     * @param min 价格范围的最小值
     * @param max 价格范围的最大值
     * @return 分页对象，包含当前页的书籍列表和分页信息
     */
    Page<Book> pageByPrice(int pageNo, int pageSize, int min, int max);

    /**
     * 根据书籍名称或作者分页查询书籍信息
     * @param pageNo 当前页码
     * @param pageSize 每页显示的记录数
     * @param nameOrAuthor 书籍名称或作者的关键字
     * @return 分页对象，包含当前页的书籍列表和分页信息
     */
    Page<Book> pageByNameOrAuthor(int pageNo, int pageSize, String nameOrAuthor);

    /**
     * 查询所有书籍并按某种顺序排序（如销量、价格等）
     * @return 分页对象，包含按顺序排序的书籍列表和分页信息
     */
    Page<Book> pageOrder();

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

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