"""
Ce dossier contient tous les modèles de la base de données d'OGURE
"""
# Import
from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.translation import ugettext_lazy as _
from bulk_update_or_create import BulkUpdateOrCreateQuerySet

"""
    Script de création des diffferentes tables de la base
    OGURE NG utilisation de l'ORM de Django pour réaliser cette étape

"""


# Modéle des Sous viviers de militaires et poste
class SousVivier(models.Model):
    """Modèle des Sous viviers de militaires et poste
    """

    class Cols():
        """ Constantes pour les noms de colonnes """

        PK               = 'sv_id'
        LIBELLE          = 'sv_libelle'
        REL_GESTIONNAIRE = 'gestionnaire'

    sv_id = models.CharField(max_length=100, primary_key=True)
    gestionnaire = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True)
    sv_libelle = models.CharField(max_length=100)


# Modèle des Domaines
class Domaine(models.Model):
    """Modèle des Domaines
    """
    d_code = models.CharField(primary_key=True, max_length=100)
    d_libelle = models.CharField(max_length=100, null=True)

    def as_dict(self):
        return {
            "id": self.d_code,
            "code": self.d_code,
            "libelle": self.d_code,
        }


# Modèle des Filières
class Filiere(models.Model):
    """Modèle des Filières
    """
    f_code = models.CharField(primary_key=True, max_length=100)
    domaine = models.ForeignKey(Domaine, on_delete=models.SET_NULL, null=True)
    f_libelle_court = models.CharField(max_length=100, null=True)
    f_libelle_long = models.CharField(max_length=100, null=True)

    def as_dict(self):
        return {
            "id": self.f_code,
            "domaineId": self.domaine_id,
            "code": self.f_code,
            "libelle": self.f_code,
            "libelleCourt": self.f_code,
        }


# Modèle de l'association des sous-viviers à la catégorie et la filière
class SousVivierAssociation(models.Model):
    """Modèle de l'association des sous-viviers à la catégorie et la filière
    """
    CATEGORIE_CHOICES = [('MDR', 'MDR'), ('SOFF', 'SOFF'), ('OFF', 'OFF'), ('OGX', 'OGX')]

    sva_id = models.IntegerField(primary_key=True)
    sous_vivier = models.ForeignKey(SousVivier, on_delete=models.SET_NULL, null=True)
    filiere = models.ForeignKey(Filiere, on_delete=models.SET_NULL, null=True)
    sva_categorie = models.CharField(max_length=5, choices=CATEGORIE_CHOICES)
    sva_arme = models.CharField(max_length=20, null=True)


# Modèle des Grades
# FIXME le code grade et libellé sont inversés
class Grade(models.Model):
    """Modèle des Grades
    """
    gr_code = models.CharField(max_length=100, primary_key=True)
    gr_categorie = models.CharField(max_length=100, null=True)
    gr_ordre = models.IntegerField(null=True)

    def as_dict(self):
        return {
            "id": self.gr_code,
            "code": self.gr_code,
            # TODO corriger ci-dessous : catégorie (ex : "Sous-officiers"), libellé long (ex : "SERGENT CHEF") + ordre
            "categorie": self.gr_categorie,
            "ordre": self.gr_ordre
        }


# Modèle des Garnison
class Garnison(models.Model):
    """Modèle des Garnison
    """
    gar_id = models.CharField(max_length=100, primary_key=True)
    gar_lieu = models.CharField(max_length=100, verbose_name="Garnison")
    gar_code_postal = models.CharField(max_length=100, null=True)

    def __str__(self):
        return self.gar_lieu


# Modèle de groupe FE
class GroupeFe(models.Model):
    """Modèle de groupe FE
    """
    groupe_fe_nom = models.CharField(primary_key=True, max_length=100, verbose_name='Groupe de FE')

    def __str__(self):
        return self.groupe_fe_nom


