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

"""Liste simple d'étudiants
"""

from flask import g, url_for
from app.models import Identite
from app.tables import table_builder as tb


class TableEtud(tb.Table):
    """Table listant des étudiants
    Peut-être sous-classée pour ajouter des colonnes.
    L'id de la ligne est etuid, et le row stocke etud.
    """

    def __init__(
        self,
        etuds: list[Identite] = None,
        classes: list[str] = None,
        row_class=None,
        with_foot_titles=False,
        **kwargs,
    ):
        self.rows: list["RowEtud"] = []  # juste pour que VSCode nous aide sur .rows
        classes = classes or ["gt_table", "gt_left"]
        super().__init__(
            row_class=row_class or RowEtud,
            classes=classes,
            with_foot_titles=with_foot_titles,
            **kwargs,
        )
        self.add_etuds(etuds)

    def add_etuds(self, etuds: list[Identite]):
        "Ajoute des étudiants à la table"
        for etud in etuds:
            row = self.row_class(self, etud)
            row.add_etud_cols()
            self.add_row(row)


class RowEtud(tb.Row):
    "Ligne de la table d'étudiants"
    # pour le moment très simple, extensible (codes, liens bulletins, ...)
    def __init__(self, table: TableEtud, etud: Identite, *args, **kwargs):
        super().__init__(table, etud.id, *args, **kwargs)
        self.etud = etud

    def add_etud_cols(self):
        """Ajoute colonnes étudiant: codes, noms"""
        etud = self.etud
        self.table.group_titles.update(
            {
                "etud_codes": "Codes",
                "identite_detail": "",
                "identite_court": "",
            }
        )
        # --- Codes (seront cachés, mais exportés en excel)
        # self.add_cell("etudid", "etudid", etud.id, "etud_codes")
        # self.add_cell(
        #     "code_nip",
        #     "code_nip",
        #     etud.code_nip or "",
        #     "etud_codes",
        # )

        # --- Identité étudiant
        # url_bulletin = url_for(
        #     "notes.formsemestre_bulletinetud",
        #     scodoc_dept=g.scodoc_dept,
        #     formsemestre_id=res.formsemestre.id,
        #     etudid=etud.id,
        # )
        url_bulletin = None  # pour extension future
        self.add_cell("civilite_str", "Civ.", etud.civilite_str, "identite_detail")
        self.add_cell(
            "nom_disp",
            "Nom",
            etud.nom_disp(),
            "identite_detail",
            data={"order": etud.sort_key},
            target=url_bulletin,
            target_attrs={"class": "etudinfo discretelink", "id": str(etud.id)},
        )
        self.add_cell("prenom", "Prénom", etud.prenom, "identite_detail")
        # self.add_cell(
        #     "nom_short",
        #     "Nom",
        #     etud.nom_short,
        #     "identite_court",
        #     data={
        #         "order": etud.sort_key,
        #         "etudid": etud.id,
        #         "nomprenom": etud.nomprenom,
        #     },
        #     target=url_bulletin,
        #     target_attrs={"class": "etudinfo", "id": str(etud.id)},
        # )


def etuds_sorted_from_ids(etudids) -> list[Identite]:
    "Liste triée d'etuds à partir d'une collections d'etudids"
    etuds = [Identite.get_etud(etudid) for etudid in etudids]
    return sorted(etuds, key=lambda etud: etud.sort_key)


def html_table_etuds(etudids) -> str:
    """Table HTML simple des étudiants indiqués"""
    etuds = etuds_sorted_from_ids(etudids)
    table = TableEtud(etuds)
    return table.html()