##############################################################################
# ScoDoc
# Copyright (c) 1999 - 2023 Emmanuel Viennet.  All rights reserved.
# See LICENSE
##############################################################################

"""Jury BUT: calcul des décisions de jury annuelles "automatiques"
"""

from app import db
from app.but import jury_but
from app.models.etudiants import Identite
from app.models.formsemestre import FormSemestre
from app.scodoc import sco_cache
from app.scodoc.sco_exceptions import ScoValueError


def formsemestre_validation_auto_but(
    formsemestre: FormSemestre, only_adm: bool = True, no_overwrite: bool = True
) -> int:
    """Calcul automatique des décisions de jury sur une "année" BUT.

    - N'enregistre jamais de décisions de l'année scolaire précédente, même
    si on a des RCUE "à cheval".
    - Ne modifie jamais de décisions déjà enregistrées (sauf si no_overwrite est faux,
    ce qui est utilisé pour certains tests unitaires).
    - Normalement, only_adm est True et on n'enregistre que les décisions validantes
    de droit: ADM ou CMP.
    En revanche, si only_adm est faux, on enregistre la première décision proposée par ScoDoc
    (mode à n'utiliser que pour les tests unitaires vérifiant la saisie des jurys)

    Returns: nombre d'étudiants pour lesquels on a enregistré au moins un code.
    """
    if not formsemestre.formation.is_apc():
        raise ScoValueError("fonction réservée aux formations BUT")
    nb_etud_modif = 0
    with sco_cache.DeferredSemCacheManager():
        for etudid in formsemestre.etuds_inscriptions:
            etud: Identite = Identite.query.get(etudid)
            deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre)
            nb_etud_modif += deca.record_all(
                no_overwrite=no_overwrite, only_validantes=only_adm
            )

    db.session.commit()
    return nb_etud_modif