from django.shortcuts import render
from django.utils import timezone
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import status, permissions
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi
from Models.contacto_model import Contacto
from .serializers import ContactoSerializer, ContactoUpdateSerializer, ContactoDeleteSerializer
# Importamos el helper de auditoría
from audit.helpers import AuditHelper

class ContactoViewSet(viewsets.ViewSet):
    @action(detail=False, methods=['get'], url_path='list_contact')
    @action(detail=False, methods=['get'], url_path='list_contact')
    def list_contact(self, request):
        contactos = Contacto.objects.filter(deleted_at__isnull=True)
        
        # Pagination/Limit
        limit = request.query_params.get('limit')
        if limit and limit.isdigit():
            contactos = contactos.order_by('-fecha_creacion')[:int(limit)]
            
        serializer = ContactoSerializer(contactos, many=True)
        return Response(serializer.data)

    @swagger_auto_schema(
        operation_description="Crea un nuevo contacto.",
        request_body=ContactoSerializer,
        responses={
            201: ContactoSerializer,
            400: 'Solicitud incorrecta'
        }
    )
    @action(detail=False, methods=['post'], url_path='create_contact')
    def create_contact(self, request):
        data = request.data.copy()
        
        # Validar duplicidad de teléfono
        telefono = data.get('telefono')
        if telefono:
            if Contacto.objects.filter(telefono=telefono, deleted_at__isnull=True).exists():
                return Response(
                    {"error": "Ya existe un contacto con el mismo número de teléfono."}, 
                    status=status.HTTP_400_BAD_REQUEST
                )

        data['fecha_creacion'] = timezone.now()  # Asigna la fecha actual automáticamente
        serializer = ContactoSerializer(data=data)
        if serializer.is_valid():
            contacto = serializer.save()
            
            # Si no estás pasando el usuario o no tienes acceso al usuario, no lo incluyas
            # O asegúrate de que request.user sea una instancia de Usuario
            try:
                # Utiliza el helper sin pasar el usuario (pasa user=None)
                AuditHelper.log_action(
                    user=None,  # No pasamos el usuario
                    action='CREATE',
                    instance=contacto,
                    data_after=serializer.data,
                    description=f"Creación de contacto: {contacto.nombre}",
                    request=request
                )
            except Exception as e:
                print(f"Error al registrar la auditoría: {str(e)}")
                
            return Response(ContactoSerializer(contacto).data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    @swagger_auto_schema(
        operation_description="Modifica un contacto existente por ID. Solo se modifican los campos enviados.",
        request_body=openapi.Schema(
            type=openapi.TYPE_OBJECT,
            required=['id'],
            properties={
                'id': openapi.Schema(type=openapi.TYPE_INTEGER, description='ID del contacto'),
                'nombre': openapi.Schema(type=openapi.TYPE_STRING, description='Nombre del contacto'),
                'email': openapi.Schema(type=openapi.TYPE_STRING, description='Email del contacto'),
                'telefono': openapi.Schema(type=openapi.TYPE_STRING, description='Teléfono del contacto'),
                'empresa_id': openapi.Schema(type=openapi.TYPE_INTEGER, description='ID de la empresa del contacto'),
                'cargo': openapi.Schema(type=openapi.TYPE_STRING, description='Cargo del contacto')
            },
        ),
        responses={
            200: ContactoSerializer,
            400: 'Solicitud incorrecta',
            404: 'Contacto no encontrado'
        }
    )
    @action(detail=False, methods=['patch'], url_path='update_contact')
    def update_contact(self, request):
        contacto_id = request.data.get('id')
        if not contacto_id:
            return Response({"error": "Se requiere el id del contacto"}, status=status.HTTP_400_BAD_REQUEST)
        try:
            contacto = Contacto.objects.get(id=contacto_id)
        except Contacto.DoesNotExist:
            return Response({"error": "Contacto no encontrado"}, status=status.HTTP_404_NOT_FOUND)

        update_fields = {}
        # Permitimos actualizar también empresa_id (que el serializer mapea a empresa)
        for field in ['nombre', 'email', 'telefono', 'empresa_id', 'cargo']:
            if field in request.data:
                update_fields[field] = request.data[field]

        if not update_fields:
            return Response({"error": "No se enviaron campos para modificar"}, status=status.HTTP_400_BAD_REQUEST)

        # Validar duplicidad de teléfono
        telefono = update_fields.get('telefono')
        if telefono:
            if Contacto.objects.filter(telefono=telefono, deleted_at__isnull=True).exclude(id=contacto_id).exists():
                return Response(
                    {"error": "Ya existe otro contacto con el mismo número de teléfono."}, 
                    status=status.HTTP_400_BAD_REQUEST
                )

        serializer = ContactoUpdateSerializer(contacto, data=update_fields, partial=True)
        if serializer.is_valid():
            contacto = serializer.save()
        # Utiliza el helper sin pasar el usuario (pasa user=None)
    
            # AuditHelper.log_action(
            #         user=None,  # No pasamos el usuario
            #         action='UPDATE',
            #         instance=contacto,
            #         data_after=serializer.data,
            #         description=f"UPDATE de contacto: {contacto.nombre}",
            #         request=request
            #     )
            return Response(ContactoSerializer(contacto).data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    @swagger_auto_schema(
        operation_description="Elimina (soft delete) un contacto por ID. Actualiza el campo deleted_at.",
        request_body=ContactoDeleteSerializer,
        responses={
            200: openapi.Response('Contacto eliminado'),
            400: 'Solicitud incorrecta',
            404: 'Contacto no encontrado'
        }
    )
    @action(detail=False, methods=['post'], url_path='delete_contact')
    def delete_contact(self, request):
        contacto_id = request.data.get('id')
        if not contacto_id:
            return Response({"error": "Se requiere el id del contacto"}, status=status.HTTP_400_BAD_REQUEST)
        try:
            contacto = Contacto.objects.get(id=contacto_id)
        except Contacto.DoesNotExist:
            return Response({"error": "Contacto no encontrado"}, status=status.HTTP_404_NOT_FOUND)

        contacto.deleted_at = timezone.now()
        contacto.save()
        return Response({"mensaje": "Contacto eliminado correctamente", "id": contacto_id}, status=status.HTTP_200_OK)

