# -*- coding: UTF-8 -*

"""ScoDoc models : departements
"""
from typing import Any

from app import db
from app.models import SHORT_STR_LEN


class Departement(db.Model):
    """Un département ScoDoc"""

    id = db.Column(db.Integer, primary_key=True)
    acronym = db.Column(
        db.String(SHORT_STR_LEN), nullable=False, index=True
    )  # ne change jamais, voir la pref. DeptName
    description = db.Column(db.Text())  # pas utilisé par ScoDoc : voir DeptFullName
    date_creation = db.Column(db.DateTime(timezone=True), server_default=db.func.now())
    visible = db.Column(
        db.Boolean(), nullable=False, default=True, server_default="true"
    )  # sur page d'accueil

    # entreprises = db.relationship("Entreprise", lazy="dynamic", backref="departement")
    etudiants = db.relationship("Identite", lazy="dynamic", backref="departement")
    formations = db.relationship("Formation", lazy="dynamic", backref="departement")
    formsemestres = db.relationship(
        "FormSemestre", lazy="dynamic", backref="departement"
    )
    preferences = db.relationship(
        "ScoPreference", lazy="dynamic", backref="departement"
    )
    semsets = db.relationship("NotesSemSet", lazy="dynamic", backref="departement")

    def __repr__(self):
        return f"<{self.__class__.__name__}(id={self.id}, acronym='{self.acronym}')>"

    def to_dict(self):
        data = {
            "id": self.id,
            "acronym": self.acronym,
            "description": self.description,
            "visible": self.visible,
            "date_creation": self.date_creation,
        }
        return data

    @classmethod
    def from_acronym(cls, acronym):
        dept = cls.query.filter_by(acronym=acronym).first_or_404()
        return dept


def create_dept(acronym: str, visible=True) -> Departement:
    "Create new departement"
    from app.models import ScoPreference

    existing = Departement.query.filter_by(acronym=acronym).count()
    if existing:
        raise ValueError(f"acronyme {acronym} déjà existant")
    departement = Departement(acronym=acronym, visible=visible)
    p1 = ScoPreference(name="DeptName", value=acronym, departement=departement)
    db.session.add(p1)
    db.session.add(departement)
    db.session.commit()
    return departement