"""Vuews pour la gestion des fournisseurs."""

from django.shortcuts import render, redirect
from gestion_produit.models import Fournisseur, Categorie, Commander
from django.http import JsonResponse
from django.contrib.auth.decorators import login_required

from .forms import FournisseurForm


@login_required(login_url="login")
def index(request):
    """Gérez la vue index de la gestion des fournisseurs.

    Gère l'affichage de la liste des fournisseurs dans un tableau 
    à l'aide de tabulatorjs et l'enregistrement d'un nouveau fournisseur.

    Parameters
    ----------
    request : HttpRequest
        La requête HTTP entrante.

    Returns
    -------
    HttpResponse
        La réponse HTTP avec le formulaire de fournisseur.

    """
    if request.method == "POST":
        form = FournisseurForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()

    form = FournisseurForm()
    return render(
        request,
        "gestion_fournisseur/index.html",
        {"form": form, "listeCategorie": Categorie.objects.all()},
    )


@login_required(login_url="login")
def liste_fournisseurs(request):
    """Renvoyez la liste des fournisseurs au format JSON.

    Parameters
    ----------
    request : HttpRequest
        La requête HTTP entrante.

    Returns
    -------
        JsonResponse
        La réponse JSON contenant la liste des fournisseurs.

    """
    fournisseurs = Fournisseur.objects.all().order_by("-id")
    data = [
        {
            "id": f.id,
            "nom_entreprise": f.nom_entreprise,
            "representant": f.nom_prenom_representant,
            "fonction": f.fonction,
            "telephone": f.telephone,
            "email": f.email,
            "note": f.note,
        }
        for f in fournisseurs
    ]

    return JsonResponse(data, safe=False)


@login_required(login_url="login")
def liste_fournisseur_categorie(request):
    """Renvoyez la liste des fournisseurs par catégorie de produit fourni au format JSON.

    Parameters
    ----------
    request : HttpRequest
        La requête HTTP entrante.
        c : int
            L'identifiant de la catégorie de produit.

    Returns
    -------
        JsonResponse
        La réponse JSON contenant la liste des fournisseurs filtrés par
        catégorie.

    """
    categorie = Categorie.objects.get(id=request.GET["c"])
    fournisseur_categorie = Fournisseur.objects.filter(categorie=categorie)

    data = [
        {
            "id": f.id,
            "nom_entreprise": f.nom_entreprise,
            "representant": f.nom_prenom_representant,
            "fonction": f.fonction,
            "telephone": f.telephone,
            "email": f.email,
            "note": f.note,
        }
        for f in fournisseur_categorie
    ]

    return JsonResponse(data, safe=False)


@login_required(login_url="login")
def details_fournisseur(request, id_fournisseur):
    """Affichez les détails d'un fournisseur spécifique.

    Parameters
    ----------
    request : HttpRequest
        La requête HTTP entrante.
    id_fournisseur : int
        L'identifiant du fournisseur.

    Returns
    -------
        HttpResponse
        La réponse HTTP avec les détails du fournisseur.

    """
    fournisseur = Fournisseur.objects.get(id=id_fournisseur)
    fournisseur_form = FournisseurForm(instance=fournisseur)
    return render(
        request,
        "gestion_fournisseur/details_fournisseur.html",
        {
            "fournisseur": fournisseur,
            "fournisseurForm": fournisseur_form,
            "id_fournisseur": id_fournisseur,
        },
    )

@login_required(login_url="login")
def mise_a_jour_fournisseur(request, id_fournisseur):
    """Mettez à jour les informations d'un fournisseur spécifique.

    Parameters
    ----------
    request : HttpRequest
        La requête HTTP entrante.
    id_fournisseur : int
        L'identifiant du fournisseur.

    Returns
    -------
        HttpResponse
        La réponse HTTP redirigeant vers les détails du fournisseur.

    """
    fournisseur = Fournisseur.objects.get(id=id_fournisseur)
    if request.method == "POST":
        form = FournisseurForm(
            request.POST,
            request.FILES,
            instance=fournisseur
        )
        if form.is_valid():
            form.save()
            messages.success(request, "Fournisseur mis à jour avec succès.")
        else:
            messages.error(request, "Erreur lors de la mise à jour du fournisseur.")
    return redirect(
        "gestion_fournisseur:details_fournisseur",
        id_fournisseur=id_fournisseur
    )


def liste_livraison_fournisseur(request, id_fournisseur): # noqa: ARG001
    """Renvoyez la liste des livraisons d'un fournisseur au format JSON.

    Parameters
    ----------
    request : HttpRequest
        La requête HTTP entrante.
    id_fournisseur : int
        L'identifiant du fournisseur.

    Returns
    -------
        JsonResponse
        La réponse JSON contenant la liste des livraisons du fournisseur.

    """
    commande_fournisseur = [
        {
            "date": c.date_livraison,
            "produit": c.produit.libelle,
            "prix_achat": c.prix_achat,
            "quantite": c.quantite_commander,
            "montant_total": c.quantite_commander * c.prix_achat,
            "date_livraison": c.date_livraison,
            "statut": c.livrer,
        }
        for c in Commander.objects.filter(fournisseur__id=id_fournisseur)
    ]
    return JsonResponse(commande_fournisseur, safe=False)