# Modèle des Formation d'emplois
class FormationEmploi(models.Model):
    """Modèle des Formation d'emplois
    """

    class Cols():
        """ Constantes pour les noms de colonnes """

        PK           = 'fe_code'
        ZONE_DEFENSE = 'zone_defense'
        REL_GARNISON = 'garnison'
        REL_MERE     = 'mere'

    fe_code = models.CharField(primary_key=True, max_length=100)
    groupe_fe = models.ForeignKey(GroupeFe, blank=True, on_delete=models.SET_NULL, null=True)
    garnison = models.ForeignKey(Garnison, on_delete=models.CASCADE)
    fe_libelle = models.CharField(max_length=100)
    fe_taux_armement_cible_off = models.FloatField(null=True, verbose_name="TA cible OFF")
    fe_nb_poste_reo_off = models.IntegerField(null=True)
    fe_nb_poste_reevalue_off = models.IntegerField(null=True)
    fe_nb_poste_vacant_off = models.IntegerField(null=True)
    fe_nb_poste_occupe_off = models.IntegerField(null=True)
    fe_taux_armement_cible_soff = models.FloatField(null=True, verbose_name="TA cible SOFF")
    fe_nb_poste_reo_soff = models.IntegerField(null=True)
    fe_nb_poste_reevalue_soff = models.IntegerField(null=True)
    fe_nb_poste_vacant_soff = models.IntegerField(null=True)
    fe_nb_poste_occupe_soff = models.IntegerField(null=True)
    fe_taux_armement_cible_mdr = models.FloatField(null=True, verbose_name="TA cible MDR")
    fe_nb_poste_reo_mdr = models.IntegerField(null=True)
    fe_nb_poste_reevalue_mdr = models.IntegerField(null=True)
    fe_nb_poste_vacant_mdr = models.IntegerField(null=True)
    fe_nb_poste_occupe_mdr = models.IntegerField(null=True)

    zone_defense = models.CharField('zone de défense', db_column='fe_zone_defense', max_length=64, blank=True, null=True)
    mere = models.ForeignKey('self', blank=True, null=True, on_delete=models.SET_NULL, verbose_name='FE mère', db_column='fe_mere_id')

    def as_dict(self):
        return {
            "id": self.fe_code,
            "code": self.fe_code,
            "libelle": self.fe_libelle,
            "groupe_fe": self.groupe_fe_id
        }


# Modèle des Groupes de marques
class MarquesGroupe(models.Model):
    """Modèle des Groupes de marques
    """
    gm_id = models.IntegerField(primary_key=True)
    gm_type = models.CharField(max_length=100)
    gm_code = models.CharField(max_length=100)
    gm_libelle = models.CharField(max_length=100)
    gm_ordre = models.IntegerField(null=True)
    gm_selection_multiple = models.BooleanField(null=True)

    def as_dict(self):
        return {
            "id": self.gm_id,
            "type": self.gm_type,
            "code": self.gm_code,
            "libelle": self.gm_libelle,
            "selectionMultiple": self.gm_selection_multiple,
            "ordre": self.gm_ordre
        }


# Modèle des Marques
class Marque(models.Model):
    """Modèle des Marques
    """
    mar_id = models.TextField(primary_key=True)
    groupe_marques = models.ForeignKey(MarquesGroupe, on_delete=models.CASCADE)
    mar_code = models.CharField(max_length=100)
    mar_libelle = models.CharField(max_length=100)
    mar_ordre = models.IntegerField(null=True)

    def as_dict(self):
        return {
            "id": self.mar_id,
            "groupeMarquesId": self.groupe_marques_id,
            "code": self.mar_code,
            "libelle": self.mar_libelle,
            "ordre": self.mar_ordre
        }


# Modèle des fonctions
class Fonction(models.Model):
    """Modèle des fonctions
    """
    fon_id = models.CharField(max_length=100, primary_key=True)
    fon_libelle = models.CharField(max_length=100)


# Modèle Compétences
class Competence(models.Model):
    """Modèle Compétences
    """
    comp_id = models.CharField(primary_key=True, max_length=100)
    comp_libelle = models.CharField(null=True, max_length=100)

    def as_dict(self):
        return {
            "id": self.comp_id,
            "libelle": self.comp_libelle,
        }

class SpecifiqueChoices(models.TextChoices):
    """Choix pour les propositions de CIAT d'un poste"""
    SHM = 'SHM', 'SHM'
    ITD = 'ITD', 'ITD'
    PPE = 'PPE', 'PPE'

