from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiExample
from webapp.models import koleksi as m_koleksi
from .serializers import CategorySerializer


@extend_schema_view(
    list=extend_schema(
        tags=["Category Management"],
        summary="Daftar semua kategori (recursive)",
        description="Mengambil semua kategori secara hierarkis dari root menggunakan method `_recursive`.",
        responses={200: CategorySerializer(many=True)},
    ),
    retrieve=extend_schema(
        tags=["Category Management"],
        summary="Detail kategori",
        description="Menampilkan satu kategori berdasarkan ID, menggunakan `_read_one`.",
        responses={200: CategorySerializer},
    ),
    create=extend_schema(
        tags=["Category Management"],
        summary="Tambah kategori",
        description="Menambah kategori baru menggunakan method `_create` dari model.",
        request=CategorySerializer,
        responses={201: OpenApiExample("Berhasil", value={"detail": "Berhasil menyimpan data."})},
    ),
    update=extend_schema(
        tags=["Category Management"],
        summary="Update kategori",
        description="Mengubah data kategori menggunakan method `_update` dari model.",
        request=CategorySerializer,
        responses={200: OpenApiExample("Berhasil", value={"detail": "Berhasil mengubah data."})},
    ),
    destroy=extend_schema(
        tags=["Category Management"],
        summary="Hapus kategori",
        description="Menghapus kategori beserta anak-anaknya menggunakan `_delete_recursive`.",
        responses={204: OpenApiExample("Berhasil", value={"detail": "Berhasil hapus data."})},
    ),
)
class CategoryViewSet(viewsets.ViewSet):
    """
    ViewSet kategori yang mengikuti logic lama (bukan langsung ORM),
    tapi lewat method custom di model.
    """

    permission_classes = [IsAuthenticatedOrReadOnly]

    def list(self, request):
        data = m_koleksi.Categories._recursive(pk_parent=0)
        return Response(data, status=status.HTTP_200_OK)

    def retrieve(self, request, pk=None):
        data = m_koleksi.Categories._read_one(pk=pk)
        if not data:
            return Response({"detail": "Kategori tidak ditemukan."}, status=status.HTTP_404_NOT_FOUND)
        return Response(data, status=status.HTTP_200_OK)

    def create(self, request):
        values = {k: v for k, v in request.data.items()}
        try:
            m_koleksi.Categories._create(**values)
            return Response({"detail": "Berhasil menyimpan data."}, status=status.HTTP_201_CREATED)
        except Exception as e:
            return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST)

    def update(self, request, pk=None):
        values = {k: v for k, v in request.data.items()}
        keys = {"pk": pk}
        try:
            m_koleksi.Categories._update(values, keys)
            return Response({"detail": "Berhasil mengubah data."}, status=status.HTTP_200_OK)
        except Exception as e:
            return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST)

    def destroy(self, request, pk=None):
        try:
            m_koleksi.Categories._delete_recursive(pk)
            return Response({"detail": "Berhasil hapus data."}, status=status.HTTP_204_NO_CONTENT)
        except Exception as e:
            return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST)
