from core.views import BaseListCreateView
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import AllowAny, IsAdminUser, IsAuthenticated
from drf_spectacular.utils import (
    extend_schema,
    OpenApiExample,
    OpenApiParameter,
    OpenApiResponse,
)
from drf_spectacular.types import OpenApiTypes
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import generics
from contact.models import ContactMessage
from contact.serializers import ContactMessageSerializer
from core.filters import ContactMessageFilter


@extend_schema(
    tags=["Contact"],
    summary="List all contact messages",
    description="Admin-only. Returns a paginated, filterable list of all contact messages.",
    responses={200: ContactMessageSerializer(many=True)},
)
class ContactMessageListView(BaseListCreateView):
    serializer_class = ContactMessageSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_class = ContactMessageFilter

    def initialize_request(self, request, *args, **kwargs):
        self._http_method = request.method
        return super().initialize_request(request, *args, **kwargs)

    def get_permissions(self):
        if self.request.method == "GET":
            return [IsAdminUser()]
        return []

    def get_authenticators(self):
        if self._http_method == "POST":
            return []
        return super().get_authenticators()

    def get_queryset(self):
        return ContactMessage.objects.all().order_by("-created_at")


@extend_schema(tags=["Contact"])
class ContactMessageDetailView(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = ContactMessageSerializer
    permission_classes = [IsAdminUser]
    queryset = ContactMessage.objects.all()
    http_method_names = ['get', 'patch', 'delete']

    @extend_schema(
        request={
            'application/json': {
                'type': 'object',
                'properties': {
                    'status': {'type': 'string', 'enum': ['unread', 'read', 'replied', 'archived', 'spam']},
                },
            }
        },
    )
    def patch(self, request, *args, **kwargs):
        return super().patch(request, *args, **kwargs)