from rest_framework.permissions import IsAuthenticated
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.views import APIView

from ..models import PcpFeGroupe, SousVivier, FormationEmploi
from ..serializers.current_user import (CTX_KEY_PCP_FE_GROUPE,
                                        CTX_KEY_PROFILES, CTX_KEY_SOUS_VIVIERS,
                                        CTX_KEY_FORMATION_EMPLOIS, CTX_KEY_SOUS_VIVIERS_SUPER,
                                        UserInfoSerializer)
from ..utils.decorators import class_logger
from ..utils.permissions import KEY_READ, Profiles, get_profile_summary
from .commun import execution_time_viewset, query_count_viewset


@class_logger
@execution_time_viewset
@query_count_viewset
class CurrentUserView(APIView):
    """
    Cette classe est dédiée au vue de l'utilisateur courant:
    """

    permission_classes = [IsAuthenticated]

    # TODO adapter au nouveau système de gestion de profils
    def get(self, request: Request) -> Response:
        """
        Renvoie les informations de l'utilisateur connecté.

        :param request: requête contenant l'utilisateur authentifié
        :type request: class:`rest_framework.request.Request`

        :return: réponse contenant les informations de l'utilisateur dont la formation emploi group et les sous-viviers specifiques à cet utilisateur.
        :rtype: class:`rest_framework.response.Response`
        """
        user = request.user
        summary = get_profile_summary(request.user)
        profiles = summary.profiles.get(KEY_READ, ())
        return Response(UserInfoSerializer(user, context={
            # CTX_KEY_SOUS_VIVIERS_SUPER: SousVivier.objects.all() if Profiles.SUPER in profiles else None,
            CTX_KEY_SOUS_VIVIERS: SousVivier.objects.filter(gestionnaires__id=request.user.id),
            CTX_KEY_FORMATION_EMPLOIS: FormationEmploi.objects.filter(gestionnaires__id=request.user.id).order_by('fe_mere_credo').distinct('fe_mere_credo'),
            CTX_KEY_PCP_FE_GROUPE: PcpFeGroupe.objects.filter(gestionnaire_id=user.pk).first(),
            CTX_KEY_PROFILES: summary.profiles
        }).data)
