from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated, IsAdminUser
from django.utils import timezone
from .models import Event, EventCategory
from .serializers import EventSerializer, EventListSerializer, EventCategorySerializer


class EventCategoryViewSet(viewsets.ModelViewSet):
    queryset = EventCategory.objects.all()
    serializer_class = EventCategorySerializer
    permission_classes = [IsAuthenticated]


class EventViewSet(viewsets.ModelViewSet):
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        qs = Event.objects.select_related('category', 'parent_event').order_by('start_date')
        is_active = self.request.query_params.get('is_active')
        is_archived = self.request.query_params.get('is_archived')
        is_registerable = self.request.query_params.get('is_registerable')
        category = self.request.query_params.get('category')
        search = self.request.query_params.get('search')

        if is_active is not None:
            qs = qs.filter(is_active=is_active.lower() == 'true')
        if is_archived is not None:
            qs = qs.filter(is_archived=is_archived.lower() == 'true')
        if is_registerable is not None:
            qs = qs.filter(is_registerable=is_registerable.lower() == 'true')
        if category:
            qs = qs.filter(category__code=category)
        if search:
            qs = qs.filter(name__icontains=search)
        return qs

    def get_serializer_class(self):
        if self.action == 'list':
            return EventListSerializer
        return EventSerializer

    def get_permissions(self):
        if self.action in ['list', 'retrieve']:
            return [IsAuthenticated()]
        return [IsAdminUser()]

    @action(detail=True, methods=['post'], permission_classes=[IsAdminUser])
    def archive(self, request, pk=None):
        from apps.attendance.models import ScannerAssignment
        event = self.get_object()
        event.archive()
        ScannerAssignment.objects.filter(event=event).update(is_active=False)
        return Response({'status': 'archived', 'event': EventSerializer(event).data})

    @action(detail=True, methods=['post'], permission_classes=[IsAdminUser])
    def unarchive(self, request, pk=None):
        event = self.get_object()
        event.unarchive()
        return Response({'status': 'unarchived', 'event': EventSerializer(event).data})