class PropositionsArmementChoices(models.TextChoices):
    """Choix pour les propositions d'armement d'un poste"""

    PROPOSE = 'PROPOSE', 'Propositions'
    VALIDE  = 'VALIDE',  'Propositions validées'

# Modèle des Poste
class Poste(models.Model):
    """ Modèle des Poste """

    class Cols():
        """ Constantes pour les noms de colonnes """

        PK                   = 'p_id'
        # relations many-to-many
        M2M_COMPETENCES      = 'competences'
        # relations one-to-many
        O2M_DECISION         = 'decisions'
        # relations one-to-one ou many-to-one
        REL_FONCTION         = 'fonction'
        REL_FORMATION_EMPLOI = 'formation_emploi'
        REL_SOUS_VIVIER      = 'sous_vivier'

    objects = BulkUpdateOrCreateQuerySet.as_manager()
    CHOICES_NF = [('1A', '1A'), ('1B', '1B'), ('1C', '1C'), ('2.', '2.'), ('3A', '3A'), ('3B', '3B'),
                  ('3B NFS', '3B NFS'), ('4.', '4.'), ('5A', '5A'), ('5B', '5B'), ('5C', '5C'), ('6A', '6A'),
                  ('6B', '6B')]
    AVIS = [('P1', 'P1'), ('P2', 'P2'), ('P3', 'P3'), ('P4', 'P4'), ('P4', 'P4'),('P4', 'P4'),('Gele','Gele'),('Non etudie','Non etudie')]
    p_id = models.CharField(max_length=100, primary_key=True)
    fonction = models.ForeignKey(Fonction, on_delete=models.SET_NULL, null=True)
    sous_vivier = models.ForeignKey(SousVivier, on_delete=models.SET_NULL, null=True)
    formation_emploi = models.ForeignKey(FormationEmploi, on_delete=models.SET_NULL, null=True)
    competences = models.ManyToManyField(Competence)
    p_domaine = models.ForeignKey(Domaine, on_delete=models.SET_NULL, null=True)
    p_filiere = models.ForeignKey(Filiere, on_delete=models.SET_NULL, null=True)
    p_fonction = models.CharField(max_length=100, null=True)
    p_code_fonction = models.CharField(max_length=100, null=True)
    p_nf = models.CharField(max_length=100, null=True, choices=CHOICES_NF)
    p_categorie = models.CharField(max_length=100, null=True)
    p_dep = models.IntegerField(null=True)
    p_liste_id_marques = models.CharField(max_length=100, null=True, blank=True)
    p_eip = models.CharField(max_length=100)
    p_avis = models.CharField(max_length=100, default='Non etudie', choices=AVIS)
    p_notes_gestionnaire = models.TextField(null=True)
    p_notes_partagees = models.TextField(null=True)
    p_poids_competences = models.FloatField(null=True)
    p_poids_filiere = models.FloatField(null=True)
    p_poids_nf = models.FloatField(null=True)
    p_nb_p1 = models.IntegerField(null=True)
    p_nb_p2 = models.IntegerField(null=True)
    p_nb_p3 = models.IntegerField(null=True)
    p_nb_p4 = models.IntegerField(null=True)
    p_nb_non_etudie = models.IntegerField(null=True)
    p_nb_gele = models.IntegerField(null=True)
    p_nb_reo = models.IntegerField(null=True)
    p_nb_reevalue = models.IntegerField(null=True)
    p_nb_occupe = models.IntegerField(null=True)
    p_nb_vacant = models.IntegerField(null=True)
    p_nb_affectable = models.IntegerField(null=True)
    p_ciat = models.BooleanField('CIAT', default=False, null=True)
    p_specifique = models.CharField('Poste spécifique', max_length=250, choices=SpecifiqueChoices.choices, null=True, blank=True)
    propositions_armement = models.CharField("propositions d'armement", db_column='p_propositions_armement', max_length=10, choices=PropositionsArmementChoices.choices, null=True, blank=True)
    p_priorisation_pcp = models.TextField('Priorisation PCP', null=True, blank=True)

    class Meta:
        constraints = [
            models.CheckConstraint(
                name='%(app_label)s_%(class)s_p_specifique_valid',
                check=models.Q(p_specifique__in=SpecifiqueChoices.values)
            ),
            models.CheckConstraint(
                name='%(app_label)s_%(class)s_propositions_armement_valid',
                check=models.Q(propositions_armement__in=PropositionsArmementChoices.values)
            )
        ]


