from rest_framework import serializers
from Models.Estado_Empresa import EstadoEmpresa
from Models.Provincia import Provincia
from Models.Localidad import Localidad
from Models.Empresa import Empresa
from Models.empresa_tipo import EmpresaTipo
from Models.origen import Origen
from Models.Usuario import Usuario
from Models.contacto_model import Contacto
from django.utils import timezone


class EmpresaSerializer(serializers.ModelSerializer):
    nombre = serializers.CharField(
        required=False,
        allow_blank=True,
        allow_null=True
    )
    estado_empresa = serializers.PrimaryKeyRelatedField(
        queryset=EstadoEmpresa.objects.all(),
        required=False
    )
    # Map 'name_comercial' from input to 'nombre_comercial' in model
    name_comercial = serializers.CharField(
        source='nombre_comercial', 
        required=False, 
        allow_blank=True, 
        allow_null=True
    )
    provincia = serializers.PrimaryKeyRelatedField(
        queryset=Provincia.objects.all(),
        required=False,
        allow_null=True
    )
    localidad = serializers.PrimaryKeyRelatedField(
        queryset=Localidad.objects.all(),
        required=False,
        allow_null=True
    )
    tipo_empresa_id = serializers.PrimaryKeyRelatedField(
        queryset=EmpresaTipo.objects.all(),
        source='tipo_empresa',
        required=False,
        allow_null=True
    )
    codigo_postal = serializers.CharField(
        allow_blank=True, allow_null=True
        # source='codigo_postal',
        # read_only=True
    )
    usuario_responsable_id = serializers.PrimaryKeyRelatedField(
        queryset=Usuario.objects.all(),
        source='usuario_responsable',
        required=False,
        allow_null=True
    )

    direccion = serializers.CharField(
        required=False, allow_blank=True, allow_null=True
    )
    origen_id = serializers.IntegerField(required=False, allow_null=True)
    telefono = serializers.CharField(required=False, allow_null=True)

    tipo_empresa_nombre = serializers.SerializerMethodField()
    origen_nombre = serializers.SerializerMethodField()

    def get_tipo_empresa_nombre(self, obj):
        if obj.tipo_empresa:
            return obj.tipo_empresa.nombre
        return None

    def get_origen_nombre(self, obj):
        origen_id = getattr(obj, 'origen_id', None)
        if origen_id:
            try:
                origen = Origen.objects.get(id=origen_id)
                return origen.nombre
            except Origen.DoesNotExist:
                return None
        return None
    
    class Meta:
        model = Empresa
        fields = [
            'id', 'nombre', 'name_comercial', 'cuit', 'estado_empresa', 'fecha_creacion',
            'provincia', 'localidad', 'direccion', 'tipo_empresa_id', 'tipo_empresa_nombre', 'origen_id', 'origen_nombre','codigo_postal', 'usuario_responsable_id', 'telefono'
        ]
        extra_kwargs = {'id': {'read_only': True}}

    def validate(self, data):
        # Determine tipo_empresa
        tipo_empresa = data.get('tipo_empresa')
        
        # If not present or explicit 1, treat as Lead logic
        is_type_1 = False
        if 'tipo_empresa' not in data:
             is_type_1 = True # Will default to 1 in create
        elif tipo_empresa and tipo_empresa.id == 1:
             is_type_1 = True
             
        if is_type_1:
             # Validate required fields for Lead/Potential
             errors = {}
             if not data.get('nombre_comercial'):
                  errors['name_comercial'] = "Este campo es requerido."
             if not data.get('origen_id'):
                  errors['origen_id'] = "Este campo es requerido."
             if not data.get('usuario_responsable'):
                  errors['usuario_responsable_id'] = "Este campo es requerido."
            
             if errors:
                  raise serializers.ValidationError(errors)  
        else:
             # Standard behavior: Provincia and Localidad required
             errors = {}
             if not data.get('provincia'):
                  errors['provincia'] = "Este campo es requerido."
             if not data.get('localidad'):
                  errors['localidad'] = "Este campo es requerido."
             if errors:
                  raise serializers.ValidationError(errors)

        return data

    def create(self, validated_data):
        telefono = validated_data.pop('telefono', None)

        # Default tipo_empresa = 1 si no se envía
        if 'tipo_empresa' not in validated_data or validated_data['tipo_empresa'] is None:
            validated_data['tipo_empresa'] = EmpresaTipo.objects.get(id=1)

        # Default estado_empresa = 1 si no se envía
        if 'estado_empresa' not in validated_data or validated_data['estado_empresa'] is None:
            validated_data['estado_empresa'] = EstadoEmpresa.objects.get(id=1)

        # Asegurar que origen_id es un entero
        if 'origen_id' in validated_data and validated_data['origen_id'] is not None:
            origen_id = validated_data['origen_id']
            if isinstance(origen_id, Origen):
                validated_data['origen_id'] = origen_id.id
        
        # Handle defaults for fields that are conditionally optional in validation but required in DB
        # if 'provincia' not in validated_data or validated_data['provincia'] is None:
        #     # Assuming ID 1 exists as a fallback. 
        #     validated_data['provincia'] = Provincia.objects.get(id=1)
            
        # if 'localidad' not in validated_data or validated_data['localidad'] is None:
        #      # Assuming ID 1 exists as a fallback.
        #     validated_data['localidad'] = Localidad.objects.get(id=1)

        empresa = super().create(validated_data)
        
        if telefono:
             Contacto.objects.create(
                 empresa=empresa,
                 telefono=telefono,
                 nombre="Contacto Principal",
                 email="", # Optional
                 fecha_creacion=timezone.now()
             )
             
        return empresa

class EmpresaUpdateSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField()
    nombre = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    cuit = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    name_comercial = serializers.CharField(
        source='nombre_comercial', 
        required=False, 
        allow_blank=True, 
        allow_null=True
    )
    provincia = serializers.PrimaryKeyRelatedField(
        queryset=Provincia.objects.all(),
        required=False,
        allow_null=True
    )
    localidad = serializers.PrimaryKeyRelatedField(
        queryset=Localidad.objects.all(),
        required=False,
        allow_null=True
    )
    tipo_empresa_id = serializers.PrimaryKeyRelatedField(
        queryset=EmpresaTipo.objects.all(),
        source='tipo_empresa',
        required=False,
        allow_null=True
    )
    direccion = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    origen_id = serializers.IntegerField(required=False, allow_null=True)
   
    origen_nombre = serializers.SerializerMethodField()
    codigo_postal = serializers.CharField(
        required=False,
        allow_blank=True,
        allow_null=True
    )
    estado_empresa_id = serializers.PrimaryKeyRelatedField(
        queryset=EstadoEmpresa.objects.all(),
        source='estado_empresa',
        required=False,
        allow_null=True
    )

    usuario_responsable_id = serializers.PrimaryKeyRelatedField(
        queryset=Usuario.objects.all(),
        source='usuario_responsable',
        required=False,
        allow_null=True
    )

    def get_origen_nombre(self, obj):
        origen_id = getattr(obj, 'origen_id', None)
        if origen_id:
            try:
                origen = Origen.objects.get(id=origen_id)
                return origen.nombre
            except Origen.DoesNotExist:
                return None
        return None

    def to_internal_value(self, data):
        # Mapear provincia_id a provincia y localidad_id a localidad si vienen en el JSON
        if 'provincia_id' in data and 'provincia' not in data:
            data['provincia'] = data.get('provincia_id')
        if 'localidad_id' in data and 'localidad' not in data:
            data['localidad'] = data.get('localidad_id')
        if 'tipo_empresa_id' in data and 'tipo_empresa' not in data:
            data['tipo_empresa'] = data.get('tipo_empresa_id')
        
        return super().to_internal_value(data)

    def validate(self, data):
        # Determinar el tipo de empresa
        # Si tipo_empresa_id está en los datos, usarlo; si no, obtenerlo de la instancia
        tipo_empresa = data.get('tipo_empresa')
        if tipo_empresa:
            is_type_1 = tipo_empresa.id == 1
        else:
            # Si no se envía tipo_empresa en los datos, buscar en la instancia actual
            if hasattr(self, 'instance') and self.instance:
                is_type_1 = self.instance.tipo_empresa and self.instance.tipo_empresa.id == 1
            else:
                is_type_1 = False
        
        # Validar CUIT duplicado si viene en los datos
        cuit = data.get('cuit')
        if cuit:
            cuit = cuit.strip()
            # Buscar si existe otro registro con ese CUIT (que no esté eliminado)
            empresa_duplicada = Empresa.objects.filter(
                cuit=cuit,
                deleted_at__isnull=True
            ).exclude(id=self.instance.id).first()
            
            if empresa_duplicada:
                raise serializers.ValidationError(
                    {'cuit': f"Ya existe una empresa con el CUIT {cuit}"}
                )
        
        errors = {}
        
        # Validaciones condicionales para tipo_empresa = 1 (prospecto)
        if is_type_1:
            # Para prospectos: validar que nombre_comercial no esté vacío
            if not data.get('nombre_comercial'):
                errors['nombre_comercial'] = "Este campo es requerido para prospectos."
        else:
            # Para otros tipos (ej: tipo 2): Provincia, Localidad y CUIT son obligatorios
            if not data.get('provincia'):
                errors['provincia'] = "Este campo es requerido."
            if not data.get('localidad'):
                errors['localidad'] = "Este campo es requerido."
            if not data.get('cuit'):
                errors['cuit'] = "Este campo es requerido."
        
        if errors:
            raise serializers.ValidationError(errors)
        
        return data

    def save(self, **kwargs):
        # No llamar a super().save() directamente, actualizar manualmente
        instance = self.instance
        
        # Actualizar cada campo del validated_data
        for attr, value in self.validated_data.items():
            setattr(instance, attr, value)
        
        # Guardar la instancia con todos los cambios
        instance.save()
        print(f"DEBUG: Instancia actualizada. provincia={instance.provincia_id}, localidad={instance.localidad_id}, tipo_empresa={instance.tipo_empresa_id}")
        
        return instance

    class Meta:
        model = Empresa
        fields = ['id', 'nombre', 'name_comercial', 'cuit', 'estado_empresa_id', 'provincia', 'localidad', 'direccion', 'tipo_empresa_id','origen_id', 'origen_nombre', 'codigo_postal', 'usuario_responsable_id']

