# app_venin_web_new1/management/commands/check_saldos.py

from datetime import date
from django.core.management.base import BaseCommand
from django.utils import timezone
from django.db.models import F
from app_venin_web_new1.models import Articulos
from app_venin_web_new1.utils import calcular_saldo_articulo

class Command(BaseCommand):
    help = 'Verifica inconsistencias en los saldos por sucursal de 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). Por defecto hoy.',
        )

    def handle(self, *args, **options):
        # Determina fecha de corte
        fecha_opt = options.get('fecha')
        if fecha_opt:
            fecha_corte = timezone.datetime.strptime(fecha_opt, '%Y-%m-%d').date()
        else:
            fecha_corte = timezone.now().date()

        self.stdout.write(f"Verificando saldos contra fecha de corte: {fecha_corte}\n")

        # Campos de saldo en Articulos según sucursal
        CAMPOS_POR_SUCURSAL = {
            1: 'saldo00001',
            2: 'saldo00002',
            3: 'saldo00003',
            4: 'saldo00004',
            5: 'saldo00005',
            6: 'saldo00006',
            7: 'saldo00007',
            8: 'saldo00008',
            9: 'saldo00009',
        }

        total_art = Articulos.objects.count()
        inconsistencias = []

        for idx, art in enumerate(Articulos.objects.iterator(), start=1):
            for suc_id, campo in CAMPOS_POR_SUCURSAL.items():
                try:
                    calculado = calcular_saldo_articulo(
                        art.idproduct,
                        suc_id,
                        fecha_corte
                    )
                    almacenado = getattr(art, campo, None)
                    if almacenado is None:
                        self.stderr.write(
                            f"[ART {art.idproduct}] El campo '{campo}' no existe en el modelo."
                        )
                        continue

                    if calculado != almacenado:
                        inconsistencias.append({
                            'idarticulo': art.idproduct,
                            'articulo': art.nombre,
                            'sucursal': suc_id,
                            'campo': campo,
                            'calculado': calculado,
                            'almacenado': almacenado,
                        })

                except Exception as e:
                    self.stderr.write(
                        f"[ERROR] Artículo {art.idproduct}, sucursal {suc_id}: {e}"
                    )

            # Mensaje de progreso cada 200 artículos
            if idx % 200 == 0:
                self.stdout.write(f"Procesados {idx}/{total_art} artículos...")

        # Imprime resumen de inconsistencias
        if inconsistencias:
            self.stdout.write(self.style.WARNING(
                f"\nSe encontraron {len(inconsistencias)} inconsistencias:\n"
            ))
            for inc in inconsistencias:
                self.stdout.write(
                    ("ID {idarticulo} Artículo {articulo} | Sucursal {sucursal} | "
                     "{campo}: calculado={calculado} vs almacenado={almacenado}")
                    .format(**inc)
                )
        else:
            self.stdout.write(self.style.SUCCESS(
                "No se encontraron inconsistencias. Todos los saldos coinciden."
            ))