class StatutPamChoices(models.TextChoices):
    """[Administre] choix pour le statut PAM"""

    A_ETUDIER      = 'A_ETUDIER',      'A étudier'
    A_ETUDIER_REC  = 'A_ETUDIER_REC',  'A étudier REC'
    A_MAINTENIR    = 'A_MAINTENIR',    'A maintenir'
    A_MUTER        = 'A_MUTER',        'A muter'
    A_TRAITER      = 'A_TRAITER',      'A traiter'
    NON_DISPONIBLE = 'NON_DISPONIBLE', 'Non disponible'
    NON_ETUDIE     = 'NON_ETUDIE',     'Non étudié'
    PARTANT        = 'PARTANT',        'Partant'


class StatutFuturChoices(models.TextChoices):
    """[Administre] choix pour le statut futur"""

    CLDM   = 'CLDM',   'CLDM'
    CP     = 'CP',     'CP'
    DRJI   = 'DRJI',   'DRJI'
    NRCT   = 'NRCT',   'NRCT'
    DET    = 'DET',    'DET'
    RECONV = 'RECONV', 'RECONV'


# Modèle des administrés
class Administre(models.Model):
    """Modèle des administrés"""

    class Cols():
        """ Constantes pour les noms de colonnes """

        PK                   = 'a_id_sap'
        STATUT_CONCERTO      = 'a_statut_concerto'
        STATUT_PAM           = 'a_statut_pam'
        DATE_STATUT_CONCERTO = 'a_date_statut_concerto'
        # relations many-to-many
        M2M_COMPETENCES      = 'a_liste_id_competences'
        # relations one-to-many
        O2M_FMOB             = 'fmobs'
        # relations one-to-one ou many-to-one
        REL_DECISION         = 'decision'
        REL_FONCTION         = 'fonction'
        REL_FORMATION_EMPLOI = 'formation_emploi'
        REL_GRADE            = 'grade'
        REL_SOUS_VIVIER      = 'sous_vivier'

    objects = BulkUpdateOrCreateQuerySet.as_manager()

    CHOICES_NF = [('1A', '1A'), ('1B', '1B'), ('1C', '1C'), ('2.', '2.'), ('3A', '3A'), ('3B', '3B'),
                  ('3B NFS', '3B NFS'), ('4.', '4.'), ('5A', '5A'), ('5B', '5B'), ('5C', '5C'), ('6A', '6A'),
                  ('6B', '6B')]
    a_id_sap = models.IntegerField(primary_key=True)
    formation_emploi = models.ForeignKey(FormationEmploi, related_name="formation_emploi", on_delete=models.SET_NULL,
                                         null=True)
    fonction = models.ForeignKey(Fonction, on_delete=models.SET_NULL, null=True)
    sous_vivier = models.ForeignKey(SousVivier, on_delete=models.SET_NULL, null=True, blank=True)
    grade = models.ForeignKey(Grade, on_delete=models.SET_NULL, null=True)
    a_grade_date_debut = models.CharField(max_length=100, null=True)
    a_liste_id_marques = models.CharField(max_length=100, null=True)
    a_liste_id_competences = models.ManyToManyField(Competence)
    a_nom = models.CharField(max_length=100)
    a_prenom = models.CharField(max_length=100)
    a_sexe = models.CharField(max_length=100)
    a_id_def = models.CharField(max_length=100, null=True)
    a_eip = models.CharField(max_length=100)
    a_fonction = models.CharField(max_length=100, null=True)
    a_code_fonction = models.CharField(max_length=100, null=True)
    a_domaine = models.ForeignKey(Domaine, related_name="domaine", on_delete=models.SET_NULL, null=True)
    a_filiere = models.ForeignKey(Filiere, on_delete=models.SET_NULL, null=True)
    a_nf = models.CharField(max_length=100, null=True, choices=CHOICES_NF)
    a_domaine_poste = models.ForeignKey(Domaine, related_name="domaine_poste", on_delete=models.SET_NULL, null=True)
    a_filiere_poste = models.ForeignKey(Filiere, related_name="filiere_poste", on_delete=models.SET_NULL, null=True)
    a_nf_poste = models.CharField(max_length=100, null=True, choices=CHOICES_NF)
    a_categorie = models.CharField(max_length=5, null=True)
    a_domaine_futur = models.ForeignKey(Domaine, related_name="domaine_futur", on_delete=models.SET_NULL, null=True)
    a_filiere_futur = models.ForeignKey(Filiere, related_name="filiere_futur", on_delete=models.SET_NULL, null=True)
    a_nf_futur = models.CharField(max_length=100, null=True, choices=CHOICES_NF)
    a_bureau_gestion = models.CharField(max_length=100, null=True)
    a_date_entree_service = models.CharField(max_length=100, null=True)
    a_arme = models.CharField(max_length=100, null=True)
    a_rg_origine_recrutement = models.CharField(max_length=100, null=True)
    a_date_naissance = models.CharField(max_length=100, null=True)
    a_diplome_hl = models.CharField(max_length=100, null=True)
    a_dernier_diplome = models.CharField(max_length=100, null=True)
    a_credo_fe = models.CharField(max_length=100, null=True)
    a_date_arrivee_fe = models.CharField(max_length=100, null=True)
    a_pos_statuaire = models.CharField(max_length=100, null=True)
    a_date_pos_statuaire = models.CharField(max_length=100, null=True)
    a_interruption_service = models.CharField(max_length=100, null=True)
    a_situation_fam = models.CharField(max_length=100, null=True)
    a_nombre_enfants = models.IntegerField(null=True)
    a_date_rdc = models.DateField(null=True)
    a_date_dernier_acr = models.DateField(null=True)
    a_eis = models.CharField(max_length=100, null=True)
    a_sap_conjoint = models.IntegerField(null=True)
    a_flag_particulier = models.IntegerField(null=True)
    a_flag_pam = models.IntegerField(null=True)
    a_statut_pam = models.CharField('statut PAM', max_length=100, choices=StatutPamChoices.choices, null=True, blank=True)
    a_notes_gestionnaire = models.TextField(null=True)
    a_notes_partagees = models.TextField(null=True)
    a_eip_futur = models.CharField(max_length=100, null=True)
    a_affectation1 = models.CharField(max_length=100, null=True)
    a_affectation2 = models.CharField(max_length=100, null=True)
    a_affectation3 = models.CharField(max_length=100, null=True)
    a_liste_depts_souhaites = models.CharField(max_length=100, null=True)
    a_pls_gb_max = models.IntegerField(null=True)
    a_marqueur_pn = models.BooleanField(default=False)
    a_affectation4 = models.CharField(max_length=100, null=True)
    a_affectation5 = models.CharField(max_length=100, null=True)
    a_affectation6 = models.CharField(max_length=100, null=True)
    a_affectation7 = models.CharField(max_length=100, null=True)
    a_affectation8 = models.CharField(max_length=100, null=True)
    a_affectation9 = models.CharField(max_length=100, null=True)
    a_fonction1 = models.CharField(max_length=100, null=True)
    a_fonction2 = models.CharField(max_length=100, null=True)
    a_fonction3 = models.CharField(max_length=100, null=True)
    a_fonction4 = models.CharField(max_length=100, null=True)
    a_fonction5 = models.CharField(max_length=100, null=True)
    a_fonction6 = models.CharField(max_length=100, null=True)
    a_fonction7 = models.CharField(max_length=100, null=True)
    a_fonction8 = models.CharField(max_length=100, null=True)
    a_fonction9 = models.CharField(max_length=100, null=True)
    a_profession_conjoint = models.CharField(max_length=100, null=True)
    a_id_def_conjoint = models.CharField(max_length=100, null=True)
    a_diplome_1 = models.CharField(max_length=100, null=True)
    a_diplome_1_date = models.DateField(max_length=100, null=True)
    a_diplome_1_note = models.FloatField(null=True)
    a_diplome_2 = models.CharField(max_length=100, null=True)
    a_diplome_2_date = models.DateField(max_length=100, null=True)
    a_diplome_2_note = models.FloatField(null=True)
    a_diplome_3 = models.CharField(max_length=100, null=True)
    a_diplome_3_date = models.DateField(max_length=100, null=True)
    a_diplome_3_note = models.FloatField(null=True)
    a_diplome_4 = models.CharField(max_length=100, null=True)
    a_diplome_4_date = models.DateField(max_length=100, null=True)
    a_diplome_4_note = models.FloatField(null=True)
    a_diplome_5 = models.CharField(max_length=100, null=True)
    a_diplome_5_date = models.DateField(max_length=100, null=True)
    a_diplome_5_note = models.FloatField(null=True)
    a_diplome_6 = models.CharField(max_length=100, null=True)
    a_diplome_6_date = models.DateField(max_length=100, null=True)
    a_diplome_6_note = models.FloatField(null=True)
    a_diplome_7 = models.CharField(max_length=100, null=True)
    a_diplome_7_date = models.DateField(max_length=100, null=True)
    a_diplome_7_note = models.FloatField(null=True)
    a_diplome_8 = models.CharField(max_length=100, null=True)
    a_diplome_8_date = models.DateField(max_length=100, null=True)
    a_diplome_8_note = models.FloatField(null=True)
    a_diplome_9 = models.CharField(max_length=100, null=True)
    a_diplome_9_date = models.DateField(max_length=100, null=True)
    a_diplome_9_note = models.FloatField(null=True)
    a_diplome_10 = models.CharField(max_length=100, null=True)
    a_diplome_10_date = models.DateField(max_length=100, null=True)
    a_diplome_10_note = models.FloatField(null=True)
    a_origine_recrutement = models.CharField(max_length=100, null=True)
    statut_futur = models.CharField('statut futur', db_column='a_statut_futur', max_length=8, choices=StatutFuturChoices.choices, null=True, blank=True)
    date_statut_futur = models.DateField('date du statut futur', db_column='a_date_statut_futur', null=True, blank=True)
    a_statut_concerto = models.CharField('statut CONCERTO', max_length=32, null=True, blank=True)
    a_date_statut_concerto = models.CharField('date du statut CONCERTO', max_length=32, null=True, blank=True)
    suivi_previsionnel_situation = models.CharField('suivi prévisionnel de la situation du militaire', db_column='a_suivi_previsionnel_situation', max_length=100, null=True, blank=True)
    date_suivi_previsionnel_situation = models.DateField('date du suivi prévisionnel de la situation du militaire', db_column='a_date_suivi_previsionnel_situation', null=True, blank=True)
    a_annee_previsible_mutation = models.PositiveIntegerField('année prévisible de mutation', null=True)
    a_fud = models.CharField('FUD de départ', max_length=32, null=True, blank=True)
    a_date_fud = models.CharField('date du FUD', max_length=32, null=True, blank=True)

    class Meta:
        verbose_name = "Administré"
        verbose_name_plural = "Administrés"
        constraints = [
            models.CheckConstraint(
                name='%(app_label)s_%(class)s_statut_pam_valid',
                check=models.Q(a_statut_pam__in=StatutPamChoices.values)
            ),
            models.CheckConstraint(
                name='%(app_label)s_%(class)s_statut_futur_valid',
                check=models.Q(statut_futur__in=StatutFuturChoices.values)
            ),
        ]

