# webapp/api/users/views.py

from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiExample

from webapp.models import master as m_master
from .serializers import (
    UserCreateSerializer,
    UserUpdateSerializer,
)

@extend_schema_view(
    list=extend_schema(
        tags=["User Management"],
        summary="List semua user",
        description="Mengembalikan daftar semua user beserta informasi role.",
        responses={200: UserUpdateSerializer(many=True)},
    ),
    retrieve=extend_schema(
        tags=["User Management"],
        summary="Detail user",
        description="Mengembalikan detail informasi 1 user berdasarkan ID.",
        responses={200: UserUpdateSerializer},
    ),
    create=extend_schema(
        tags=["User Management"],
        summary="Buat user baru",
        description="Menambahkan user baru dengan username, password, dan role.",
        request=UserCreateSerializer,
        responses={
            201: OpenApiExample(
                "Contoh sukses",
                value={
                    "_pk": 10,
                    "usr": "johndoe",
                    "pk_roles": {"_pk": 2, "role": "staff", "note": "Role staff"},
                },
                response_only=True,
            )
        },
    ),
    update=extend_schema(
        tags=["User Management"],
        summary="Update user",
        description="Update data user. Jika ingin ganti password, wajib kirim password lama, password baru, dan konfirmasi password baru.",
        request=UserUpdateSerializer,
        responses={200: UserUpdateSerializer},
    ),
    partial_update=extend_schema(
        tags=["User Management"],
        summary="Partial update user",
        description="Update sebagian data user.",
        request=UserUpdateSerializer,
        responses={200: UserUpdateSerializer},
    ),
    destroy=extend_schema(
        tags=["User Management"],
        summary="Hapus user",
        description="Menghapus user berdasarkan ID. **Tidak bisa menghapus diri sendiri.**",
        responses={
            204: OpenApiExample(
                "Hapus sukses",
                value={"detail": "User berhasil dihapus."},
                response_only=True,
            ),
            400: OpenApiExample(
                "Hapus gagal",
                value={"detail": "Tidak bisa menghapus diri sendiri."},
                response_only=True,
            ),
        },
    ),
)
class UserViewSet(viewsets.ModelViewSet):
    queryset = m_master.Users.objects.all().select_related("pk_roles")
    permission_classes = [IsAuthenticated]

    def get_serializer_class(self):
        if self.action == "create":
            return UserCreateSerializer
        elif self.action in ["update", "partial_update"]:
            return UserUpdateSerializer
        return UserUpdateSerializer  # default untuk list/retrieve

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        if str(instance._pk) == str(request.user.pk):
            return Response(
                {"detail": "Tidak bisa menghapus diri sendiri."},
                status=status.HTTP_400_BAD_REQUEST,
            )
        return super().destroy(request, *args, **kwargs)
