from django.db.models import Q
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from drf_yasg.utils import swagger_auto_schema
from common.pagination.custom_pagination import CustomPageNumberPagination
from jobs_company.models.jobs import JobContactInformation
from jobs_company.serializers.job_contact import JobContact


class JobContactInformationAPIView(APIView):
    @swagger_auto_schema(request_body=JobContact)
    def post(self, request):
        """Create job contact information"""
        serializer = JobContact(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(
            {"Success": "Job contact information created successfully"}, 
            status=status.HTTP_201_CREATED
        )
    
    def get(self, request):
        """
        Get job contact information
        - Admin: sees all contact information
        - Non-admin authenticated: sees contact info they created OR contact info for jobs they created
        - Anonymous: sees nothing
        """
        user = request.user
        
        # Check if user is authenticated
        if not user.is_authenticated:
            return Response(
                {"error": "Authentication required"}, 
                status=status.HTTP_401_UNAUTHORIZED
            )
        
        # Admin sees all job contact information
        if hasattr(user, 'role') and user.role == 'admin':
            contacts = JobContactInformation.objects.all()
        else:
            # Non-admin sees contact info they created OR contact info for jobs they created
            contacts = JobContactInformation.objects.filter(
                Q(created_by=user) | Q(job__created_by=user)
            )
        
        paginator = CustomPageNumberPagination()
        paginated_queryset = paginator.paginate_queryset(contacts, request)
        serializer = JobContact(paginated_queryset, many=True)
        return paginator.get_paginated_response(serializer.data)


class JobContactInformationDetailAPIView(APIView):
    def get_object(self, pk, user):
        """Get contact info if user has permission"""
        if not user.is_authenticated:
            return None
            
        try:
            contact = JobContactInformation.objects.get(pk=pk)
            if hasattr(user, 'role') and user.role == 'admin':
                return contact
            # Non-admin can see if they created it or created the job
            if contact.created_by == user or contact.job.created_by == user:
                return contact
            return None
        except JobContactInformation.DoesNotExist:
            return None
    
    def get(self, request, pk):
        """Get job contact information by ID"""
        if not request.user.is_authenticated:
            return Response(
                {"error": "Authentication required"}, 
                status=status.HTTP_401_UNAUTHORIZED
            )
            
        contact = self.get_object(pk, request.user)
        if not contact:
            return Response(
                {"error": "Job contact information not found or you don't have permission"}, 
                status=status.HTTP_404_NOT_FOUND
            )
        serializer = JobContact(contact)
        return Response(serializer.data, status=status.HTTP_200_OK)
    
    
    @swagger_auto_schema(request_body=JobContact)
    def patch(self, request, pk):
        """Partially update job contact information by ID"""
        if not request.user.is_authenticated:
            return Response(
                {"error": "Authentication required"}, 
                status=status.HTTP_401_UNAUTHORIZED
            )
            
        contact = self.get_object(pk, request.user)
        if not contact:
            return Response(
                {"error": "Job contact information not found or you don't have permission"}, 
                status=status.HTTP_404_NOT_FOUND
            )
        serializer = JobContact(contact, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(
            {"Success": "Job contact information updated successfully"}, 
            status=status.HTTP_200_OK
        )
    
    def delete(self, request, pk):
        if not request.user.is_authenticated:
            return Response(
                {"error": "Authentication required"}, 
                status=status.HTTP_401_UNAUTHORIZED
            )
            
        contact = self.get_object(pk, request.user)
        if not contact:
            return Response(
                {"error": "Job contact information not found or you don't have permission"}, 
                status=status.HTTP_404_NOT_FOUND
            )
        contact.delete()
        return Response(
            {"Success": "Job contact information deleted successfully"}, 
            status=status.HTTP_204_NO_CONTENT
        )