# webapp/api/disp/views.py
from rest_framework import viewsets, status
from rest_framework.response import Response
from django.core.paginator import Paginator
from django.shortcuts import get_object_or_404
from webapp.models.koleksi import Disposisi
from rest_framework.permissions import IsAuthenticated



class DisposisiViewSet(viewsets.ViewSet):
    """List, Create, Retrieve, Update, Delete Disposisi"""
    permission_classes = [IsAuthenticated]

    def list(self, request):
        """GET /api/disposisi/"""
        query = Disposisi.objects.all().order_by("-created")

        page = int(request.GET.get("page", 1))
        page_size = int(request.GET.get("page_size", 8))
        paginator = Paginator(query, page_size)
        paging = paginator.get_page(page)

        result = []
        for item in paging:
            result.append({
                "id": item.pk,  # 👈 tetap expose id meskipun fieldnya pk
                "pk_surat": item.pk_surat,
                "tanggal": item.tanggal,
                "sifat": item.sifat,
                "kepada": item.kepada,
                "catatan": item.catatan,
                "created": item.created,
                "updated": item.updated,
                "user_input": item.user_input,
            })

        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,
            "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,
            "page_size": page_size,
            "results": result,
        })

    def create(self, request):
        """POST /api/disposisi/"""
        try:
            obj = Disposisi.objects.create(**request.data)
            return Response({"id": obj.pk, "message": "created"}, status=status.HTTP_201_CREATED)
        except Exception as e:
            return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)

    def retrieve(self, request, pk=None):
        """GET /api/disposisi/{id}/"""
        obj = get_object_or_404(Disposisi, pk=pk)
        data = {
            "id": obj.pk,
            "pk_surat": obj.pk_surat,
            "tanggal": obj.tanggal,
            "sifat": obj.sifat,
            "kepada": obj.kepada,
            "catatan": obj.catatan,
            "created": obj.created,
            "updated": obj.updated,
            "user_input": obj.user_input,
        }
        return Response(data)

    def update(self, request, pk=None):
        """PUT /api/disposisi/{id}/"""
        try:
            obj = get_object_or_404(Disposisi, pk=pk)
            for field, value in request.data.items():
                setattr(obj, field, value)
            obj.save()
            return Response({"id": obj.pk, "message": "updated"})
        except Exception as e:
            return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)

    def destroy(self, request, pk=None):
        """DELETE /api/disposisi/{id}/"""
        try:
            obj = get_object_or_404(Disposisi, pk=pk)
            obj.delete()
            return Response({"message": "deleted"}, status=status.HTTP_204_NO_CONTENT)
        except Exception as e:
            return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
