############################################### Departements ##########################################################
import app

from app import models
from app.api import bp
from app.api.auth import token_permission_required
from app.api.errors import error_response
from app.scodoc.sco_permissions import Permission

from flask import jsonify


@bp.route("/departements", methods=["GET"])
@token_permission_required(Permission.APIView)
def departements():
    """
    Retourne la liste des ids de départements visibles

    Exemple de résultat :
        [
          {
            "id": 1,
            "acronym": "TAPI",
            "description": null,
            "visible": true,
            "date_creation": "Fri, 15 Apr 2022 12:19:28 GMT"
          },
          {
            "id": 2,
            "acronym": "MMI",
            "description": null,
            "visible": false,
            "date_creation": "Fri, 18 Apr 2022 11:20:8 GMT"
          },
          ...
        ]
    """
    # Récupération de tous les départements
    depts = models.Departement.query.all()

    # Mise en place de la liste avec tous les départements
    data = [d.to_dict() for d in depts]

    return jsonify(data)


@bp.route("/departements/<string:dept>/etudiants/liste", methods=["GET"])
@bp.route(
    "/departements/<string:dept>/etudiants/liste/<int:formsemestre_id>", methods=["GET"]
)
@token_permission_required(Permission.APIView)
def liste_etudiants(dept: str, formsemestre_id=None):
    """
    Retourne la liste des étudiants d'un département

    dept: l'acronym d'un département
    formsemestre_id: l'id d'un formesemestre

    Exemple de résultat :
        [
            {
                "civilite": "X",
                "code_ine": null,
                "code_nip": null,
                "date_naissance": null,
                "email": null,
                "emailperso": null,
                "etudid": 18,
                "nom": "MOREL",
                "prenom": "JACQUES"
            },
            {
                "civilite": "X",
                "code_ine": null,
                "code_nip": null,
                "date_naissance": null,
                "email": null,
                "emailperso": null,
                "etudid": 19,
                "nom": "FOURNIER",
                "prenom": "ANNE"
            },
            ...
        ]
    """
    # Si le formsemestre_id a été renseigné
    if formsemestre_id is not None:
        # Récupération du formsemestre
        formsemestre = models.FormSemestre.query.filter_by(
            id=formsemestre_id
        ).first_or_404()
        # Récupération du département
        departement = formsemestre.departement

    # Si le formsemestre_id n'a pas été renseigné
    else:
        # Récupération du formsemestre
        departement = models.Departement.query.filter_by(acronym=dept).first_or_404()

    # Récupération des étudiants
    etudiants = departement.etudiants.all()

    # Mise en forme des données
    list_etu = [etu.to_dict_bul(include_urls=False) for etu in etudiants]

    return jsonify(list_etu)


@bp.route("/departements/<string:dept>/semestres_courants", methods=["GET"])
@token_permission_required(Permission.APIView)
def liste_semestres_courant(dept: str):
    """
    Liste des semestres actifs d'un départements donné

    dept: l'acronym d'un département

    Exemple de résultat :
        [
          {
            "titre": "master machine info",
            "gestion_semestrielle": false,
            "scodoc7_id": null,
            "date_debut": "01/09/2021",
            "bul_bgcolor": null,
            "date_fin": "15/12/2022",
            "resp_can_edit": false,
            "dept_id": 1,
            "etat": true,
            "resp_can_change_ens": false,
            "id": 1,
            "modalite": "FI",
            "ens_can_edit_eval": false,
            "formation_id": 1,
            "gestion_compensation": false,
            "elt_sem_apo": null,
            "semestre_id": 1,
            "bul_hide_xml": false,
            "elt_annee_apo": null,
            "block_moyennes": false,
            "formsemestre_id": 1,
            "titre_num": "master machine info semestre 1",
            "date_debut_iso": "2021-09-01",
            "date_fin_iso": "2022-12-15",
            "responsables": [
              3,
              2
            ]
          },
          ...
        ]
    """
    # Récupération des départements comportant l'acronym mit en paramètre
    dept = models.Departement.query.filter_by(acronym=dept).first_or_404()

    # Récupération des semestres suivant id_dept
    semestres = models.FormSemestre.query.filter_by(dept_id=dept.id, etat=True)

    # Mise en forme des données
    data = [d.to_dict() for d in semestres]

    return jsonify(data)


@bp.route(
    "/departements/<string:dept>/formations/<int:formation_id>/referentiel_competences",
    methods=["GET"],
)
@token_permission_required(Permission.APIView)
def referenciel_competences(dept: str, formation_id: int):
    """
    Retourne le référentiel de compétences

    dept : l'acronym d'un département
    formation_id : l'id d'une formation
    """
    dept = models.Departement.query.filter_by(acronym=dept).first_or_404()

    formation = models.Formation.query.filter_by(
        id=formation_id, dept_id=dept.id
    ).first_or_404()

    ref_comp = formation.referentiel_competence_id

    if ref_comp is None:
        return error_response(
            204, message="Pas de référenciel de compétences pour cette formation"
        )
    else:
        return jsonify(ref_comp)
