########################################## Formsemestres ##############################################################
from flask import jsonify

import app
from app import models
from app.api import bp
from app.api.errors import error_response
from app.api.auth import token_auth, token_permission_required
from app.api.tools import get_etu_from_request
from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud
from app.scodoc.sco_permissions import Permission
from app.scodoc.sco_pvjury import formsemestre_pvjury
from app.scodoc.sco_recapcomplet import (
    formsemestre_recapcomplet,
    gen_formsemestre_recapcomplet_json,
)


@bp.route("/formations/formsemestre/<int:formsemestre_id>", methods=["GET"])
@token_permission_required(Permission.APIView)
def formsemestre(formsemestre_id: int):
    """
    Retourne l'information sur le formsemestre correspondant au formsemestre_id

    formsemestre_id : l'id d'un formsemestre

    """
    # Récupération de tous les formsemestres
    formsemetre = models.FormSemestre.query.filter_by(id=formsemestre_id).first()

    # Mise en forme des données
    data = formsemetre.to_dict()

    return jsonify(data)


@bp.route(
    "/formsemestre/<int:formsemestre_id>/departements/<string:dept>/etudiant/etudid/<int:etudid>/bulletin",
    methods=["GET"],
)
@bp.route(
    "/formsemestre/<int:formsemestre_id>/departements/<string:dept>/etudiant/nip/<int:nip>/bulletin",
    methods=["GET"],
)
@bp.route(
    "/formsemestre/<int:formsemestre_id>/departements/<string:dept>/etudiant/ine/<int:ine>/bulletin",
    methods=["GET"],
)
@token_permission_required(Permission.APIView)
def etudiant_bulletin(
    formsemestre_id,
    dept,
    format="json",
    etudid: int = None,
    nip: int = None,
    ine: int = None,
):  # *args, size
    """
    Retourne le bulletin de note d'un étudiant

    formsemestre_id : l'id d'un formsemestre
    etudid : l'etudid d'un étudiant
    nip : le code nip d'un étudiant
    ine : le code ine d'un étudiant
    """
    # Fonction utilisée : app.scodoc.sco_bulletins.formsemestre_billetinetud_dict()

    # make_json_formsemestre_bulletinetud

    try:
        app.set_sco_dept(dept)
    except:
        return error_response(
            409,
            message="La requête ne peut être traitée en l’état actuel.\n "
            "Veilliez vérifier que le nom de département est valide",
        )
    if etudid is None:
        # Récupération de l'étudiant
        try:
            etu = get_etu_from_request(etudid, nip, ine)
            etudid = etu.etudid
        except AttributeError:
            return error_response(
                409,
                message="La requête ne peut être traitée en l’état actuel.\n "
                "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide",
            )

    data = make_json_formsemestre_bulletinetud(formsemestre_id, etudid)

    return data

    # if args[0] == "short":
    #     data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0])
    # elif args[0] == "selectevals":
    #     data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0])
    # elif args[0] == "long":
    #     data = formsemestre_bulletinetud_dict(formsemestre_id, etudid)
    # else:
    #     return error_response(409, message="La requête ne peut être traitée en l’état actuel")
    #
    # return jsonify(data)


@bp.route(
    "/formsemestre/<int:formsemestre_id>/bulletins", methods=["GET"]
)  # XXX TODO à revoir
@token_permission_required(Permission.APIView)
def bulletins(formsemestre_id: int):
    """
    Retourne les bulletins d'un formsemestre donné

    formsemestre_id : l'id d'un formesemestre
    """
    # Fonction utilisée : app.scodoc.sco_recapcomplet.formsemestre_recapcomplet()
    # gen_formsemestre_recapcomplet_json ??

    try:
        # Utilisation de la fonction formsemestre_recapcomplet
        # data = formsemestre_recapcomplet(formsemestre_id)
        data = gen_formsemestre_recapcomplet_json(formsemestre_id)
    except AttributeError:
        return error_response(
            409,
            message="La requête ne peut être traitée en l’état actuel. \n"
            "Veillez vérifier la conformité du 'formation_id'",
        )

    return jsonify(data)


@bp.route("/formsemestre/<int:formsemestre_id>/jury", methods=["GET"])
@token_permission_required(Permission.APIView)
def jury(formsemestre_id: int):
    """
    Retourne le récapitulatif des décisions jury

    formsemestre_id : l'id d'un formsemestre
    """
    # Fonction utilisée : app.scodoc.sco_pvjury.formsemestre_pvjury()

    try:
        # Utilisation de la fonction formsemestre_pvjury
        data = formsemestre_pvjury(formsemestre_id)
    except AttributeError:
        return error_response(
            409,
            message="La requête ne peut être traitée en l’état actuel. \n"
            "Veillez vérifier la conformité du 'formation_id'",
        )

    return jsonify(data)