from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from django.core.paginator import Paginator
from webapp.models.koleksi import Disposisi
from .serializers import DisposisiSerializer


class DisposisiViewSet(viewsets.ModelViewSet):
    """CRUD Disposisi pakai serializer + custom pagination"""
    queryset = Disposisi.objects.all().order_by("-created")
    serializer_class = DisposisiSerializer
    permission_classes = [IsAuthenticated]

    def perform_create(self, serializer):
        # inject user_input otomatis
        user_id = getattr(self.request.user, "pk", None) or self.request.session.get("pk")
        serializer.save(user_input=user_id)

    def list(self, request, *args, **kwargs):
        try:
            queryset = self.get_queryset()

            # ambil param paging
            page = int(request.GET.get("page", 1))
            page_size = int(request.GET.get("page_size", 8))

            paginator = Paginator(queryset, page_size)
            paging = paginator.get_page(page)

            serializer = self.get_serializer(paging, many=True)

            next_page = paging.next_page_number() if paging.has_next() else None
            prev_page = paging.previous_page_number() if paging.has_previous() else None

            return Response({
                "count": paginator.count,
                "num_pages": paginator.num_pages,
                "page_size": page_size,
                "next": f"{request.build_absolute_uri('?page=')}{next_page}" if next_page else None,
                "previous": f"{request.build_absolute_uri('?page=')}{prev_page}" if prev_page else None,
                "results": serializer.data,
            }, status=status.HTTP_200_OK)

        except Exception as e:
            return Response(
                {"error": f"Gagal mengambil daftar Disposisi: {str(e)}"},
                status=status.HTTP_400_BAD_REQUEST
            )

    def create(self, request, *args, **kwargs):
        try:
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            self.perform_create(serializer)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        except Exception as e:
            return Response(
                {"error": f"Gagal membuat Disposisi: {str(e)}"},
                status=status.HTTP_400_BAD_REQUEST
            )

    def update(self, request, *args, **kwargs):
        try:
            partial = kwargs.pop("partial", False)  # support PATCH
            instance = self.get_object()
            serializer = self.get_serializer(instance, data=request.data, partial=partial)
            serializer.is_valid(raise_exception=True)
            self.perform_update(serializer)
            return Response(serializer.data, status=status.HTTP_200_OK)
        except Exception as e:
            return Response(
                {"error": f"Gagal update Disposisi: {str(e)}"},
                status=status.HTTP_400_BAD_REQUEST
            )

    def destroy(self, request, *args, **kwargs):
        try:
            instance = self.get_object()
            self.perform_destroy(instance)
            return Response(
                {"message": "Disposisi berhasil dihapus"},
                status=status.HTTP_204_NO_CONTENT
            )
        except Exception as e:
            return Response(
                {"error": f"Gagal menghapus Disposisi: {str(e)}"},
                status=status.HTTP_400_BAD_REQUEST
            )
