Загрузка данных


from datetime import datetime


class Product:

    def __init__(
        self, name: str, quantity: float, expiration_date: str | datetime
    ):
        """Продукт с наименованием, количеством (весом/объемом) и сроком годности."""
        self.name = name.strip()
        self.quantity = quantity  # Количество / вес в граммах, мл или шт.

        if isinstance(expiration_date, str):
            self.expiration_date = datetime.strptime(
                expiration_date, "%d-%m-%y"
            ).date()
        else:
            self.expiration_date = expiration_date

    def __repr__(self):
        date_str = self.expiration_date.strftime("%d-%m-%Y")
        return f"Product(название='{self.name}', кол-во={self.quantity}, до={date_str})"


class Fridge:

    def __init__(self, limits: dict[str, float] = None):
        """Холодильник содержит список продуктов и минимальные допустимые лимиты по наименованиям."""
        self.products: list[Product] = []
        # Словарь минимальных лимитов, например: {"молоко": 1000, "сыр": 200}
        self.limits = limits if limits is not None else {}

    def set_limit(self, category_name: str, min_quantity: float):
        """Установить или обновить критический предел для категории продуктов."""
        self.limits[category_name.lower().strip()] = min_quantity

    def add_product(self, product: Product):
        """Функция добавления продукта в холодильник."""
        self.products.append(product)
        print(f"Добавлено: {product}")

    def search_by_name(self, search_term: str) -> list[Product]:
        """Функция поиска продуктов по наименованию (например, все 'молоко' или весь 'сыр')."""
        term = search_term.lower().strip()
        found = [p for p in self.products if term in p.name.lower()]
        return found

    def get_total_quantity_by_category(self, category_name: str) -> float:
        """Суммирует количество всех продуктов одного вида/категории."""
        category = category_name.lower().strip()
        total = sum(
            p.quantity
            for p in self.products
            if category in p.name.lower()
        )
        return total

    def check_replenishment_list(self) -> dict[str, dict[str, float]]:
        """Мониторинг веса и вывод списка продуктов к пополнению.

        Сравнивает суммарный остаток каждого наименования с минимальным
        критическим пределом.
        """
        replenishment_needed = {}

        for category, limit in self.limits.items():
            current_total = self.get_total_quantity_by_category(category)
            if current_total < limit:
                replenishment_needed[category] = {
                    "текущее_количество": current_total,
                    "критический_предел": limit,
                    "необходимо_докупить": limit - current_total,
                }

        return replenishment_needed


# ==========================================
# Пример использования (по данным с доски):
# ==========================================

# 1. Создаем холодильник и задаем минимальные лимиты (в граммах/мл)
fridge = Fridge(
    limits={
        "молоко": 1000,  # Минимальный лимит молока — 1000 гр (1 л)
        "сыр": 200,  # Минимальный лимит сыра — 200 гр
    }
)

print("--- 1. Добавление продуктов в холодильник ---")
# Добавляем Молоко 1 и Молоко 2
fridge.add_product(Product("Молоко 1", 700, "15-10-26"))
fridge.add_product(Product("Молоко 2", 200, "07-10-26"))

# Добавляем Сыр 1 и Сыр 2
fridge.add_product(Product("Сыр 1", 100, "15-12-26"))
fridge.add_product(Product("Сыр 2", 50, "05-12-26"))

print("\n--- 2. Поиск по наименованию ---")
milk_list = fridge.search_by_name("молоко")
print("Найденные позиции молока:", milk_list)

cheese_list = fridge.search_by_name("сыр")
print("Найденные позиции сыра:", cheese_list)

print("\n--- 3. Проверка продуктов к пополнению (Мониторинг веса) ---")
to_buy = fridge.check_replenishment_list()

for item, info in to_buy.items():
    print(
        f"Продукт '{item}': осталось {info['текущее_количество']}, "
        f"предел = {info['критический_предел']}. "
        f"Нужно докупить: {info['необходимо_докупить']}"
    )