# management/commands/crear_relaciones_prueba.py
from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
from datetime import datetime, timedelta
import random
from decimal import Decimal

# Importa todos tus modelos
from listas_configuracion.models import EmpaqueCompra, EmpaqueProduccion
from referencias.models import Referencia
from distribucion.models import EmpaqueDistribucion
from fabricacion.models import (
    PlantaProduccion, Maquina, MaquinaReferencia, 
    Mantenimiento, Reparacion
)
from lista_de_materiales.models import ListaMateriales, ComponenteListaMateriales
from proveedores.models import Proveedor, ProveedorReferencia

class Command(BaseCommand):
    help = 'Crea relaciones de prueba basadas en las referencias existentes'

    def handle(self, *args, **options):
        self.crear_usuarios()
        empaques_compra = self.crear_empaques_compra()
        empaques_produccion = self.crear_empaques_produccion()
        plantas = self.crear_plantas_produccion()
        maquinas = self.crear_maquinas(plantas)
        referencias = Referencia.objects.all()
        self.crear_maquina_referencias(maquinas, referencias, empaques_produccion)
        proveedores = self.crear_proveedores()
        self.crear_proveedor_referencias(proveedores, referencias, empaques_compra)
        self.crear_listas_materiales(referencias)
        self.crear_empaques_distribucion(referencias)
        self.crear_mantenimientos(maquinas)
        self.crear_reparaciones(maquinas)
        
        self.stdout.write(self.style.SUCCESS('Relaciones de prueba creadas exitosamente!'))

    def crear_usuarios(self):
        if not User.objects.filter(username='admin').exists():
            User.objects.create_superuser('admin', 'admin@example.com', 'admin123')
        return User.objects.create_user('usuario1', 'usuario1@example.com', 'usuario123')

    def crear_empaques_compra(self):
        return [
            EmpaqueCompra.objects.get_or_create(
                nombre='Caja', descripcion='Caja de cartón estándar'
            )[0],
            EmpaqueCompra.objects.get_or_create(
                nombre='Bulto', descripcion='Bulto de 25 kg'
            )[0],
            EmpaqueCompra.objects.get_or_create(
                nombre='Rollo', descripcion='Rollo de material'
            )[0],
        ]

    def crear_empaques_produccion(self):
        return [
            EmpaqueProduccion.objects.get_or_create(
                nombre='Lote', descripcion='Producción por lotes'
            )[0],
            EmpaqueProduccion.objects.get_or_create(
                nombre='Paquete', descripcion='Paquete de 10 unidades'
            )[0],
            EmpaqueProduccion.objects.get_or_create(
                nombre='Caja', descripcion='Caja de producción'
            )[0],
        ]

    def crear_plantas_produccion(self):
        plantas = [
            {
                'nombre': 'Planta Principal Bogotá',
                'direccion': 'Calle 123 #45-67, Bogotá',
                'contacto_produccion': 'Juan Pérez',
                'telefono_contacto': '6012345678',
                'email_contacto': 'produccion@dentales.com',
            },
            {
                'nombre': 'Planta Secundaria Medellín',
                'direccion': 'Carrera 56 #78-90, Medellín',
                'contacto_produccion': 'María Gómez',
                'telefono_contacto': '6049876543',
                'email_contacto': 'produccion.med@dentales.com',
            },
        ]
        
        return [PlantaProduccion.objects.create(**p) for p in plantas]

    def crear_maquinas(self, plantas):
        maquinas = []
        tipos_maquinas = [
            'Inyectora', 'Extrusora', 'Moldeadora', 'Empacadora', 'Mezcladora'
        ]
        
        for planta in plantas:
            for i, tipo in enumerate(tipos_maquinas, 1):
                maquina = Maquina.objects.create(
                    planta=planta,
                    nombre=f"{tipo} {i}",
                    tiempo_configuracion=random.randint(1, 4),
                    periodo_mantenimiento=random.randint(30, 90),
                )
                maquinas.append(maquina)
        
        return maquinas

    def crear_maquina_referencias(self, maquinas, referencias, empaques_produccion):
        # Solo para referencias de tipo PP y PT
        refs_produccion = [r for r in referencias if r.tipo in ['PP', 'PT']]
        
        for ref in refs_produccion:
            maquina = random.choice(maquinas)
            MaquinaReferencia.objects.create(
                maquina=maquina,
                referencia=ref,
                lead_time_generar_orden=random.randint(1, 24),
                lead_time_produccion=random.randint(1, 48),
                minimo_unidades=random.choice([100, 200, 500, 1000]),
                empaque=random.choice(empaques_produccion),
                unidades_por_empaque=random.choice([10, 20, 50, 100]),
                unidades_por_minuto=Decimal(random.uniform(0.5, 5.0)),
            )

    def crear_proveedores(self):
        proveedores = [
            {
                'nombre_empresa': 'Plásticos Dentales S.A.',
                'nit': '900123456-1',
                'direccion': 'Calle 10 #20-30, Bogotá',
                'telefono': '6012345678',
                'email': 'contacto@plasticosdentales.com',
                'contacto_compra': 'Carlos Rojas',
                'telefono_contacto': '6012345678',
                'email_contacto': 'compras@plasticosdentales.com',
            },
            {
                'nombre_empresa': 'Químicos Odontológicos Ltda.',
                'nit': '800987654-2',
                'direccion': 'Carrera 45 #67-89, Cali',
                'telefono': '6023456789',
                'email': 'info@quimicosodontologicos.com',
                'contacto_compra': 'Ana Martínez',
                'telefono_contacto': '6023456789',
                'email_contacto': 'compras@quimicosodontologicos.com',
            },
            {
                'nombre_empresa': 'Empaques Higiénicos SAS',
                'nit': '890765432-3',
                'direccion': 'Avenida 30 #40-50, Barranquilla',
                'telefono': '6056789012',
                'email': 'ventas@empaqueshigienicos.com',
                'contacto_compra': 'Pedro González',
                'telefono_contacto': '6056789012',
                'email_contacto': 'pedro.gonzalez@empaqueshigienicos.com',
            },
        ]
        
        return [Proveedor.objects.create(**p) for p in proveedores]

    def crear_proveedor_referencias(self, proveedores, referencias, empaques_compra):
        # Solo para referencias de tipo MP
        refs_mp = [r for r in referencias if r.tipo == 'MP']
        
        for ref in refs_mp:
            proveedor = random.choice(proveedores)
            ProveedorReferencia.objects.create(
                proveedor=proveedor,
                referencia=ref,
                lead_time_generar_orden=random.randint(1, 3),
                lead_time_proveedor=random.randint(7, 30),
                minimo_unidades=random.choice([100, 200, 500]),
                empaque=random.choice(empaques_compra),
                unidades_por_empaque=random.choice([10, 20, 50]),
                esta_certificado=random.choice(['certificado', 'no_certificado']),
            )

    def crear_listas_materiales(self, referencias):
        usuario = User.objects.first()
        
        # Solo para referencias de tipo PP y PT
        refs_produccion = [r for r in referencias if r.tipo in ['PP', 'PT']]
        refs_mp_pp = [r for r in referencias if r.tipo in ['MP', 'PP']]
        
        for ref in refs_produccion:
            lista = ListaMateriales.objects.create(
                referencia=ref,
                codigo=f"BOM-{ref.sku}-1",
                version=1,
                estado='A',
                descripcion=f"Lista de materiales para {ref.sku}",
                creado_por=usuario,
            )
            
            # Agregar componentes (3-5 por lista)
            num_componentes = random.randint(3, 5)
            componentes_seleccionados = random.sample(refs_mp_pp, num_componentes)
            
            for i, componente in enumerate(componentes_seleccionados, 1):
                cantidad = Decimal(random.uniform(0.1, 5.0)) if componente.unidad.nombre != 'Unidades' else Decimal(random.randint(1, 5))
                
                ComponenteListaMateriales.objects.create(
                    lista_materiales=lista,
                    referencia=componente,
                    cantidad=cantidad,
                    desperdicio=Decimal(random.uniform(0.0, 10.0)),
                    orden=i,
                    obligatorio=random.choice([True, False]),
                    notas=f"Componente {i} para {lista.codigo}",
                )

    def crear_empaques_distribucion(self, referencias):
        # Solo para referencias de tipo PT
        refs_pt = [r for r in referencias if r.tipo == 'PT']
        
        for ref in refs_pt:
            EmpaqueDistribucion.objects.create(
                nombre=f"Empaque para {ref.sku}",
                descripcion=f"Empaque estándar para distribución de {ref.sku}",
                referencia=ref,
                unidades_por_empaque=random.choice([1, 6, 12, 24]),
                unidad_medida_longitud=ref.unidad,  # Usamos la unidad de la referencia como ejemplo
                unidad_medida_peso=ref.unidad,
                unidad_medida_volumen=ref.unidad,
                largo=Decimal(random.uniform(10.0, 30.0)),
                ancho=Decimal(random.uniform(5.0, 20.0)),
                alto=Decimal(random.uniform(2.0, 15.0)),
                peso_empaque_lleno=Decimal(random.uniform(50.0, 500.0)),
                niveles_maximos_estiba=random.randint(3, 10),
                empaques_por_nivel=random.randint(5, 20),
            )

    def crear_mantenimientos(self, maquinas):
        for maquina in maquinas:
            for i in range(1, 4):  # 3 mantenimientos por máquina
                fecha_programada = datetime.now() + timedelta(days=random.randint(7, 30))
                
                Mantenimiento.objects.create(
                    maquina=maquina,
                    concepto=f"Mantenimiento preventivo {i}",
                    tiempo_mantenimiento=random.randint(1, 8),
                    fecha_programada=fecha_programada,
                    realizado=i == 1,  # El primero marcado como realizado
                    fecha_realizacion=fecha_programada - timedelta(days=random.randint(1, 6)) if i == 1 else None,
                )

    def crear_reparaciones(self, maquinas):
        for maquina in maquinas[:len(maquinas)//2]:  # Reparaciones solo en la mitad de las máquinas
            Reparacion.objects.create(
                maquina=maquina,
                concepto="Reparación de emergencia",
                tiempo_arreglo=random.randint(2, 12),
                fecha_reparacion=datetime.now() - timedelta(days=random.randint(1, 30)),
                observaciones="Se reemplazó componente defectuoso",
            )