from rest_framework import viewsets, permissions, status
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework.permissions import AllowAny, IsAuthenticated
from job.models import Job, JobPosting
from job.api.serializers import JobSerializer, JobCreateSerializer, JobPostingSerializer
from public.permissions import IsAdminOrReadOnly


class JobViewSet(viewsets.ModelViewSet):
    serializer_class = JobSerializer
    permission_classes = [AllowAny]
    lookup_field = 'slug'  # Use slug instead of pk for detail routes
    lookup_url_kwarg = 'slug'

    def get_queryset(self):
        """
        Return jobs based on user role:
        - Admin: all jobs (status=True or False)
        - Regular users: only published jobs (status=True)
        """
        queryset = Job.objects.all()
        
        # If user is admin (staff and superuser), return all jobs
        if self.request.user and self.request.user.is_staff and self.request.user.is_superuser:
            return queryset
        
        # For regular users and anonymous users, return only active jobs
        return queryset.filter(status=True)

    def get_serializer_class(self):
        """Use different serializers for different actions"""
        if self.action == 'create':
            return JobCreateSerializer
        return JobSerializer

    def create(self, request, *args, **kwargs):
        """Override create to handle both single and multiple hire"""
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        
        # Create job(s) - can be single or list
        result = serializer.save()
        
        # If multiple jobs created, return them all
        if isinstance(result, list):
            output_serializer = JobSerializer(result, many=True)
            return Response(output_serializer.data, status=status.HTTP_201_CREATED)
        else:
            output_serializer = JobSerializer(result)
            return Response(output_serializer.data, status=status.HTTP_201_CREATED)

    def get_permissions(self):
        """
        Allow anyone to view and create jobs (list, retrieve)
        Allow only admins to update/delete
        """
        if self.action in ['list', 'retrieve', 'create']:
            return [AllowAny()]
        # Update, delete, and other actions require admin
        return [IsAdminOrReadOnly()]
    
    @action(detail=False, methods=['get'])
    def by_company(self, request):
        """Get all jobs by a specific company name"""
        company_name = request.query_params.get('company_name')
        if not company_name:
            return Response({'error': 'company_name parameter is required'}, status=status.HTTP_400_BAD_REQUEST)
        
        # Use get_queryset to apply admin/user filtering
        jobs = self.get_queryset().filter(CompanyName__icontains=company_name)
        serializer = self.get_serializer(jobs, many=True)
        return Response(serializer.data)
    
    @action(detail=False, methods=['get'])
    def by_country(self, request):
        """Get all jobs by a specific country"""
        country = request.query_params.get('country')
        if not country:
            return Response({'error': 'country parameter is required'}, status=status.HTTP_400_BAD_REQUEST)
        
        # Use get_queryset to apply admin/user filtering
        jobs = self.get_queryset().filter(CompanyCountry__icontains=country)
        serializer = self.get_serializer(jobs, many=True)
        return Response(serializer.data)
