from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.shortcuts import get_object_or_404
from rest_framework.permissions import IsAuthenticated
from drf_yasg.utils import swagger_auto_schema

from contact_agent.models.contact_agent import AgentContactInformation
from contact_agent.serializers.contact_agent_serializer import AgentContactInformationSerializer


class AgentContactInformationListCreateAPIView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = request.user
        
        # Filter to show only contact information for the agent linked to this user
        if hasattr(user, "agent"):
            queryset = AgentContactInformation.objects.filter(agent_info=user.agent)
        else:
            # If user is not an agent, return empty queryset (or all if admin)
            queryset = AgentContactInformation.objects.none()

        serializer = AgentContactInformationSerializer(
            queryset,
            many=True,
            context={"request": request}
        )
        return Response(serializer.data, status=status.HTTP_200_OK)

    @swagger_auto_schema(request_body=AgentContactInformationSerializer)
    def post(self, request):
        serializer = AgentContactInformationSerializer(
            data=request.data,
            context={"request": request}
        )
        serializer.is_valid(raise_exception=True)
        serializer.save(created_by=request.user)

        return Response(
            {
                "message": "Contact information created successfully",
                "data": serializer.data
            },
            status=status.HTTP_201_CREATED
        )

class AgentContactInformationDetailAPIView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, pk):
        instance = get_object_or_404(AgentContactInformation, pk=pk)

        serializer = AgentContactInformationSerializer(
            instance,
            context={"request": request}
        )
        return Response(serializer.data, status=status.HTTP_200_OK)

    @swagger_auto_schema(request_body=AgentContactInformationSerializer)
    def put(self, request, pk):
        instance = get_object_or_404(AgentContactInformation, pk=pk)

        serializer = AgentContactInformationSerializer(
            instance,
            data=request.data,
            context={"request": request}
        )
        serializer.is_valid(raise_exception=True)
        serializer.save(updated_by=request.user)

        return Response(
            {
                "message": "Contact information updated successfully",
                "data": serializer.data
            },
            status=status.HTTP_200_OK
        )

    @swagger_auto_schema(request_body=AgentContactInformationSerializer)
    def patch(self, request, pk):
        instance = get_object_or_404(AgentContactInformation, pk=pk)

        serializer = AgentContactInformationSerializer(
            instance,
            data=request.data,
            partial=True,
            context={"request": request}
        )
        serializer.is_valid(raise_exception=True)
        serializer.save(updated_by=request.user)

        return Response(
            {
                "message": "Contact information partially updated successfully",
                "data": serializer.data
            },
            status=status.HTTP_200_OK
        )

    def delete(self, request, pk):
        instance = get_object_or_404(AgentContactInformation, pk=pk)
        instance.delete()

        return Response(
            {"message": "Contact information deleted successfully"},
            status=status.HTTP_204_NO_CONTENT
        )
