from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
# from rest_framework.pagination import PageNumberPagination
from rest_framework.exceptions import ValidationError, NotFound
from drf_yasg.utils import swagger_auto_schema
from django.shortcuts import get_object_or_404
from common.permission import HasActivePackage

from jobs_company.models.jobs import Jobs
from jobs_company.serializers.jobs_serializer import JobsDropdownSerializer, JobsSerializer
from common.pagination.custom_pagination import CustomPageNumberPagination
from common.exceptions.exceptions import custom_exception_handler

from rest_framework.parsers import MultiPartParser, FormParser
from drf_yasg import openapi
from rest_framework.permissions import AllowAny
from rest_framework.permissions import IsAuthenticated

from package_details.utils import get_user_total_space_used
from user_ads_package.utils import check_and_notify_low_space_users
from user_ads_package.models import UserPackage 

class JobsSearchAPIView(APIView):
   
    permission_classes = [AllowAny]
    
    @swagger_auto_schema(
        operation_description="Search jobs by title, country, and state",
        manual_parameters=[
            openapi.Parameter('title', openapi.IN_QUERY, description="Search by job title", type=openapi.TYPE_STRING),
            openapi.Parameter('country', openapi.IN_QUERY, description="Filter by country", type=openapi.TYPE_STRING),
            openapi.Parameter('state', openapi.IN_QUERY, description="Filter by state", type=openapi.TYPE_STRING),
            openapi.Parameter('page', openapi.IN_QUERY, description="Page number", type=openapi.TYPE_INTEGER),
            openapi.Parameter('count', openapi.IN_QUERY, description="Items per page", type=openapi.TYPE_INTEGER),
        ]
    )
    def get(self, request):
        try:
            jobs = Jobs.objects.filter(is_active=True)\
                .select_related('company', 'category', 'created_by')
            
            title = self.request.query_params.get('title')
            country = self.request.query_params.get('country')
            state = self.request.query_params.get('state')
            
            if title:
                jobs = jobs.filter(title__icontains=title)
            
            if country:
                jobs = jobs.filter(country__icontains=country)
            
            if state:
                jobs = jobs.filter(state__icontains=state)
            
            # Paginate results
            paginator = CustomPageNumberPagination()
            result_page = paginator.paginate_queryset(jobs, request)
            serializer = JobsSerializer(result_page, many=True, context={'request': request})
            
            return paginator.get_paginated_response(serializer.data)
            
        except Exception as e:
            return custom_exception_handler(e, context={})

class JobsPublicListAPIView(APIView):
    """Public endpoint to list all jobs for website users"""
    
    def get(self, request):
        service = Jobs.objects.filter(is_active=True).select_related('created_by')
        
        job_query = self.request.query_params.get('company')
        category_query = self.request.query_params.get('category')
        job_title = self.request.query_params.get('title')
        job_location = self.request.query_params.get('location')
        job_type = self.request.query_params.get('type')
        sub_category = request.query_params.get('sub_category')
        
        if job_query:
            service = service.filter(company_id=job_query)
        elif category_query:
            service = service.filter(category_id=category_query)
        elif job_type:
            service = service.filter(type=job_type)
        elif job_title:
            service = service.filter(title__icontains=job_title)
        elif job_location:
            service = service.filter(location__icontains=job_location)
        elif sub_category and sub_category.lower() != 'null':
            service = service.filter(sub_category__id=sub_category)
            
        paginator = CustomPageNumberPagination()
        result_page = paginator.paginate_queryset(service, request)
        serializer = JobsSerializer(result_page, many=True, context={'request': request})
        return paginator.get_paginated_response(serializer.data)


