from rest_framework import generics, permissions
from rest_framework.permissions import IsAuthenticated
from notification.models import Notification
from service_report.models.service_report import ServiceReport
from service_report.serializers.service_report_serializer import ServiceReportSerializer
from rest_framework.authentication import TokenAuthentication
from drf_yasg.utils import swagger_auto_schema
from rest_framework.parsers import MultiPartParser, FormParser


class ServiceReportView(generics.ListCreateAPIView):
    serializer_class = ServiceReportSerializer
    queryset = ServiceReport.objects.all()
    authentication_classes = [TokenAuthentication]
    parser_classes = [MultiPartParser, FormParser]

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


    def perform_create(self, serializer):
        instance = serializer.save(reported_by=self.request.user)
        
        service = instance.service
        message = getattr(instance, 'message', '') or getattr(instance, 'reason', '') or 'Service reported'
        
        Notification.objects.create(
            notification_type='service_report',
            service_report_id=service.id,  
            title=f'Service Reported: {getattr(service, "title", getattr(service, "name", "Service"))} (ID: {service.id})',
            message=message,
            status='unread'
        )


class ServiceReportDetailView(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = ServiceReportSerializer
    queryset = ServiceReport.objects.all()
    lookup_field = 'pk'
    # permission_classes = [permissions.IsAuthenticated]
    # authentication_classes = [TokenAuthentication]

    @swagger_auto_schema(
        security=[{'Token': []}],
        operation_description="Retrieve, update, or delete a service report."
    )
    def get(self, request, *args, **kwargs):
        return super().get(request, *args, **kwargs)