############################################### Partitions ############################################################
from flask import jsonify

from app import models
from app.api import bp

from app.api.errors import error_response
from app.api.auth import token_permission_required
from app.scodoc.sco_groups import get_group_members, setGroups, get_partitions_list
from app.scodoc.sco_permissions import Permission


@bp.route("/partitions/<int:formsemestre_id>", methods=["GET"])
@token_permission_required(Permission.APIView)
def partition(formsemestre_id: int):
    """
    Retourne la liste de toutes les partitions d'un formsemestre

    formsemestre_id : l'id d'un formsemestre

    Exemple de résultat :
        [
          {
            "partition_id": 2,
            "id": 2,
            "formsemestre_id": 1,
            "partition_name": "TD",
            "numero": 1,
            "bul_show_rank": false,
            "show_in_lists": true
          },
          {
            "partition_id": 1,
            "id": 1,
            "formsemestre_id": 1,
            "partition_name": null,
            "numero": 0,
            "bul_show_rank": false,
            "show_in_lists": true
          }
        ]
    """
    # # Récupération de toutes les partitions
    # partitions = models.Partition.query.filter_by(id=formsemestre_id)
    #
    # # Mise en forme des données
    # data = [partition.to_dict() for partition in partitions]

    data = get_partitions_list(formsemestre_id)

    return jsonify(data)


@bp.route("/partitions/groups/<int:group_id>", methods=["GET"])
@bp.route("/partitions/groups/<int:group_id>/etat/<string:etat>", methods=["GET"])
@token_permission_required(Permission.APIView)
def etud_in_group(group_id: int, etat=None):
    """
    Retourne la liste des étudiants dans un groupe

    group_id : l'id d'un groupe
    etat : état de l'inscription

    Exemple de résultat :
        [
          {
            "etudid": 10,
            "id": 10,
            "dept_id": 1,
            "nom": "BOUTET",
            "prenom": "Marguerite",
            "nom_usuel": "",
            "civilite": "F",
            "date_naissance": null,
            "lieu_naissance": null,
            "dept_naissance": null,
            "nationalite": null,
            "statut": null,
            "boursier": null,
            "photo_filename": null,
            "code_nip": "10",
            "code_ine": "10",
            "scodoc7_id": null,
            "email": "MARGUERITE.BOUTET@example.com",
            "emailperso": null,
            "domicile": null,
            "codepostaldomicile": null,
            "villedomicile": null,
            "paysdomicile": null,
            "telephone": null,
            "telephonemobile": null,
            "fax": null,
            "typeadresse": "domicile",
            "description": null,
            "group_id": 1,
            "etat": "I",
            "civilite_str": "Mme",
            "nom_disp": "BOUTET",
            "nomprenom": "Mme Marguerite BOUTET",
            "ne": "e",
            "email_default": "MARGUERITE.BOUTET@example.com"
          },
          ...
        ]
    """
    # Fonction utilisée : app.scodoc.sco_groups.get_group_members()

    if etat is None:
        data = get_group_members(group_id)
    else:
        data = get_group_members(group_id, etat)

    if len(data) == 0:
        return error_response(
            409,
            message="La requête ne peut être traitée en l’état actuel. \n"
            "Aucun groupe ne correspond au 'group_id' renseigné",
        )

    return jsonify(data)


@bp.route(
    "/partitions/set_groups/partition/<int:partition_id>/groups/<string:groups_id>/delete/<string:groups_to_delete>"
    "/create/<string:groups_to_create>",
    methods=["POST"],
)
@token_permission_required(Permission.APIEtudChangeGroups)
def set_groups(
    partition_id: int, groups_lists: str, groups_to_delete: str, groups_to_create: str
):
    """
    Set les groups

    partition_id : l'id d'une partition
    groups_lists : membres de chaque groupe existant
    groups_ti_delete : les groupes à supprimer
    groups_to_create : les groupes à créer
    """
    # Fonction utilisée : app.scodoc.sco_groups.setGroups()
    try:
        # Utilisation de la fonction setGroups
        setGroups(partition_id, groups_lists, groups_to_create, groups_to_delete)
        return error_response(200, message="Groups set")
    except ValueError:
        return error_response(
            409,
            message="La requête ne peut être traitée en l’état actuel. \n"
            "Veillez vérifier la conformité des éléments passé en paramètres",
        )
