#定义一个图书类
class Book:
    # 使用构造函数，接收实例化类时需要传入的参数
    def __init__(self , bid , name , price , summary):
        # 使用实例属性接收传入的值
        self.bid = bid
        self.name = name
        self.price = price
        self.summary = summary
    # 重写对象的显示格式方法
    def __str__(self):
        return f"Bid: {self.bid} --- Name: {self.name} --- Price: {self.price} --- Summary: {self.summary}"

# 封装管理类


class BookManagement:
    def __init__(self):
        self.books = []
    def __menu(self):
        '''
         菜单函数：展示图书生管理系统菜单信息，并获取用户输入
         :return:  用户输入的编号字符串
         '''
        print("*****************************")
        print("*      图书管理系统           *")
        print("* 1. 添加新图书信息           *")
        print("* 2. 通过编号修改图书信息      *")
        print("* 3. 通过编号删除图书信息      *")
        print("* 4. 通过书名删除图书信息      *")
        print("* 5. 通过编号查询图书信息      *")
        print("* 6. 通过书名查询图书信息      *")
        print("* 7. 显示所有图书信息         *")
        print("* 8. 退出系统                *")
        print("*****************************")
        select_op = input("输入编号选择操作：")
        return select_op

    def __get_bid(self):
        '''
        获取用户输入的编号
        :return: 返回编号字符串
        '''
        bid = input("请输入图书编号:")
        return bid

    def __get_name(self):
        '''
        获取用户输入的图书名称
        :return: 返回图书名称字符串
        '''
        name = input("请输入图书的名称：")
        return name

    def __get_price(self):
        '''
        获取用户输入的图书的价格
        :return: 返回图书价格字符串
        '''
        while True:
            price = input("请输入图书的价格：")
            if price.isdigit():
                return int(price)
            else:
                print("输入图书的价格不合法，请输入价格")

    def __get_summary(self):
        '''
        获取用户输入的图书简介
        :return: 返回图书简介字符串
        '''
        summary = input("请输入图书简介：")
        return summary

    def add_book(self, bid, name, price , summary):
        '''
        添加图书
        :param bid: 图书 bid
        :param name: 图书名称
        :param price: 图书价格
        :param summary: 图书简介
        :return: 操作提示信息
        '''
        for s in self.books:
            if s.bid == bid:
                print("图书编号已存在，添加失败")
                return "添加失败"
        else:
            book = Book(bid , name , price , summary)
            self.books.append(book)
            print("添加图书信息成功")
            return '添加成功'

    def modify_book_by_id(self, bid, name, price, summary):
        '''
        通过学号修改图书信息
        :param bid: 图书编号
        :return: 操作提示信息
        '''
        for s in self.books:
            if s.bid == bid:
                s.name = name
                s.price = price
                s.summary = summary
                print("修改成功")
                return "修改成功"
        else:
            print(f'没有 {bid} 对应的图书信息')
            return "修改失败"

    def delete_book_by_id(self , bid):
        '''
        通过BID删除图书信息
        :param bid: 图书编号BID
        :return: 操作提示信
        '''
        for s in self.books:
            if s.bid == bid:
                self.books.remove(s)
                print("删除成功")
                return "删除成功"
        else:
            print(f'没有 {bid} 对应的图书信息')
            return "删除失败"

    def delete_book_by_name(self, name):
        '''
        通过图书名称 删除所有符合的图书
        :param name: 图书名称
        :return: 操作提示信息
        '''
        exist_s = []
        # 找出所有要删除的图书
        for s in self.books:
            if s.name == name:
                exist_s.append(s)

        # 开始删除
        if len(exist_s) > 0:
            for s in exist_s:
                self.books.remove(s)
                print(f"名称为 { name } 的图书删除成功")
            else:
                print(f"成功删除 {len(exist_s)} 个图书")
                return "删除成功"
        else:
            print(f"图书【{name}】不存在，无法删除")
            return "删除失败"

    def query_book_by_id(self, bid):
        '''
        通过编号查询图书信息
        :param bid: 图书编号
        :return: 操作提示信息
        '''
        for s in self.books:
            if s.bid == bid:
                print(f"图书编号 {bid} 的图书信息如下：")
                print(f"编号：{s.bid}，名称：{s.name}，价格：{s.price}，简介：{s.summary}")
                return "查询成功"
        else:
            print(f"图书编号 {bid} 的图书不存在")
            return "查询失败"

    def query_book_by_name(self, name):
        '''
        通过名称查询图书信息
        :param name:
        :return: 操作提示信息
        '''
        exist_s = []
        for s in self.books:
            if s.name == name:
                exist_s.append(s)

        if len(exist_s) > 0:
            print(f"名称为 {name} 的图书共 {len(exist_s)} 本，信息如下：")
            for s in exist_s:
                print(f"编号{s.bid}，名称：{s.name}，价格：{s.price}，简介：{s.summary}")
            return "查询成功"
        else:
            print(f"名称为 {name} 的图书不存在")
            return "查询失败"

    def show(self):
        '''
        显示所有图书信息
        :return: 格式化的图书信息
        '''
        print("所有图书信息如下：")
        for s in self.books:
            print(f"编号{s.bid}，名称：{s.name}，价格：{s.price}，简介：{s.summary}")


    def manager(self):
        '''
                管理方法
                :return:
                '''
        while True:
            select_op = self.__menu()
            if len(select_op) == 1 and select_op in "12345678":
                if select_op == "1":
                    bid = self.__get_bid()
                    name = self.__get_name()
                    price = self.__get_price()
                    summary = self.__get_summary()
                    self.add_book(bid , name , price , summary)
                elif select_op == "2":
                    bid = self.__get_bid()
                    name = self.__get_name()
                    price = self.__get_price()
                    summary = self.__get_summary()
                    self.modify_book_by_id(bid, name, price, summary)
                elif select_op == "3":
                    bid = self.__get_bid()
                    self.delete_book_by_id(bid)
                elif select_op == "4":
                    name = self.__get_name()
                    self.delete_book_by_name(name)
                elif select_op == "5":
                    bid = self.__get_bid()
                    self.query_book_by_id(bid)
                elif select_op == "6":
                    name = self.__get_name()
                    self.query_book_by_name(name)
                elif select_op == "7":
                    self.show()
                else:
                    break
            else:
                print("输入的数据不合法，请输入在合法范围内的操作编号！！！")

if __name__ == '__main__':
    m = BookManagement()
    m.manager()


