import json
import os
from rest_framework.viewsets import GenericViewSet
from rest_framework.authentication import TokenAuthentication
from rest_framework.request import Request
from rest_framework.response import Response

from management.models.base import FilterAndSorting, objJsonDecode
from management.models.utente import Utente
from management.repositories.utente import UtenteRepository
from management.serializers.utente_serializer import UtenteSerializer
from management.utils.auth_token_decorator import requires_auth
from management.utils.error_handling import handle_exception


class UtenteAPIView(GenericViewSet):
    authentication_classes = [TokenAuthentication]
    _repository = UtenteRepository()
    
    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def get_item(self, request: Request, pk):

        try:
            query_set = Utente.objects.get(id=pk)   
            serializer = UtenteSerializer(query_set, many=False)        
            data = serializer.data

            return Response(data)
            
        except Exception as e:
            handle_exception(e)
    
    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def get_items(self, request: Request):
        try:
            args:FilterAndSorting = json.loads(request._request.body, object_hook=objJsonDecode)
            #data.field_name, data.filter_condition, data.filter_value

            query_set = self._repository.filtered(args)
       
            serializer = UtenteSerializer(query_set, many=True)        
            data = serializer.data

            return Response(data)
        except Exception as e:
            handle_exception(e)