# class CompetencesAdministre(models.Model):
#     """Modèle de table intermédiaire entre Administrés et Compétences
#     """
#     competence = models.ForeignKey(Competence, on_delete=models.CASCADE)
#     administre = models.ForeignKey(Administre, on_delete=models.CASCADE)
#     def __unicode__(self):

#         return self.competence.comp_id + self.administre.a_id_sap


class FMOB(models.Model):
    """Modèle de FMOB
    """
    objects = BulkUpdateOrCreateQuerySet.as_manager()

    fmob_id = models.CharField(max_length=100, primary_key=True)
    administre = models.ForeignKey(Administre, on_delete=models.CASCADE, null=True, related_name="fmobs",
                                   db_constraint=False)
    fmob_millesime = models.IntegerField(null=True)
    fmob_annulation_fmob = models.BooleanField(default=False)
    fmob_annulation_femp = models.BooleanField(default=False)
    fmob_sans_suite_militaire_fmob = models.BooleanField(default=False)
    fmob_sans_suite_militaire_femp = models.BooleanField(default=False)
    fmob_date_visa_militaire = models.DateField(max_length=100, null=True)
    fmob_depart_institution_soff = models.BooleanField(default=False)
    fmob_mobilite_bassin_externe = models.BooleanField(default=False)
    fmob_mobilite_bassin_interne = models.BooleanField(default=False)
    fmob_mobilite_centre_interet_adt = models.BooleanField(default=False)
    fmob_mobilite_dans_specialite = models.BooleanField(default=False)
    fmob_mobilite_hors_metropole = models.BooleanField(default=False)
    fmob_mobilite_recrutement_particulier_administre = models.BooleanField(default=False)
    fmob_motif_edition_la = models.CharField(max_length=100, null=True)
    fmob_motif_edition_ll = models.CharField(max_length=100, null=True)
    fmob_reception_drhat_fmob = models.BooleanField(default=False)
    fmob_reconnaissance_parcours_pro_administre = models.BooleanField(default=False)
    fmob_proposition_affectation_verrouille = models.CharField(max_length=100, null=True)
    fmob_reception_drhat_femp = models.BooleanField(default=False)
    fmob_avis_cdc_mobilite_interne = models.BooleanField(default=False)
    fmob_avis_cdc_mobilite_externe = models.BooleanField(default=False)
    fmob_avis_cdc_mutation_administre = models.BooleanField(default=False)
    fmob_avis_cdc_mobilite_centre_interet = models.BooleanField(default=False)
    fmob_avis_cdc_mobilite_specialite = models.BooleanField(default=False)
    fmob_avis_cdc_mobilite_hors_metropole = models.BooleanField(default=False)
    fmob_avis_cdc_mobilite_recrutement_particulier_admin = models.BooleanField(default=False)
    fmob_date_deb_fmob = models.CharField(max_length=100, null=True)
    fmob_date_fin_fmob = models.CharField(max_length=100, null=True)
    fmob_date_signature_admin_fmob = models.DateField(max_length=100, null=True)
    fmob_date_signature_admin_femp = models.DateField(max_length=100, null=True)
    fmob_date_signature_chef_de_corps = models.DateField(max_length=100, null=True)
    fmob_remarques_eventuelles_administres = models.TextField(null=True)
    fmob_avis_commandant_formation = models.TextField(null=True)
    fmob_fonction_1 = models.CharField(max_length=100, null=True)
    fmob_fonction_2 = models.CharField(max_length=100, null=True)
    fmob_fonction_3 = models.CharField(max_length=100, null=True)
    fmob_fonction_4 = models.CharField(max_length=100, null=True)
    fmob_fonction_5 = models.CharField(max_length=100, null=True)
    fmob_commune_1 = models.CharField(max_length=100, null=True)
    fmob_commune_2 = models.CharField(max_length=100, null=True)
    fmob_commune_3 = models.CharField(max_length=100, null=True)
    fmob_commune_4 = models.CharField(max_length=100, null=True)
    fmob_commune_5 = models.CharField(max_length=100, null=True)
    fmob_prio_1 = models.BooleanField(default=False)
    fmob_prio_2 = models.BooleanField(default=False)
    fmob_prio_3 = models.BooleanField(default=False)
    fmob_prio_4 = models.BooleanField(default=False)
    fmob_prio_5 = models.BooleanField(default=False)
    fmob_avis_mutabilite = models.CharField(max_length=100, null=True)
    fmob_obs = models.CharField(max_length=100, null=True)
    fmob_fe_future = models.CharField(max_length=100, null=True)


