"""
Команда управления для пересчёта статуса in_stock всех товаров.

НАЗНАЧЕНИЕ:
    Команда для разового массового исправления флага наличия товаров.
    В обычных условиях статус обновляется автоматически через сигналы
    (inventory/signals.py: update_product_in_stock_on_stock_change).
    
КОГДА ИСПОЛЬЗОВАТЬ:
    - После миграции данных или импорта товаров
    - После ручного изменения Stock в БД (минуя ORM)
    - При обнаружении рассинхронизации данных
    - После восстановления из резервной копии
    
АВТОМАТИЗАЦИЯ:
    ✓ В продакшене работают сигналы - команда НЕ нужна регулярно
    ✓ Сигналы обновляют in_stock при каждом изменении Stock
    ✓ См. inventory/signals.py (строки 1696-1744):
      - update_product_in_stock_on_stock_change
      - update_product_in_stock_on_stock_delete

ИСПОЛЬЗОВАНИЕ:
    # ДЛЯ SINGLE-TENANT (без мультитенантности):
    python manage.py update_product_in_stock
    python manage.py update_product_in_stock --verbose
    
    # ДЛЯ MULTI-TENANT (обязательно через switch_to_tenant.py):
    python switch_to_tenant.py anatol update_product_in_stock
    python switch_to_tenant.py anatol update_product_in_stock --verbose
    python switch_to_tenant.py grach update_product_in_stock
    
    # ❌ НЕПРАВИЛЬНО: python manage.py update_product_in_stock --schema=anatol
    # ✓ ПРАВИЛЬНО: python switch_to_tenant.py anatol update_product_in_stock

ЛОГИКА:
    Товар считается в наличии (in_stock=True), если существует хотя бы 
    один Stock с quantity_available > 0 на любом складе.
"""

from django.core.management.base import BaseCommand
from django.db.models import Q
from products.models import Product
from inventory.models import Stock


class Command(BaseCommand):
    help = 'Пересчитать статус in_stock для всех товаров на основе остатков в Stock'

    def add_arguments(self, parser):
        parser.add_argument(
            '--verbose',
            action='store_true',
            help='Выводить подробную информацию о каждом товаре',
        )

    def handle(self, *args, **options):
        verbose = options.get('verbose', False)

        self.stdout.write(self.style.SUCCESS('\n' + '='*80))
        self.stdout.write(self.style.SUCCESS('ПЕРЕСЧЁТ СТАТУСА НАЛИЧИЯ ТОВАРОВ'))
        self.stdout.write(self.style.SUCCESS('='*80 + '\n'))

        # Получаем все товары (включая удалённые, если нужно)
        all_products = Product.all_objects.all()
        total = all_products.count()
        updated_count = 0
        in_stock_count = 0
        out_of_stock_count = 0

        self.stdout.write(f'Всего товаров: {total}\n')

        for product in all_products:
            # Проверяем есть ли остаток на любом складе
            has_stock = Stock.objects.filter(
                product=product,
                quantity_available__gt=0
            ).exists()

            # Обновляем в_наличии если статус изменился
            old_status = product.in_stock
            if product.in_stock != has_stock:
                Product.all_objects.filter(id=product.id).update(in_stock=has_stock)
                updated_count += 1
                status_text = 'В НАЛИЧИИ' if has_stock else 'НЕ В НАЛИЧИИ'
                old_status_text = 'В НАЛИЧИИ' if old_status else 'НЕ В НАЛИЧИИ'

                if verbose:
                    self.stdout.write(
                        self.style.SUCCESS(f'✓ {product.name:60} {old_status_text} → {status_text}')
                    )

            # Подсчитываем статистику
            if has_stock:
                in_stock_count += 1
            else:
                out_of_stock_count += 1

        self.stdout.write(self.style.SUCCESS('\n' + '='*80))
        self.stdout.write(self.style.SUCCESS('РЕЗУЛЬТАТЫ:'))
        self.stdout.write(self.style.SUCCESS(f'  Всего товаров:        {total}'))
        self.stdout.write(self.style.SUCCESS(f'  Обновлено:            {updated_count}'))
        self.stdout.write(self.style.SUCCESS(f'  В наличии:            {in_stock_count}'))
        self.stdout.write(self.style.SUCCESS(f'  Не в наличии:         {out_of_stock_count}'))
        self.stdout.write(self.style.SUCCESS('='*80 + '\n'))

        if updated_count > 0:
            self.stdout.write(
                self.style.SUCCESS(f'✓ Успешно обновлено {updated_count} товаров')
            )
        else:
            self.stdout.write(self.style.WARNING('Нет товаров для обновления'))
