##############################################################################
#
# ScoDoc
#
# Copyright (c) 1999 - 2024 Emmanuel Viennet.  All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#   Emmanuel Viennet      emmanuel.viennet@viennet.net
#
##############################################################################

"""Édition formation APC (BUT)
"""

from flask.templating import render_template

from app import db
from app.but import apc_edit_ue
from app.models import UniteEns, Matiere, Module, FormSemestre, ModuleImpl
from app.models.validations import ScolarFormSemestreValidation
from app.scodoc import codes_cursus
import app.scodoc.sco_utils as scu
from app.scodoc import sco_groups
from app.scodoc.sco_utils import ModuleType


def html_edit_formation_apc(
    formation,
    semestre_idx=None,
    editable=True,
    tag_editable=True,
):
    """Formulaire html pour visualisation ou édition d'une formation APC.
    - Les UEs
    - Les ressources
    - Les SAÉs
    """
    cursus = formation.get_cursus()
    assert cursus.APC_SAE

    ressources = formation.modules.filter_by(module_type=ModuleType.RESSOURCE).order_by(
        Module.semestre_id, Module.numero, Module.code
    )
    saes = formation.modules.filter_by(module_type=ModuleType.SAE).order_by(
        Module.semestre_id, Module.numero, Module.code
    )
    if semestre_idx is None:
        semestre_ids = range(1, cursus.NB_SEM + 1)
    else:
        semestre_ids = [semestre_idx]
    other_modules = formation.modules.filter(
        Module.module_type.is_distinct_from(ModuleType.SAE),
        Module.module_type.is_distinct_from(ModuleType.RESSOURCE),
    ).order_by(
        Module.semestre_id, Module.module_type.desc(), Module.numero, Module.code
    )

    ues_by_sem = {}
    ects_by_sem = {}
    for semestre_idx in semestre_ids:
        ues_by_sem[semestre_idx] = formation.ues.filter_by(
            semestre_idx=semestre_idx
        ).order_by(UniteEns.semestre_idx, UniteEns.numero, UniteEns.acronyme)
        ects = [
            ue.ects
            for ue in ues_by_sem[semestre_idx]
            if ue.type != codes_cursus.UE_SPORT
        ]
        if None in ects:
            ects_by_sem[semestre_idx] = '<span class="missing_ue_ects">manquant</span>'
        else:
            ects_by_sem[semestre_idx] = f"{sum(ects):g}"

    arrow_up, arrow_down, arrow_none = sco_groups.get_arrow_icons_tags()

    icons = {
        "arrow_up": arrow_up,
        "arrow_down": arrow_down,
        "arrow_none": arrow_none,
        "delete": scu.icontag(
            "delete_small_img",
            title="Supprimer (module inutilisé)",
            alt="supprimer",
        ),
        "delete_disabled": scu.icontag(
            "delete_small_dis_img",
            title="Suppression impossible (utilisé dans des semestres)",
        ),
    }

    H = [
        render_template(
            "pn/form_ues.j2",
            formation=formation,
            semestre_ids=semestre_ids,
            editable=editable,
            tag_editable=tag_editable,
            icons=icons,
            ues_by_sem=ues_by_sem,
            ects_by_sem=ects_by_sem,
            scu=scu,
            codes_cursus=codes_cursus,
        ),
    ]
    for semestre_idx in semestre_ids:
        ressources_in_sem = ressources.filter_by(semestre_id=semestre_idx)
        saes_in_sem = saes.filter_by(semestre_id=semestre_idx)
        other_modules_in_sem = other_modules.filter_by(semestre_id=semestre_idx)
        matiere_parent = Matiere.query.filter(
            Matiere.ue_id == UniteEns.id,
            UniteEns.formation_id == formation.id,
            UniteEns.semestre_idx == semestre_idx,
            UniteEns.type != codes_cursus.UE_SPORT,
        ).first()
        H += [
            render_template(
                "pn/form_mods.j2",
                formation=formation,
                titre=f"Ressources du S{semestre_idx}",
                create_element_msg="créer une nouvelle ressource",
                # matiere_parent=matiere_parent,
                modules=ressources_in_sem,
                module_type=ModuleType.RESSOURCE,
                editable=editable,
                tag_editable=tag_editable,
                icons=icons,
                scu=scu,
                semestre_id=semestre_idx,
            )
            if ues_by_sem[semestre_idx].count() > 0
            else "",
            render_template(
                "pn/form_mods.j2",
                formation=formation,
                titre=f"Situations d'Apprentissage et d'Évaluation (SAÉs) S{semestre_idx}",
                create_element_msg="créer une nouvelle SAÉ",
                # matiere_parent=matiere_parent,
                modules=saes_in_sem,
                module_type=ModuleType.SAE,
                editable=editable,
                tag_editable=tag_editable,
                icons=icons,
                scu=scu,
                semestre_id=semestre_idx,
            )
            if ues_by_sem[semestre_idx].count() > 0
            else "",
            render_template(
                "pn/form_mods.j2",
                formation=formation,
                titre=f"Autres modules (non BUT) du S{semestre_idx}",
                create_element_msg="créer un nouveau module",
                modules=other_modules_in_sem,
                module_type=ModuleType.STANDARD,
                editable=editable,
                tag_editable=tag_editable,
                icons=icons,
                scu=scu,
                semestre_id=semestre_idx,
            )
            if ues_by_sem[semestre_idx].count() > 0
            else """<span class="fontred">créer une UE pour pouvoir ajouter des modules</span>""",
        ]

    return "\n".join(H)


def html_ue_infos(ue):
    """Page d'information sur une UE"""
    from app.views import ScoData

    formsemestres = (
        db.session.query(FormSemestre)
        .filter(
            ue.id == Module.ue_id,
            Module.id == ModuleImpl.module_id,
            FormSemestre.id == ModuleImpl.formsemestre_id,
        )
        .all()
    )
    nb_etuds_valid_ue = ScolarFormSemestreValidation.query.filter_by(
        ue_id=ue.id
    ).count()
    can_safely_be_suppressed = (
        (nb_etuds_valid_ue == 0)
        and (len(formsemestres) == 0)
        and ue.modules.count() == 0
        and ue.matieres.count() == 0
    )
    return render_template(
        "pn/ue_infos.j2",
        titre=f"UE {ue.acronyme} {ue.titre}",
        ue=ue,
        formsemestres=formsemestres,
        nb_etuds_valid_ue=nb_etuds_valid_ue,
        can_safely_be_suppressed=can_safely_be_suppressed,
        sco=ScoData(),
    )