# Modèle Liste de Préference
class PreferencesListe(models.Model):
    """Modèle Liste de Préference
    """
    lp_id = models.IntegerField(primary_key=True)
    administre = models.ForeignKey(Administre, on_delete=models.CASCADE)
    poste = models.ForeignKey(Poste, on_delete=models.CASCADE)
    lp_rang_poste = models.IntegerField()


# Modèle pour le suivi des calculs
class Calcul(models.Model):
    """Modèle pour le suivi des calculs
       On y intègre également le statut du calcul
    """
    class Statut(models.TextChoices):
        AUCUN            = 'AUCUN',            'aucun'
        EN_ATTENTE       = 'EN_ATTENTE',       'en attente'
        EN_COURS         = 'EN_COURS',         'en cours'
        TERMINE          = 'TERMINE',          'terminé'
        ERREUR           = 'ERREUR',           'terminé en erreur'
        TERMINE_DE_FORCE = 'TERMINE_DE_FORCE', 'terminé de force'
        ARRETER          = 'ARRETER'

    sous_vivier = models.OneToOneField(SousVivier, primary_key=True, on_delete=models.CASCADE)
    ca_date_debut = models.DateTimeField(null=True, blank=True)
    ca_date_fin = models.DateTimeField(null=True, blank=True)
    ca_statut = models.CharField(max_length=100)
    ca_statut_pourcentage = models.FloatField(default='100')



