"""
Сервисы для бизнес-логики Product модели.
Извлекает сложную логику из save() метода.
"""


class ProductSaveService:
    """
    Сервис для обработки сохранения Product.
    Генерирует SKU и поисковые ключевые слова.
    """

    @staticmethod
    def prepare_product_for_save(product):
        """
        Подготавливает продукт к сохранению:
        - Генерирует SKU если не задан
        - Создает базовые поисковые ключевые слова

        Args:
            product (Product): Экземпляр продукта

        Returns:
            Product: Обновленный экземпляр продукта
        """
        from ..utils.sku_generator import generate_product_sku

        # Генерация артикула для новых товаров
        if not product.sku:
            product.sku = generate_product_sku(product)

        # Автоматическая генерация ключевых слов для поиска
        keywords_parts = [
            product.name or '',
            product.sku or '',
            product.description or '',
        ]

        if not product.search_keywords:
            product.search_keywords = ' '.join(filter(None, keywords_parts))

        return product

    @staticmethod
    def update_search_keywords_with_categories(product):
        """
        Обновляет поисковые ключевые слова с названиями категорий.
        Должен вызываться после сохранения, т.к. ManyToMany требует существующего объекта.

        Args:
            product (Product): Сохраненный экземпляр продукта
        """
        # Добавляем названия категорий в search_keywords после сохранения
        # (ManyToMany требует, чтобы объект уже существовал в БД)
        if product.pk and product.categories.exists():
            category_names = ' '.join([cat.name for cat in product.categories.all()])
            if category_names and category_names not in product.search_keywords:
                product.search_keywords = f"{product.search_keywords} {category_names}".strip()
                # Используем update чтобы избежать рекурсии
                from ..models.products import Product
                Product.objects.filter(pk=product.pk).update(search_keywords=product.search_keywords)