class EmpresaDeleteSerializer(serializers.Serializer):
    id = serializers.IntegerField()

class EstadoEmpresaSerializer(serializers.ModelSerializer):
    class Meta:
        model = EstadoEmpresa
        fields = ['id', 'nombre_estado']
        
class UsuarioEmpresaSerializer(serializers.ModelSerializer):
    nombre_rol = serializers.CharField(source='rol_usuario.nombre_rol', read_only=True)

    class Meta:
        model = Usuario
        fields = ['id', 'nombre', 'email', 'nombre_rol']

class EmpresaListSerializer(serializers.ModelSerializer):
    provincia = serializers.CharField(source='provincia.nombre', read_only=True)
    provincia_id = serializers.IntegerField(read_only=True)
    localidad = serializers.CharField(source='localidad.nombre', read_only=True)
    localidad_id = serializers.IntegerField(read_only=True)
    estado = serializers.CharField(source='estado_empresa.nombre_estado', read_only=True)
    tipo_empresa_nombre = serializers.CharField(source='tipo_empresa.nombre', read_only=True, allow_null=True)
    usuario_responsable = serializers.CharField(source='usuario_responsable.nombre', read_only=True, allow_null=True)
    origen_nombre = serializers.SerializerMethodField()
    contactos = serializers.SerializerMethodField()

    class Meta:
        model = Empresa
        fields = [
            'id', 'nombre', 'nombre_comercial', 'cuit', 'estado_empresa', 'estado', 'fecha_creacion',
            'provincia', 'provincia_id', 'localidad', 'localidad_id', 'direccion', 'tipo_empresa_id', 
            'tipo_empresa_nombre', 'origen_id', 'origen_nombre',
            'codigo_postal', 'usuario_responsable', 'usuario_responsable_id', 'contactos'
        ]

    def get_origen_nombre(self, obj):
        origenes_map = self.context.get('origenes_map')
        if origenes_map is not None:
             return origenes_map.get(obj.origen_id)
        
        # Fallback logic if map not provided
        origen_id = getattr(obj, 'origen_id', None)
        if origen_id:
            try:
                return Origen.objects.get(id=origen_id).nombre
            except Origen.DoesNotExist:
                return None
        return None

    def get_contactos(self, obj):
        contactos = Contacto.objects.filter(empresa_id=obj.id, deleted_at__isnull=True).values('id', 'nombre', 'email', 'telefono', 'cargo')
        return list(contactos)