# Modèle pour Le PAM
class PAM(models.Model):
    """Modèle pour Le PAM
    """
    pam_id = models.IntegerField(primary_key=True)
    pam_date = models.CharField(max_length=100)
    pam_libelle = models.CharField(max_length=100)
    pam_statut = models.CharField(max_length=100)


# Modèle pour les notations
class Notation(models.Model):
    """Modèle pour les notations
    """
    no_id = models.AutoField(primary_key=True)
    administre = models.ForeignKey(Administre, on_delete=models.CASCADE)
    poste = models.ForeignKey(Poste, on_delete=models.CASCADE)
    pam = models.ForeignKey(PAM, on_delete=models.SET_NULL, null=True, blank=True)
    no_rang_administre = models.IntegerField(null=True)
    no_rang_poste = models.IntegerField(null=True)
    no_date_execution = models.DateTimeField(auto_now=True)
    no_score_administre = models.FloatField(null=True)
    no_score_poste = models.FloatField(null=True)
    no_flag_cple_ideal = models.BooleanField(default=False)


# Modèle pour les décisions
class Decision(models.Model):
    """Modèle pour les décisions
    """
    administre = models.OneToOneField(Administre, on_delete=models.CASCADE, primary_key=True)
    poste = models.ForeignKey(Poste, on_delete=models.CASCADE, related_name="decisions")
    pam = models.ForeignKey(PAM, on_delete=models.SET_NULL, null=True, blank=True)
    de_decision = models.CharField(max_length=100)
    de_date_decision = models.DateTimeField(auto_now=True)
    de_notes_gestionnaire = models.TextField(null=True, blank=True)
    de_notes_partagees = models.TextField(null=True, blank=True)
    notation = models.ForeignKey(Notation, on_delete=models.SET_NULL, null=True, blank=True)


