from drf_spectacular.utils import extend_schema, extend_schema_view
from iems_backend.viewsets import NoPutCRUDViewSet
from users.permissions import IsAdminOrReadOnly, is_admin_user

from checkpoint.models import FacilityType, CheckPoint
from checkpoint.serializers import FacilityTypeSerializer, CheckPointSerializer


@extend_schema_view(
    list=extend_schema(tags=["Facility Types"], summary="List all Facility Types"),
    retrieve=extend_schema(tags=["Facility Types"], summary="Get a Facility Type"),
    create=extend_schema(tags=["Facility Types"], summary="Create a new Facility Type"),
    partial_update=extend_schema(
        tags=["Facility Types"], summary="Partially update a Facility Type"
    ),
    destroy=extend_schema(tags=["Facility Types"], summary="Delete a Facility Type"),
)
class FacilityTypeViewSet(NoPutCRUDViewSet):
    """
    CRUD API for Facility Types.
    Read access for all authenticated users. Write access requires admin role.
    """

    queryset = FacilityType.objects.all().order_by("-created_at")
    serializer_class = FacilityTypeSerializer
    permission_classes = [IsAdminOrReadOnly]


@extend_schema_view(
    list=extend_schema(tags=["CheckPoints"], summary="List all CheckPoints"),
    retrieve=extend_schema(tags=["CheckPoints"], summary="Get a CheckPoint"),
    create=extend_schema(tags=["CheckPoints"], summary="Create a new CheckPoint"),
    partial_update=extend_schema(
        tags=["CheckPoints"], summary="Partially update a CheckPoint"
    ),
    destroy=extend_schema(tags=["CheckPoints"], summary="Delete a CheckPoint"),
)
class CheckPointViewSet(NoPutCRUDViewSet):
    """
    CRUD API for CheckPoints.
    - Admin users can read all checkpoints.
    - Staff users can read only their own assigned checkpoint.
    Write access requires admin role.
    """

    queryset = CheckPoint.objects.select_related("facility_type").order_by(
        "-created_at"
    )
    serializer_class = CheckPointSerializer
    permission_classes = [IsAdminOrReadOnly]

    def get_queryset(self):
        queryset = super().get_queryset()
        current_user = self.request.user

        if is_admin_user(current_user):
            return queryset

        user_checkpoint = getattr(current_user, "checkpoint", None)
        if not user_checkpoint:
            return queryset.none()

        return queryset.filter(id=user_checkpoint.id)
