from rest_framework import serializers

from ..models import CustomUser, SousVivier, FormationEmploi
from ..utils.permissions import KEY_READ, KEY_WRITE
from .pcp_fe_groupe import PcpFeGroupeSerializer

CTX_KEY_SOUS_VIVIERS_SUPER = 'sous_viviers_super'
CTX_KEY_SOUS_VIVIERS       = 'sous_viviers'
CTX_KEY_FORMATION_EMPLOIS  = 'formation_emplois'
CTX_KEY_PCP_FE_GROUPE      = 'fe_groupe'
CTX_KEY_PROFILES           = 'profiles'


class _SousVivierUserSerializer(serializers.ModelSerializer):
    """ Classe de représentation d'un sous-vivier de l'utilisateur """

    class Meta:
        model = SousVivier
        exclude = ('gestionnaires',)

    def to_representation(self, instance):
        res = super().to_representation(instance)
        ids_super = self.context.get(CTX_KEY_SOUS_VIVIERS_SUPER)
        if ids_super and instance.pk in ids_super:
            res['admin'] = True
        return res


class _FormationEmploiUserSerializer(serializers.ModelSerializer):
    """ Classe de représentation d'un sous-vivier de l'utilisateur """

    class Meta:
        model = FormationEmploi
        fields = [FormationEmploi.Cols.PK, FormationEmploi.Cols.LIBELLE, 'fe_mere_credo', 'fe_mere_la', 'gestionnaire_id']

    gestionnaire_id = serializers.ReadOnlyField()

    def to_representation(self, instance):
        res = super().to_representation(instance)
        return res


class UserInfoSerializer(serializers.ModelSerializer):
    """ Gère la forme publique de l'utilisateur connecté. """

    class Meta:
        model = CustomUser
        fields = ['id', 'username', 'first_name', 'last_name', 'email', 'grade', 'administre']

    administre = serializers.ReadOnlyField(source='administre_id')

    def to_representation(self, instance):
        res = super().to_representation(instance)

        svs_super = self.context.get(CTX_KEY_SOUS_VIVIERS_SUPER) or ()
        svs = self.context.get(CTX_KEY_SOUS_VIVIERS) or ()
        fes = self.context.get(CTX_KEY_FORMATION_EMPLOIS) or ()
        all_svs = set(list(svs) + list(svs_super))
        all_fes = set(list(fes))
        svs_ids_specific_super = {sv.pk for sv in svs_super if sv not in svs}

        res['sous_viviers'] = _SousVivierUserSerializer(all_svs, many=True, context={
            CTX_KEY_SOUS_VIVIERS_SUPER: svs_ids_specific_super
        }).data

        res['formation_emplois'] = _FormationEmploiUserSerializer(all_fes, many=True).data

        res['fe_groupe'] = PcpFeGroupeSerializer(self.context.get(CTX_KEY_PCP_FE_GROUPE) or ()).data

        profiles = self.context.get(CTX_KEY_PROFILES) or {}
        res['profils'] = {'lecture': profiles.get(KEY_READ) or (), 'ecriture': profiles.get(KEY_WRITE) or ()}
        return res