class JobsListCreateAPIView(APIView):
    parser_classes = [MultiPartParser, FormParser]
    permission_classes = [IsAuthenticated, HasActivePackage]  
    
    @swagger_auto_schema(request_body=JobsSerializer)
    # def post(self, request):
    #     serializer = JobsSerializer(data=request.data, context={'request': request})
    #     serializer.is_valid(raise_exception=True)
    #     serializer.save(created_by=request.user)
    #     return Response({"success": "Jobs created successfully"}, status=status.HTTP_201_CREATED)

    def post(self, request):
        user = request.user

        # ✅ Allow admins or superusers without restriction
        if user.is_superuser or user.is_staff:
            serializer = JobsSerializer(data=request.data, context={'request': request})
            serializer.is_valid(raise_exception=True)
            serializer.save(created_by=user)
            return Response({"success": "Job created successfully"}, status=status.HTTP_201_CREATED)

        # ✅ Check if user has an active package
        user_package = (
        UserPackage.objects.filter(user=user)
        .order_by('-end_date')
        .first()
        )
        if not user_package:
            return Response(
                {"error": "You do not have an active package to post jobs."},
                status=status.HTTP_400_BAD_REQUEST,
            )
        package = user_package.package
        # ✅ Check storage usage
        used = get_user_total_space_used(user)
        limit = float(package.space)

        if used >= limit:
            return Response(
                {
                    "error": f"You've reached your storage limit ({used:.2f} MB of {limit:.2f} MB). "
                             "Please upgrade your package."
                },
                status=status.HTTP_400_BAD_REQUEST,
            )

        # ✅ Save job post (enough space)
        serializer = JobsSerializer(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        serializer.save(created_by=user)

        # ⚠️ Check & notify if low on space
        check_and_notify_low_space_users(user)

        return Response(
            {"success": "Job created successfully"},
            status=status.HTTP_201_CREATED
        )
    
    def get(self, request):
        service = Jobs.objects.filter(is_active=True).select_related('created_by')  # Add created_by for user filtering
        
        user = request.user
        if user.role == 'admin':
            pass
        else:
            service = service.filter(created_by=user)
        
        job_query = self.request.query_params.get('company')
        category_query = self.request.query_params.get('category')
        job_title = self.request.query_params.get('title')
        job_location = self.request.query_params.get('location')
        job_type = self.request.query_params.get('type')
        country = self.request.query_params.get('country')
        sub_category = request.query_params.get('sub_category')
        
        if country:
            service = service.filter(country__icontains=country)
        if job_query:
            service = service.filter(company_id=job_query)
        elif category_query:
            service = service.filter(category_id=category_query)
        elif job_type:
            service = service.filter(type=job_type)
        elif job_title:
            service = service.filter(title__icontains=job_title) #contains title keyword
        elif job_location:
            service = service.filter(location__icontains=job_location)
        elif sub_category:
            service = service.filter(sub_category__id=sub_category)
            
        paginator = CustomPageNumberPagination()
        result_page = paginator.paginate_queryset(service, request)
        serializer = JobsSerializer(result_page, many=True, context={'request': request})
        return paginator.get_paginated_response(serializer.data)    

class JobsDetailAPIView(APIView):
    parser_classes = [MultiPartParser, FormParser]
    
    @swagger_auto_schema(request_body=JobsSerializer)
    def put(self, request, pk):
        service = get_object_or_404(Jobs, pk=pk)
        serializer = JobsSerializer(service, data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({"success": "Jobs updated successfully"}, status=status.HTTP_200_OK)

    def get(self, request, pk):
        service = get_object_or_404(Jobs, pk=pk)
        serializer = JobsSerializer(service, context={'request': request})
        return Response(serializer.data)

    def delete(self, request, pk):
        service = get_object_or_404(Jobs, pk=pk)
        service.soft_delete()
        return Response({"success": "Jobs deleted successfully"}, status=status.HTTP_200_OK)
    

class JobsAPIView(APIView):
    parser_classes = [MultiPartParser, FormParser]
    
    def get(self, request):
        service = Jobs.objects.filter(is_active=True).order_by('-id').prefetch_related("company").select_related("company",'category')
        # job_query = self.request.query_params.get('company')
        # category_query = self.request.query_params.get('category')
        # job_title = self.request.query_params.get('title')
        # job_location = self.request.query_params.get('location')
        # job_type = self.request.query_params.get('type')
        # if job_query:
        #     service = service.filter(company_id=job_query)
        # elif category_query:
        #     service = service.filter(category_id=category_query)
        # elif job_type:
        #     service = service.filter(type=job_type)
        # elif job_title:
        #     service = service.filter(title__icontains=job_title) #contains title keyword
        # elif job_location:
        #     service = service.filter(location__icontains=job_location)
        paginator = CustomPageNumberPagination()
        result_page = paginator.paginate_queryset(service, request)
        serializer = JobsDropdownSerializer(result_page, many=True, context={'request': request})
        return paginator.get_paginated_response(serializer.data)