"""
Commande permettant de supprimer les assiduités et les justificatifs

Ecrit par Matthias HARTMANN
"""
import sqlalchemy as sa

from app import db
from app.models import Justificatif, Assiduite, Departement
from app.scodoc.sco_archives_justificatifs import JustificatifArchiver
from app.scodoc.sco_utils import TerminalColor


def downgrade_module(
    dept: str = None, assiduites: bool = False, justificatifs: bool = False
):
    """
    Supprime les assiduités et/ou justificatifs du dept sélectionné ou de tous les départements

    Args:
        dept (str, optional): l'acronym du département. Par défaut tous les départements.
        assiduites (bool, optional): suppression des assiduités. Par défaut : Non
        justificatifs (bool, optional): supression des justificatifs. Par défaut : Non
    """

    dept_etudid: list[int] = None
    dept_id: int = None

    # Récupération du département si spécifié
    if dept is not None:
        departement: Departement = Departement.query.filter_by(acronym=dept).first()

        assert departement is not None, "Le département n'existe pas."

        dept_etudid = [etud.id for etud in departement.etudiants]
        dept_id = departement.id

    # Suppression des assiduités
    if assiduites:
        _remove_assiduites(dept_etudid)
    # Suppression des justificatifs
    if justificatifs:
        _remove_justificatifs(dept_etudid)
        _remove_justificatifs_archive(dept_id)

    # Si on supprime tout le module assiduité/justificatif alors on remet à zero
    # les séquences postgres
    if dept is None:
        if assiduites:
            db.session.execute(
                sa.text("ALTER SEQUENCE assiduites_id_seq RESTART WITH 1")
            )
        if justificatifs:
            db.session.execute(
                sa.text("ALTER SEQUENCE justificatifs_id_seq RESTART WITH 1")
            )

    # On valide l'opération sur la bdd
    db.session.commit()

    # On affiche un message pour l'utilisateur
    print(
        f"{TerminalColor.GREEN}Le module assiduité a bien été remis à zero.{TerminalColor.RESET}"
    )


def _remove_assiduites(dept_etudid: str = None):
    """
    _remove_assiduites Supprime les assiduités

    Args:
        dept_etudid (str, optional): la liste des etudid d'un département. Defaults to None.
    """
    if dept_etudid is None:
        # Si pas d'étudids alors on supprime toutes les assiduités
        Assiduite.query.delete()
    else:
        # Sinon on supprime que les assiduités des étudiants donnés
        Assiduite.query.filter(Assiduite.etudid.in_(dept_etudid)).delete()


def _remove_justificatifs(dept_etudid: str = None):
    """
    _remove_justificatifs Supprime les justificatifs

    Args:
        dept_etudid (str, optional): la liste des etudid d'un département. Defaults to None.
    """
    if dept_etudid is None:
        # Si pas d'étudids alors on supprime tous les justificatifs
        Justificatif.query.delete()
    else:
        # Sinon on supprime que les justificatifs des étudiants donnés
        Justificatif.query.filter(Justificatif.etudid.in_(dept_etudid)).delete()


def _remove_justificatifs_archive(dept_id: int = None):
    """
    _remove_justificatifs_archive On supprime les archives des fichiers justificatifs

    Args:
        dept_id (int, optional): l'id du département à supprimer . Defaults to None.
            Si none : supprime tous les département
            Sinon uniquement le département sélectionné
    """
    JustificatifArchiver().remove_dept_archive(dept_id)