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

""""
Creation de 10 étudiants, formation, semestre, ue, module, absences le matin, l'apres midi, la journée compléte 
et justification d'absences, supression d'absences, création de listes d'absences, création de billet
et creation d'un groupe.

Fonction de l'API utilisé :
 - doSignaleAbsence
 - doJustifAbsence
 - AddBilletAbs
 - XMLgetBilletAbsence
 - listeBilletEtud
 - ListeAbsJust
 - CountAbsJust
 - ListAbsNonJust
 - ListJustifs
 - ListeAbsJour
 - ListAbsInRange

Fonction renvoyant du code HTML :
 - EtatAbsences
 - SignaleAbsenceGrSemestre
 - SignaleAbsenceGrHebdo
 - EtatAbsenceDate
 - AddBilletAbsenceForm
 - AnnuleAbsenceEtud
 - ProcessBilletAbsenceForm
 - JustifAbsenceEtud
 - doAnnuleJustif

"""

import random

# 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_abs
import sco_abs_views
import sco_abs_notification
import ZAbsences

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

# --- Création d'étudiants
etuds = [G.create_etud(code_nip=None) for _ in range(10)]

# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
    matiere_id=mat["matiere_id"],
    code="TSM1",
    coefficient=1.0,
    titre="module test",
    ue_id=ue["ue_id"],  # faiblesse de l'API
    formation_id=f["formation_id"],  # faiblesse de l'API
)

# --- Mise place d'un semestre
sem = G.create_formsemestre(
    formation_id=f["formation_id"],
    semestre_id=1,
    date_debut="01/01/2021",
    date_fin="30/06/2021",
)

mi = G.create_moduleimpl(
    module_id=mod["module_id"],
    formsemestre_id=sem["formsemestre_id"],
    responsable_id="bach",
)

# --- Inscription des étudiants
for etud in etuds:
    G.inscrit_etudiant(sem, etud)

# --- Création d'un groupe

_ = sco_groups.partition_create(context.Scolarite, formsemestre_id=sem["formsemestre_id"], partition_name="Eleve", REQUEST=REQUEST)
li1 = sco_groups.get_partitions_list(context.Scolarite, sem["formsemestre_id"])
_ = sco_groups.createGroup(context.Scolarite, li1[0]["partition_id"], "Groupe 1", REQUEST=REQUEST)

# --- Affectation des élèves dans des groupes

li_grp1 = sco_groups.get_partition_groups(context.Scolarite, li1[0])
for etud in etuds :
    sco_groups.set_group(context.Scolarite, etud["etudid"], li_grp1[0]["group_id"])

# --- Saisie absences
etudid = etuds[0]["etudid"]

for debut, fin, demijournee in [
    ("15/01/2021", "15/01/2021", 1),
    ("18/01/2021", "18/01/2021", 0),
    ("19/01/2021", "19/01/2021", 2),
    ("22/01/2021", "22/01/2021", 1)
] :
    sco_abs_views.doSignaleAbsence(context.Absences, datedebut=debut, datefin=fin, demijournee=demijournee, etudid=etudid, REQUEST=REQUEST)

_ = sco_abs_views.doSignaleAbsence(
    context.Absences,
    "22/01/2021",
    "22/01/2021",
    demijournee=1,
    etudid=etuds[1]["etudid"],
    REQUEST=REQUEST,
)

# --- Justification de certaines absences

for  debut, fin, demijournee in [
    ("15/01/2021", "15/01/2021", 1),
    ("18/01/2021", "18/01/2021", 0),
    ("19/01/2021", "19/01/2021", 2)
] :
    sco_abs_views.doJustifAbsence(context.Absences, datedebut=debut, datefin=fin, demijournee=demijournee, etudid=etudid, REQUEST=REQUEST)

# --- Test

_ = context.Absences.doSignaleAbsenceGrSemestre(
        dates="2021-01-13,2021-01-25",
        etudids= etuds[5]["etudid"]+","+etuds[6]["etudid"],
        destination="",
        REQUEST=REQUEST
    )  #  <----- rien ne se passe (pb parametre ?)

# --- Création de billets 

b1 = context.Absences.AddBilletAbsence(
        begin="2021-01-22 00:00",
        end="2021-01-22 23:59",
        etudid=etudid,
        description = "abs du 22",
        justified=False,
        code_nip=etuds[0]["code_nip"],
        code_ine=etuds[0]["code_ine"],
        REQUEST=REQUEST,
    )

b2 = context.Absences.AddBilletAbsence(
        begin="2021-01-15 00:00",
        end="2021-01-15 23:59",
        etudid=etudid,
        description = "abs du 15",
        code_nip=etuds[0]["code_nip"],
        code_ine=etuds[0]["code_ine"],
        REQUEST=REQUEST,
    )

# --- XMLgetBilletEtud

xml_bi = context.Absences.XMLgetBilletsEtud(etudid=etudid, REQUEST=REQUEST)
print(1)
print(xml_bi)
print(1)

