from django.core.management.base import BaseCommand
from django.db import transaction
from django.utils import timezone
from app_venin_web_new1.models import Articulos
from app_venin_web_new1.utils import calcular_saldo_articulo  # Import desde utils

class Command(BaseCommand):
    help = 'Actualiza los saldos por sucursal de todos los artículos'

    def add_arguments(self, parser):
        parser.add_argument(
            '--fecha',
            type=str,
            help='Fecha de corte para el cálculo (YYYY-MM-DD)'
        )

    def handle(self, *args, **kwargs):
        fecha_corte = kwargs.get('fecha')
        if fecha_corte:
            fecha_corte = timezone.datetime.strptime(fecha_corte, '%Y-%m-%d').date()
        else:
            fecha_corte = timezone.now().date()
        
        self.stdout.write(f"Iniciando actualización por sucursal. Fecha corte: {fecha_corte}")
        
        # Obtener todos los artículos
        articulos = Articulos.objects.all()
        total_articulos = articulos.count()
        
        # Mapeo de campos por sucursal
        CAMPOS_POR_SUCURSAL = {
            1: 'saldo00001',
            2: 'saldo00002',
            3: 'saldo00003',
            4: 'saldo00004',
            5: 'saldo00005',
            6: 'saldo00006',
            7: 'saldo00007',
        }
        
        # Preparar lista de campos a actualizar
        campos_a_actualizar = list(CAMPOS_POR_SUCURSAL.values())
        
        with transaction.atomic():
            for i, articulo in enumerate(articulos):
                actualizado = False
                
                # Calcular y actualizar saldo para cada sucursal
                for sucursal_id, campo in CAMPOS_POR_SUCURSAL.items():
                    try:
                        saldo_sucursal = calcular_saldo_articulo(
                            articulo.idproduct,
                            sucursal_id,
                            fecha_corte
                        )
                        
                        # Actualizar solo si el valor cambió
                        if getattr(articulo, campo) != saldo_sucursal:
                            setattr(articulo, campo, saldo_sucursal)
                            actualizado = True
                            
                    except Exception as e:
                        self.stderr.write(f"Error art. {articulo.idproduct} suc. {sucursal_id}: {str(e)}")
                
                # Si se actualizó algún campo, guardar el artículo
                if actualizado:
                    articulo.save(update_fields=campos_a_actualizar)
                
                # Mostrar progreso cada 100 artículos
                if (i + 1) % 100 == 0:
                    self.stdout.write(f"Procesados: {i+1}/{total_articulos} artículos")
        
        self.stdout.write(self.style.SUCCESS(
            f"Actualización completada! Artículos procesados: {total_articulos}, Fecha: {fecha_corte}"
        ))