# Modèle Utilisateur de l'application
class CustomUser(AbstractUser):
    """Modèle Utilisateur de l'application
    """
    administre = models.ForeignKey(Administre, blank=True, on_delete=models.SET_NULL, null=True)
    grade = models.CharField(blank=True, null=True, max_length=100)


# Modèle d'association des groupes de FE aux gestionnaires PCP
class PcpFeGroupe(models.Model):
    """Modèle d'association des groupes de FE aux gestionnaires PCP
    """
    CATEGORIE_CHOICES = [('MDR', 'MDR'), ('OFF', 'OFF'), ('SOFF', 'SOFF'), ('OGX', 'OGX')]
    pcp_fe_id = models.AutoField(primary_key=True)
    pcp_fe_groupe = models.ForeignKey(GroupeFe, null=True, on_delete=models.CASCADE,
                                      verbose_name='Nom du groupe')
    pcp_fe_categorie = models.CharField(max_length=5, choices=CATEGORIE_CHOICES, null=True, verbose_name='Catégorie')
    gestionnaire = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=True, db_constraint=False)

    def __str__(self):
        return str(self.gestionnaire.first_name) + ' ' + str(self.gestionnaire.last_name.upper()) + ' / ' + self.pcp_fe_groupe.groupe_fe_nom + ' / ' + self.pcp_fe_categorie

    class Meta:
        verbose_name = 'Lien gest PCP / groupe FE'
        verbose_name_plural = 'Liens gest PCP / groupe FE'