# --- Supression de billet 
li_bi = context.Absences.listeBilletsEtud(etudid=etudid, REQUEST=REQUEST, format="json")
load_li_bi = json.loads(li_bi)

#_ = context.Absences.deleteBilletAbsence(load_li_bi[1]["billet_id"], REQUEST=REQUEST)

li_bi2 = context.Absences.listeBilletsEtud(etudid=etudid, REQUEST=REQUEST, format="json")
load_li_bi2 = json.loads(li_bi)

#assert len(load_li_bi2) == 1
#assert load_li_bi2[0]["description"] == "abs du 22"

# --- Créaton de listes

li_abs_just = context.Absences.ListeAbsJust(etudid = etudid, datedebut="01/01/2021")
nb_abs_just = context.Absences.CountAbsJust(etudid, debut="01/01/2021", fin="06/30/2021")
assert len(li_abs_just) == nb_abs_just
assert li_abs_just[0]["etudid"] == etudid
assert li_abs_just[0]["matin"] == True
assert li_abs_just[0]["jour"] == datetime.date(2021, 1, 15)
assert li_abs_just[2]["jour"] == datetime.date(2021, 1, 19)
assert li_abs_just[2]["matin"] == False


li_abs_njust = context.Absences.ListeAbsNonJust(etudid=etudid, datedebut="01/01/2021")
nb_abs = context.Absences.CountAbs(etudid, debut="01/01/2021", fin="06/30/2021")
assert len(li_abs_njust) == nb_abs - nb_abs_just
assert li_abs_njust[0]["matin"] == True
assert li_abs_njust[0]["etudid"] == etudid
assert li_abs_njust[0]["jour"] == datetime.date(2021, 1, 22)


li_just = context.Absences.ListeJustifs(etudid=etudid, datedebut="01/01/2021")
assert len(li_just) == 4
li_just2 = context.Absences.ListeJustifs(etudid=etudid, datedebut="01/01/2021", datefin="01/18/2021")
assert len(li_just2) == 2


li_jour = context.Absences.ListeAbsJour(date="01/22/2021")
assert len(li_jour) == 2
li_jour2 = context.Absences.ListeAbsJour(date="01/18/2021")
assert len(li_jour2) == 1


li_range = context.Absences.ListAbsInRange(etudid, debut="01/01/2021", fin="06/01/2021")
assert len(li_range) == 5

#li_xml = context.Absences.XMLgetAbsEtud(beg_date="01/01/2021", end_date="01/06/2021", REQUEST=REQUEST)
#print(li_xml)  need etudid 

# --- Annulation d'absence

#context.Absences.AnnuleAbsencesDatesNoJust(etudid, dates="22/01/2021", REQUEST=REQUEST)


# --- Fonction renvoyant du code HTML

etat_abs = context.Absences.EtatAbsences(REQUEST=REQUEST)

#cal_abs = sco_abs_views.CalAbs(context.Absences, REQUEST=REQUEST)  #<--- retourne html + need etudid : how?

sag = context.Absences.SignaleAbsenceGrSemestre(
        datedebut="15/01/2021",
        datefin="22/01/2021",
        group_ids=[li_grp1[0]["group_id"]],
        REQUEST=REQUEST,
    )

sagh = context.Absences.SignaleAbsenceGrHebdo(
        datelundi="18/01/2021", group_ids=[li_grp1[0]["group_id"]], destination="", REQUEST=REQUEST
    )

grp_abs_d = context.Absences.EtatAbsencesDate(group_ids=[li_grp1[0]["group_id"]], date="22/01/2021", REQUEST=REQUEST)

billet_form = context.Absences.AddBilletAbsenceForm(etudid=etudid, REQUEST=REQUEST)

#an_abs = AnnuleAbsenceEtud(context.Absences, REQUEST=REQUEST)   #<- retourne html + need etudid : how?

#proc = context.Absences.ProcessBilletAbsenceForm(billet_id=load_li_bi[0]["billet_id"], REQUEST=REQUEST) #error

#just_form = sco_abs_views.JustifAbsenceEtud(context.Absences, REQUEST=REQUEST)

#delete_just = sco_abs_views.doAnnuleJustif(context.Absences, datedebut0="22/01/2021", datefin0="22/01/2021", demijournee=2, REQUEST=REQUEST)


"""
Commentaire :

Certaines fonctions ont besoin de l'id de l'étudiant mais n'ont pas ce parametre comment le récupérer ?
(CalAbs, SignaleAbsenceEtud, AnnuleAbsenceEtud, JustifAbsenceEtud, doAnnuleJustif, XMLgetAbsEtud)

D'autres fonctions renvoient du HTML -> comment les tester en python?

doSignaleAbsenceGrSemestre -> ne fonctionne pas (pb au niveau de l'écriture des parametres au lancement 
                              de la fonction?)

XMLgetBilletsEtud, deleteBilletAbsence -> fonction get ne retourne rien et delete ne supprime rien
                                          (lancer fichier test_billet)

AnnuleAbsencesDatesNoJust -> error line 323, jour='2'  (2 doit être un int et non un string?)

"""