##############################################################################
#  Module "Avis de poursuite d'étude"
#  conçu et développé par Cléo Baras (IUT de Grenoble)
##############################################################################

"""
Created on 01-2024

@author: barasc
"""

from app.models import FormSemestre

TYPES_RCS = {
    "S1": {
        "aggregat": ["S1"],
        "descr": "Semestre 1 (S1)",
    },
    "S2": {
        "aggregat": ["S2"],
        "descr": "Semestre 2 (S2)",
    },
    "1A": {
        "aggregat": ["S1", "S2"],
        "descr": "BUT1 (S1+S2)",
    },
    "S3": {
        "aggregat": ["S3"],
        "descr": "Semestre 3 (S3)",
    },
    "S4": {
        "aggregat": ["S4"],
        "descr": "Semestre 4 (S4)",
    },
    "2A": {
        "aggregat": ["S3", "S4"],
        "descr": "BUT2 (S3+S4)",
    },
    "3S": {
        "aggregat": ["S1", "S2", "S3"],
        "descr": "Moyenne du S1 au S3 (S1+S2+S3)",
    },
    "4S": {
        "aggregat": ["S1", "S2", "S3", "S4"],
        "descr": "Moyenne du S1 au S4 (S1+S2+S3+S4)",
    },
    "S5": {
        "aggregat": ["S5"],
        "descr": "Semestre 5 (S5)",
    },
    "S6": {
        "aggregat": ["S6"],
        "descr": "Semestre 6 (S6)",
    },
    "3A": {
        "aggregat": ["S5", "S6"],
        "descr": "BUT3 (S5+S6)",
    },
    "5S": {
        "aggregat": ["S1", "S2", "S3", "S4", "S5"],
        "descr": "Moyenne du S1 au S5 (S1+S2+S3+S4+S5)",
    },
    "6S": {
        "aggregat": ["S1", "S2", "S3", "S4", "S5", "S6"],
        "descr": "Moyenne globale (S1+S2+S3+S4+S5+S6)",
    },
}
"""Dictionnaire détaillant les différents regroupements cohérents
de semestres (RCS), en leur attribuant un nom et en détaillant
le nom des semestres qu'ils regroupent et l'affichage qui en sera fait
dans les tableurs de synthèse.
"""

TOUS_LES_RCS_AVEC_PLUSIEURS_SEM = [cle for cle in TYPES_RCS if not cle.startswith("S")]
TOUS_LES_RCS = list(TYPES_RCS.keys())
TOUS_LES_SEMESTRES = [cle for cle in TYPES_RCS if cle.startswith("S")]


def get_descr_rcs(nom_rcs: str) -> str:
    """Renvoie la description pour les tableurs de synthèse
    Excel d'un nom de RCS"""
    return TYPES_RCS[nom_rcs]["descr"]


class RCS:
    """Modélise un regroupement cohérent de semestres,
    tous se terminant par un (form)semestre final.
    """

    def __init__(self, nom: str, semestre_final: FormSemestre):
        self.nom: str = nom
        """Nom du RCS"""
        assert self.nom in TOUS_LES_RCS, "Le nom d'un RCS doit être un aggrégat"

        self.aggregat: list[str] = TYPES_RCS[nom]["aggregat"]
        """Aggrégat (liste des nom des semestres aggrégés)"""

        self.formsemestre_final: FormSemestre = semestre_final
        """(Form)Semestre final du RCS"""

        self.rang_final = self.formsemestre_final.semestre_id
        """Rang du formsemestre final"""

        self.rcs_id: (str, int) = (nom, semestre_final.formsemestre_id)
        """Identifiant du RCS sous forme (nom_rcs, id du semestre_terminal)"""

        self.fid_final: int = self.formsemestre_final.formsemestre_id
        """Identifiant du (Form)Semestre final"""

    def get_formsemestre_id_final(self) -> int:
        """Renvoie l'identifiant du formsemestre final du RCS

        Returns:
            L'id du formsemestre final (marquant la fin) du RCS
        """
        return self.formsemestre_final.formsemestre_id

    def __str__(self):
        """Représentation textuelle d'un RCS"""
        return f"{self.nom}[#{self.formsemestre_final.formsemestre_id}✟{self.formsemestre_final.date_fin.year}]"

    def get_repr(self, verbose=True):
        """Représentation textuelle d'un RCS"""
        return self.__str__()

    def __eq__(self, other):
        """Egalité de RCS"""
        return (
            self.nom == other.nom
            and self.formsemestre_final == other.formsemestre_final
        )