# -*- mode: python -*-
# -*- coding: utf-8 -*-

"""Test inscriptions / demissions / affichages notes

 - Création 2 étudiants, puis formation en 1 semestre.
 - Saisie de 2 notes
 - Demission d'un étudiant
 - bulletins

Utiliser comme: 
     scotests/scointeractive.sh -r TEST00 scotests/test_demissions.py

"""
import datetime
import re
import json

# La variable context est définie par le script de lancement
# l'affecte ainsi pour évietr les warnins pylint:
context = context  # pylint: disable=undefined-variable
REQUEST = REQUEST  # pylint: disable=undefined-variable
import scotests.sco_fake_gen as sco_fake_gen  # pylint: disable=import-error
import sco_utils
import sco_bulletins

G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False

nb_etuds = 10
# --- Création d'étudiants
etuds = [G.create_etud(code_nip=None) for _ in range(nb_etuds)]
# --- Mise en place formation
form, ue_list, mod_list = G.setup_formation(
    nb_semestre=1, titre="Essai 1", acronyme="ESS01"
)
# Mise en place semestre
sem, eval_list = G.setup_formsemestre(
    form,
    mod_list,
    semestre_id=1,
    date_debut="01/01/2021",
    date_fin="31/12/2021",
    titre="Essai démissions",
)
# Inscriptions
for etud in etuds:
    G.inscrit_etudiant(sem, etud)
# Notes
G.set_etud_notes_sem(sem, eval_list, etuds)

# Bulletins
bul = sco_bulletins.formsemestre_bulletinetud_dict(
    context.Notes, sem["formsemestre_id"], etuds[0]["etudid"]
)
print(bul["moy_gen"])
assert bul["ins"][0]["etat"] == "I"

# Démission:
context.doDemEtudiant(
    etuds[0]["etudid"], sem["formsemestre_id"], event_date="15/12/2021"
)
bul = sco_bulletins.formsemestre_bulletinetud_dict(
    context.Notes, sem["formsemestre_id"], etuds[0]["etudid"]
)
print(bul["moy_gen"])

assert bul["moy_gen"] == "NA"
assert bul["ins"][0]["etat"] == "D"

# ------------ Billets d'absences
etud = etuds[1]  # non demissionnaire
d = sem["date_debut_iso"]
d_beg = datetime.datetime(*[int(x) for x in d.split("-")])
d_end = d_beg + datetime.timedelta(2)
description = "billet test 0"
x = context.Absences.AddBilletAbsence(
    d_beg.isoformat(),
    d_end.isoformat(),
    description=description,
    etudid=etud["etudid"],
    REQUEST=REQUEST,
)
#
billet_id = re.search(r"billet_id value=\"([A-Z0-9]+)\"", x).group(1)
context.Absences.deleteBilletAbsence(billet_id, REQUEST=REQUEST, dialog_confirmed=True)
j = context.Absences.listeBilletsEtud(
    etudid=etud["etudid"], REQUEST=REQUEST, format="json"
)
assert len(json.loads(j)) == 0
x = context.Absences.AddBilletAbsence(
    d_beg.isoformat(),
    d_end.isoformat(),
    description=description,
    etudid=etud["etudid"],
    REQUEST=REQUEST,
)
j = context.Absences.listeBilletsEtud(
    etudid=etud["etudid"], REQUEST=REQUEST, format="json"
)
assert json.loads(j)[0]["description"] == description