from typing import Optional, Tuple

from rest_framework import serializers


from ..models import (Administre, Decision, DecisionChoices, DecisionTree,
                      FormationEmploi, Poste, FMOB, Administres_Pams)
from ..utils.attributes import safe_rgetattr
from ..utils.decisions import KEY_CREATE, KEY_UPDATE, get_available_decisions
from ..utils.permissions import (KEY_READ, KEY_WRITE, Profiles,
                                 get_profiles_by_adm)
from .commun import AssignmentState
from .fmob import FmobSerializer
from .fonction import FonctionSerializer
from .formation_emploi import FormationEmploiSerializer
from .grade import GradeSerializer
from .sous_vivier import SousVivierSerializer

CTX_KEY_DECISIONS = 'decisions'
CTX_KEY_PROFILES = 'profiles'


class AdministreSerializer(serializers.ModelSerializer):
    """
    Cette classe sera responsable de la conversion des objets administres en type json contenant les champs de l'administré
    et les champs de fonction, formation_emploi, sous_vivier, decisions, grade et Fmob  liés à chaque administré. Cette classe va également ordonner le json par a_id_sap.
    Les variables qui seront affichées dans le json sont celles mentionnées dans la variable fields.
    """


    a_id_sap = serializers.ReadOnlyField()
    formation_emploi = FormationEmploiSerializer(read_only=True)
    sous_vivier = SousVivierSerializer(read_only=True)
    sous_vivier_id = serializers.IntegerField(write_only=True, allow_null=True)
    fonction = FonctionSerializer(read_only=True)
    grade = GradeSerializer(read_only=True)

    class Meta:
        model = Administre
        ordering = [Administre.Cols.PK]
        fields = '__all__'
