from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.exceptions import ValidationError, NotFound
from drf_yasg.utils import swagger_auto_schema
from django.shortcuts import get_object_or_404

from package_points.models.package_points import PackagePoints
from package_points.serializers.pakcage_points_serializer import PackagePointsSerializer
from common.pagination.custom_pagination import CustomPageNumberPagination
from common.exceptions.exceptions import custom_exception_handler

class PackagePointsListCreateAPIView(APIView):
    @swagger_auto_schema(request_body=PackagePointsSerializer)
    def post(self, request):
        serializer = PackagePointsSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({"success": "Package point created successfully"}, status=status.HTTP_201_CREATED)
    
    def get(self, request):
        categories = PackagePoints.objects.all().select_related('package','package_points')
        paginator = CustomPageNumberPagination()
        result_page = paginator.paginate_queryset(categories, request)
        serializer = PackagePointsSerializer(result_page, many=True)
        return paginator.get_paginated_response(serializer.data)
    

class PackagePointsDetailAPIView(APIView):    
    @swagger_auto_schema(request_body=PackagePointsSerializer)
    def put(self, request, pk):
        category = get_object_or_404(PackagePoints, pk=pk)
        serializer = PackagePointsSerializer(category, data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({"success": "Package point updated successfully"}, status=status.HTTP_200_OK)

    def get(self, request, pk):
        category = get_object_or_404(PackagePoints.objects.all().select_related('package','package_points'), pk=pk)
        serializer = PackagePointsSerializer(category)
        return Response(serializer.data)

    def delete(self, request, pk):
        category = get_object_or_404(PackagePoints, pk=pk)
        category.delete()
        return Response({"success": "Package point deleted successfully"}, status=status.HTTP_200_OK)
    