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

from .administre import Administre, Administres_Pams
from .commun import NiveauFonctionnelChoices, SpecifiqueChoices
from .competence import Competence
from .domaine import Domaine
from .filiere import Filiere
from .garnison import Garnison
from .grade import Grade
from .poste import Poste, Postes_Pams
from .sous_vivier import SousVivier
from .pam import PAM

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

"""

# TODO: supprimer ce modèle et le remplacer par le nouveau modèle des Sous-viviers
# 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, blank=True)
    filiere = models.ForeignKey(Filiere, on_delete=models.SET_NULL, null=True, blank=True)
    sva_categorie = models.CharField(max_length=5, choices=CATEGORIE_CHOICES)
    sva_arme = models.CharField(max_length=20, null=True, blank=True)


# 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, blank=True)
    gm_selection_multiple = models.BooleanField(null=True, blank=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, blank=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
        }


class ZoneGeographique(models.Model):
    """Modèle des Zones Geographiques
    """
    zone_id = models.CharField(max_length=100, primary_key=True)
    zone_libelle = models.CharField(max_length=100)

    def as_dict(self):
        return {
            "id": self.zone_id,
            "libelle": self.zone_libelle
        }


# Modèle Liste de Préference
class PreferencesListe(models.Model):
    """Modèle Liste de Préference
    """
    lp_id = models.IntegerField(primary_key=True)
    administre_pam = models.ForeignKey(Administres_Pams, on_delete=models.CASCADE, related_name= 'administre_pam_pref', default="")
    administre = models.ForeignKey(Administre, on_delete=models.CASCADE, related_name= 'administre_pref', default="")
    pam = models.ForeignKey(PAM, on_delete=models.CASCADE, default="")
    poste = models.ForeignKey(Poste, on_delete=models.CASCADE)
    lp_rang_poste = models.IntegerField()




# 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)
    administre_pam = models.ForeignKey(Administres_Pams, on_delete=models.CASCADE, default="", related_name='administre_pam')
    poste_pam = models.ForeignKey(Postes_Pams, on_delete=models.CASCADE, default="", related_name='poste_pam')
    pam = models.ForeignKey(PAM, on_delete=models.SET_NULL, null=True, blank=True)
    no_rang_administre = models.IntegerField(null=True, blank=True)
    no_rang_poste = models.IntegerField(null=True, blank=True)
    no_date_execution = models.DateTimeField(auto_now=True)
    no_score_administre = models.FloatField(null=True, blank=True)
    no_score_poste = models.FloatField(null=True, blank=True)
    no_flag_cple_ideal = models.BooleanField(default=False)


class Administre_Notation(models.Model):
    """Modèle le lien entre Notation et Administre
    """
    id = models.CharField(max_length=100, primary_key=True)
    administre = models.ForeignKey(Administre, on_delete=models.CASCADE, null=True, blank=True, related_name='adm_not', db_constraint=False)
    no_annne_de_notation = models.CharField(max_length=100, null=True, blank=True)
    no_nr_ou_iris = models.CharField(max_length=100, null=True, blank=True)
    no_rac_ou_iris_cumule = models.CharField(max_length=100, null=True, blank=True)
    no_rf_qsr = models.CharField(max_length=100, null=True, blank=True)
    no_aptitude_emploie_sup = models.CharField(max_length=100, null=True, blank=True)
    no_potentiel_responsabilite_sup = models.CharField(max_length=100, null=True, blank=True)
    no_age_annees = models.CharField(max_length=100, null=True, blank=True)


# Modèle du référentiel organique
class RefOrg(models.Model):
    """Modèle de référentiel organique"""

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

        PK           = 'ref_org_code'
        # relations one-to-one ou many-to-one
        REL_REF_GEST = 'ref_gest'

    # TODO: ajouter la condition d'unicité des lignes (utiliser class Meta)
    ref_org_code = models.CharField('Code niveau d\'org', max_length=100, primary_key=True)
    ref_org_code_niv_org1 = models.CharField('Code niveau d\'org 1', max_length=100, null=True, blank=True)
    ref_org_lib_niv_org1 = models.CharField('Livelle niveau d\'org 1', max_length=100, null=True, blank=True)
    ref_org_code_niv_org2 = models.CharField('Code niveau d\'org 2', max_length=100, null=True, blank=True)
    ref_org_lib_niv_org2 = models.CharField('Libelle niveau d\'org 2', max_length=100, null=True, blank=True)
    ref_org_code_niv_org3 = models.CharField('Code niveau d\'org 3', max_length=100, null=True, blank=True)
    ref_org_lib_niv_org3 = models.CharField('Libelle niveau d\'org 3', max_length=100, null=True, blank=True)
    ref_org_code_niv_org4 = models.CharField('Code niveau d\'org 4', max_length=100, null=True, blank=True)
    ref_org_lib_niv_org4 = models.CharField('Libell niveau d\'org 4', max_length=100, null=True, blank=True)
    ref_org_niv_org = models.IntegerField('Niveau d\'org', null=True, blank=True)
    ref_org_ref_fe = models.BooleanField('Pameur BMOB', default=False, null=True)
    ref_org_ref_sv_fil = models.BooleanField('Gestionnaire BGCAT', default=False, null=True)
    ref_org_droit_lect = models.BooleanField('Droit de lecture', default=False, null=True)
    ref_org_droit_ecr = models.BooleanField("Droit d'écriture", default=False, null=True)
    ref_org_expert_hme = models.BooleanField('Expert HME', default=False, null=True)
    ref_org_bvt = models.BooleanField('Gestionnaire BVT', default=False, null=True)
    ref_org_itd = models.BooleanField('Gestionnaire ITD', default=False, null=True)

    class Meta:
        verbose_name = 'Référentiel organique'
        verbose_name_plural = 'Référentiels organiques'


# Modèle du référentiel gestionnaire
class RefGest(models.Model):
    """Modèle de référentiel gestionnaire"""

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

        PK      = 'ref_gest_sap'
        # relations one-to-one ou many-to-one
        REL_ORG = 'ref_gest_org'

    ref_gest_sap = models.IntegerField('Id SAP', primary_key=True)
    ref_gest_username = models.CharField('Nom d\'utilisateur', max_length=100, null=True, blank=True)
    ref_gest_email = models.CharField('Adresse mail', max_length=100, null=True, blank=True)
    ref_gest_first_name = models.CharField('Prénom', max_length=100, null=True, blank=True)
    ref_gest_last_name = models.CharField('Nom', max_length=100, null=True, blank=True)
    ref_gest_grade = models.CharField('Grade', max_length=100, null=True, blank=True)
    ref_gest_niv_org = models.CharField('Niveau d\'org', max_length=100, null=True, blank=True)
    ref_gest_org = models.ForeignKey(RefOrg, verbose_name='Référentiel organique', related_name=RefOrg.Cols.REL_REF_GEST, on_delete=models.CASCADE,
                                     db_column='ref_gest_org_id', null=True, blank=True)

    class Meta:
        verbose_name = 'Référentiel gestionnaire'
        verbose_name_plural = 'Référentiels gestionnaires'


# Modèle du référentiel sous-vivier filière
class RefSvFil(models.Model):
    """Modèle de référentiel sous-vivier filière
    """

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

        # relations one-to-one ou many-to-one
        REL_SOUS_VIVIER = 'sous_vivier'


    ref_sv_fil_code = models.CharField('Code niveau d\'org', max_length=100, null=True, blank=True)
    ref_sv_fil_dom_gest = models.CharField('Domaine de gestion', max_length=100, null=True, blank=True)
    ref_sv_fil_dom = models.CharField('Domaine', max_length=100, null=True, blank=True)
    ref_sv_fil_fil = models.CharField('Filière', max_length=100, null=True, blank=True)
    ref_sv_fil_cat = models.CharField('Catégorie', max_length=100, null=True, blank=True)
    sous_vivier = models.ForeignKey(SousVivier, verbose_name='Sous-vivier', on_delete=models.SET_NULL, null=True, blank=True)

    def as_dict(self):
        return {
            "ref_sv_fil_code": self.ref_sv_fil_code,
            "ref_sv_fil_dom_gest": self.ref_sv_fil_dom_gest,
            "ref_sv_fil_dom": self.ref_sv_fil_dom,
            "ref_sv_fil_fil": self.ref_sv_fil_fil,
            "ref_sv_fil_cat": self.ref_sv_fil_cat,
        }
    
    class Meta:
        verbose_name = 'Référentiel sous-vivier/filière'
        verbose_name_plural = 'Référentiels sous-viviers/filières'
