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

"""Jury BUT: affichage/formulaire
"""
from flask import g, url_for
from app.models.etudiants import Identite

from app.scodoc import sco_utils as scu
from app.but.jury_but import DecisionsProposeesAnnee, DecisionsProposeesUE
from app.models import FormSemestre, FormSemestreInscription, UniteEns
from app.scodoc.sco_exceptions import ScoValueError


def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str:
    """Affichage des décisions annuelles BUT
    Si pas read_only, menus sélection codes jury.
    """
    H = []
    if deca.code_valide and not read_only:
        erase_span = f"""<a href="{
            url_for("notes.formsemestre_jury_but_erase", 
            scodoc_dept=g.scodoc_dept, formsemestre_id=deca.formsemestre_id, 
            etudid=deca.etud.id)}" class="stdlink">effacer décisions</a>"""
    else:
        erase_span = ""

    H.append(
        f"""<div class="but_section_annee">
        <div>
        <b>Décision de jury pour l'année :</b> {
            _gen_but_select("code_annee", deca.codes, deca.code_valide,
                disabled=True, klass="manual")
        }
        <span>({'non ' if deca.code_valide is None else ''}enregistrée)</span>
        <span>{erase_span}</span>
        </div>
        <div class="but_explanation">{deca.explanation}</div>
    </div>"""
    )

    H.append(
        f"""
    <div><b>Niveaux de compétences et unités d'enseignement :</b></div>
    <div class="but_annee">
    <div class="titre"></div>
    <div class="titre">S{1}</div>
    <div class="titre">S{2}</div>
    <div class="titre">RCUE</div>
    """
    )
    for niveau in deca.niveaux_competences:
        H.append(
            f"""<div class="but_niveau_titre">
            <div title="{niveau.competence.titre_long}">{niveau.competence.titre}</div>
            </div>"""
        )
        dec_rcue = deca.decisions_rcue_by_niveau.get(niveau.id)
        if dec_rcue is None:
            break
        # Semestre impair
        H.append(
            _gen_but_niveau_ue(
                dec_rcue.rcue.ue_1,
                dec_rcue.rcue.moy_ue_1,
                deca.decisions_ues[dec_rcue.rcue.ue_1.id],
                disabled=read_only,
            )
        )
        # Semestre pair
        H.append(
            _gen_but_niveau_ue(
                dec_rcue.rcue.ue_2,
                dec_rcue.rcue.moy_ue_2,
                deca.decisions_ues[dec_rcue.rcue.ue_2.id],
                disabled=read_only,
            )
        )
        # RCUE
        H.append(
            f"""<div class="but_niveau_rcue
            {'recorded' if dec_rcue.code_valide is not None else ''}
            ">
            <div class="but_note">{scu.fmt_note(dec_rcue.rcue.moy_rcue)}</div>
            <div class="but_code">{
                _gen_but_select("code_rcue_"+str(niveau.id),
                    dec_rcue.codes,
                    dec_rcue.code_valide,
                    disabled=True, klass="manual"
                )
            }</div>
            </div>"""
        )
    H.append("</div>")  # but_annee
    return "\n".join(H)


def _gen_but_select(
    name: str,
    codes: list[str],
    code_valide: str,
    disabled: bool = False,
    klass: str = "",
) -> str:
    "Le menu html select avec les codes"
    h = "\n".join(
        [
            f"""<option value="{code}" 
            {'selected' if code == code_valide else ''}
            class="{'recorded' if code == code_valide else ''}"
            >{code}</option>"""
            for code in codes
        ]
    )
    return f"""<select required name="{name}" 
        class="but_code {klass}" 
        onchange="change_menu_code(this);"
        {"disabled" if disabled else ""}
        >{h}</select>
        """


def _gen_but_niveau_ue(
    ue: UniteEns, moy_ue: float, dec_ue: DecisionsProposeesUE, disabled=False
):
    return f"""<div class="but_niveau_ue {
        'recorded' if dec_ue.code_valide is not None else ''}
        ">
    <div title="{ue.titre}">{ue.acronyme}</div>
    <div class="but_note">{scu.fmt_note(moy_ue)}</div>
    <div class="but_code">{
        _gen_but_select("code_ue_"+str(ue.id), 
            dec_ue.codes, 
            dec_ue.code_valide, disabled=disabled
        )
    }</div>
    </div>"""


#
def infos_fiche_etud_html(etudid: int) -> str:
    """Section html pour fiche etudiant
    provisoire pour BUT 2022
    """
    etud: Identite = Identite.query.get_or_404(etudid)
    inscriptions = (
        FormSemestreInscription.query.join(FormSemestreInscription.formsemestre)
        .filter(
            FormSemestreInscription.etudid == etud.id,
        )
        .order_by(FormSemestre.date_debut)
    )
    formsemestres_but = [
        i.formsemestre for i in inscriptions if i.formsemestre.formation.is_apc()
    ]
    if len(formsemestres_but) == 0:
        return ""

    # temporaire quick & dirty: affiche le dernier
    try:
        deca = DecisionsProposeesAnnee(etud, formsemestres_but[-1])
        if len(deca.rcues_annee) > 0:
            return f"""<div class="infos_but">
            {show_etud(deca, read_only=True)}
            </div>
            """
    except ScoValueError:
        pass

    return ""
