from django.db import models

from .garnison import Garnison
from .user import CustomUser


class GroupeFe(models.Model):
    """
    Modèle de groupes 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


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, blank=True, on_delete=models.CASCADE,
                                      verbose_name='Nom du groupe')
    pcp_fe_categorie = models.CharField(max_length=5, choices=CATEGORIE_CHOICES, null=True, blank=True, verbose_name='Catégorie')
    gestionnaire = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=True, blank=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'


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

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

        PK               = 'fe_code'
        LIBELLE          = 'fe_libelle'
        ZONE_DEFENSE     = 'zone_defense'
        REL_MERE         = 'mere'
        REL_POSTE        = 'poste'
        M2M_GESTIONNAIRE = 'gestionnaires'

    fe_code = models.CharField(primary_key=True, max_length=100)
    groupe_fe = models.ForeignKey(GroupeFe, blank=True, on_delete=models.SET_NULL, null=True)
    gestionnaires = models.ManyToManyField(CustomUser, related_name=CustomUser.Cols.M2M_FORMATION_EMPLOIS, blank=True)
    fe_code_postal = models.CharField(max_length=100, null=True, blank=True)
    fe_garnison_lieu = models.CharField(max_length=100, null=True, blank=True)
    fe_libelle = models.CharField(max_length=100, null=True, blank=True)
    fe_taux_armement_cible_off = models.FloatField(null=True, blank=True, verbose_name="TA cible OFF")
    fe_nb_poste_reo_off = models.IntegerField(null=True, blank=True)
    fe_nb_poste_reevalue_off = models.IntegerField(null=True, blank=True)
    fe_nb_poste_vacant_off = models.IntegerField(null=True, blank=True)
    fe_nb_poste_occupe_off = models.IntegerField(null=True, blank=True)
    fe_taux_armement_cible_soff = models.FloatField(null=True, blank=True, verbose_name="TA cible SOFF")
    fe_nb_poste_reo_soff = models.IntegerField(null=True, blank=True)
    fe_nb_poste_reevalue_soff = models.IntegerField(null=True, blank=True)
    fe_nb_poste_vacant_soff = models.IntegerField(null=True, blank=True)
    fe_nb_poste_occupe_soff = models.IntegerField(null=True, blank=True)
    fe_taux_armement_cible_mdr = models.FloatField(null=True, blank=True, verbose_name="TA cible MDR")
    fe_nb_poste_reo_mdr = models.IntegerField(null=True, blank=True)
    fe_nb_poste_reevalue_mdr = models.IntegerField(null=True, blank=True)
    fe_nb_poste_vacant_mdr = models.IntegerField(null=True, blank=True)
    fe_nb_poste_occupe_mdr = models.IntegerField(null=True, blank=True)
    fe_mere_credo = models.CharField('Code FE mère', max_length=100, null=True, blank=True)
    fe_mere_la = models.CharField('Libelle FE mère', max_length=100, null=True, blank=True)
    fe_fot = models.CharField(max_length=100, null=True, blank=True)
    fe_abo_fe = models.CharField(max_length=100, null=True, blank=True)
    fe_pilier_niv1 = models.CharField(max_length=100, null=True, blank=True)
    fe_code_niv_org4 = models.CharField('Code niveau d\'org 4', max_length=100, null=True, blank=True)
    fe_niv_org4 = models.CharField('Libelle niveau d\'org 4', max_length=100, null=True, blank=True)
    fe_code_niv_org4_mdr = models.CharField('Code niveau d\'org 4 (MDR)', max_length=100, null=True, blank=True)
    fe_niv_org4_mdr = models.CharField('Libelle niveau d\'org 4 (MDR)', max_length=100, null=True, blank=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,
            "mere_code": self.fe_mere_credo,
            "mere_la": self.fe_mere_la,
            "groupe_fe": self.groupe_fe_id,
            "fe_garnison_lieu": self.fe_garnison_lieu,
            "zone_defense": self.zone_defense
        }
