##############################################" Formations ############################################################
from flask import jsonify

from app import models
from app.api import bp
from app.api.errors import error_response
from app.decorators import permission_required
from app.scodoc.sco_formations import formation_export
from app.scodoc.sco_moduleimpl import moduleimpl_list
from app.scodoc.sco_permissions import Permission


@bp.route("/formations", methods=["GET"])
@permission_required(Permission.APIView)
def formations():
    """
    Retourne la liste des formations
    """
    # Récupération de toutes les formations
    list_formations = models.Formation.query.all()

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

    return jsonify(data)


@bp.route("/formations/<int:formation_id>", methods=["GET"])
@permission_required(Permission.APIView)
def formations_by_id(formation_id: int):
    """
    Retourne une formation en fonction d'un id donné

    formation_id : l'id d'une formation
    """
    # Récupération de la formation
    forma = models.Formation.query.filter_by(id=formation_id).first()

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

    return jsonify(data)


@bp.route("/formations/formation_export/<int:formation_id>", methods=["GET"])
@permission_required(Permission.APIView)
def formation_export_by_formation_id(formation_id: int, export_ids=False):
    """
    Retourne la formation, avec UE, matières, modules
    """
    # Fonction utilité : app.scodoc.sco_formations.formation_export()

    try:
        # Utilisation de la fonction formation_export
        data = formation_export(formation_id)
    except ValueError:
        return error_response(409, message="La requête ne peut être traitée en l’état actuel")

    return jsonify(data)


@bp.route("/formations/apo/<string:etape_apo>", methods=["GET"])
@permission_required(Permission.APIView)
def formsemestre_apo(etape_apo: int):
    """
    Retourne les informations sur les formsemestres

    etape_apo : l'id d'une étape apogée
    """
    # Récupération des formsemestres
    apos = models.FormSemestreEtape.query.filter_by(etape_apo=etape_apo).all()

    data = []
    # Filtre les formsemestres correspondant + mise en forme des données
    for apo in apos:
        formsem = models.FormSemestre.query.filter_by(id=apo["formsemestre_id"]).first()
        data.append(formsem.to_dict())

    return jsonify(data)
    # return error_response(501, message="Not implemented")


@bp.route("/formations/moduleimpl/<int:moduleimpl_id>", methods=["GET"])
@permission_required(Permission.APIView)
def moduleimpls(moduleimpl_id: int):
    """
    Retourne la liste des moduleimpl

    moduleimpl_id : l'id d'un moduleimpl
    """
    # Récupération des tous les moduleimpl
    list_moduleimpls = models.ModuleImpl.query.filter_by(id=moduleimpl_id).all()

    # Mise en forme des données
    data = list_moduleimpls[0].to_dict()

    return jsonify(data)


@bp.route("/formations/moduleimpl/<int:moduleimpl_id>/formsemestre/<int:formsemestre_id>", methods=["GET"])
@permission_required(Permission.APIView)
def moduleimpls_sem(moduleimpl_id: int, formsemestre_id: int):
    """
    Retourne la liste des moduleimpl d'un semestre

    moduleimpl_id : l'id d'un moduleimpl
    formsemestre_id : l'id d'un formsemestre
    """
    # Fonction utilisée : app.scodoc.sco_moduleimpl.moduleimpl_list()

    try:
        # Utilisation de la fonction moduleimpl_list
        data = moduleimpl_list(moduleimpl_id, formsemestre_id)
    except ValueError:
        return error_response(409, message="La requête ne peut être traitée en l’état actuel")

    return jsonify(data)