import json

from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.shortcuts import render, get_object_or_404
from django.views.decorators.http import require_POST, require_http_methods

from .models import Magasin, Rayon, ArticleRecurrent, Article, Course, ArticleCourse


@login_required
def page_accueil_view(request):
    # context = admin.site.each_context(request)
    return render(request, "listecourse/accueil.html")


@login_required
def article_recurrent_view(request):
    # context = admin.site.each_context(request)
    return render(request, "listecourse/articles_recurrents.html")


@login_required
def course_detail_view(request, pk):
    course = get_object_or_404(Course, pk=pk)
    return render(request, 'listecourse/course_detail.html', {'course': course})


def api_article_recurrent_list(request):
    magasins = Magasin.objects.prefetch_related("rayon_set__articlerecurrent_set")
    data = []

    for m in magasins:
        data.append({"id": f"magasin-{m.id}", "name": m.name, "type": "magasin", "_children": [
            {"id": f"rayon-{r.id}", "name": r.name, "type": "rayon", "ordreAffichage": r.ordreAffichage, "_children": [
                {"id": f"articlerecurrent-{a.id}", "name": a.name, "quantity": a.quantity, "unit": a.unit,
                    "type": "article"} for a in r.articlerecurrent_set.all()]} for r in m.rayon_set.all()]})

    return JsonResponse(data, safe=False)


@require_POST
def api_article_recurrent_create(request):
    data = json.loads(request.body)

    rayon = Rayon.objects.get(pk=data["rayon_id"])

    article_recurrent = ArticleRecurrent.objects.create(name=data["name"], quantity=data["quantity"], unit=data["unit"],
        rayon=rayon)

    return JsonResponse({"id": article_recurrent.id})


@require_http_methods(["DELETE"])
def api_article_recurrent_delete(request, pk):
    ArticleRecurrent.objects.filter(pk=pk).delete()
    return JsonResponse({"status": "deleted"})


@require_http_methods(["PATCH"])
def api_article_recurrent_update(request, pk):
    data = json.loads(request.body)

    article_recurrent = ArticleRecurrent.objects.get(pk=pk)
    article_recurrent.name = data.get("name")
    article_recurrent.quantity = data.get("quantity")
    article_recurrent.unit = data.get("unit")
    article_recurrent.save()

    return JsonResponse({"status": "updated"})


def api_article_list(request):
    articles = Article.objects.all()
    data = []

    for a in articles:
        data.append({"id": a.id, "name": a.name, "quantity": a.quantity, "unit": a.unit})

    return JsonResponse(data, safe=False)


@require_POST
def api_article_create(request):
    data = json.loads(request.body)

    article = Article.objects.create(name=data["name"], quantity=data["quantity"], unit=data["unit"])

    return JsonResponse({"id": article.id})


@require_http_methods(["DELETE"])
def api_article_delete(request, pk):
    Article.objects.filter(pk=pk).delete()
    return JsonResponse({"status": "deleted"})


@require_http_methods(["PATCH"])
def api_article_update(request, pk):
    data = json.loads(request.body)

    article = Article.objects.get(pk=pk)
    article.name = data.get("name")
    article.quantity = data.get("quantity")
    article.unit = data.get("unit")
    article.save()

    return JsonResponse({"status": "updated"})


def api_course_list(request):
    courses = Course.objects.filter(dateFin__isnull=True)
    data = []

    for a in courses:
        data.append({"id": a.id, "magasin": a.magasin.name, "date": a.date, "dateFin": a.dateFin})

    return JsonResponse(data, safe=False)


@require_POST
def api_course_create(request):
    data = json.loads(request.body)

    magasin = Magasin.objects.get(pk=data["magasin"])

    course = Course.objects.create(magasin=magasin, date=data["date"])

    # Créer les ArticleCourse en copiant les ArticleRecurrent du magasin sélectionné
    articles_recurrent = ArticleRecurrent.objects.filter(rayon__magasin=magasin)
    for r in articles_recurrent:
        ArticleCourse.objects.create(name=r.name, quantity=r.quantity, unit=r.unit, rayon=r.rayon, course=course)

    return JsonResponse({"id": course.id})


@require_http_methods(["DELETE"])
def api_course_delete(request, pk):
    Course.objects.filter(pk=pk).delete()
    return JsonResponse({"status": "deleted"})


@require_http_methods(["PATCH"])
def api_course_update(request, pk):
    data = json.loads(request.body)

    course = Course.objects.get(pk=pk)
    course.date = data.get("date")
    course.save()

    return JsonResponse({"status": "updated"})




def api_course_get(request, pk):
    course = get_object_or_404(Course, pk=pk)

    data = {"id": course.id, "date": course.date, "dateFin": course.dateFin, "magasin": course.magasin.name}

    return JsonResponse(data, safe=False)


def api_course_article_list(request, pk):
    articles_course = ArticleCourse.objects.filter(course=pk).order_by("rayon__ordreAffichage", "name")
    data = []

    for a in articles_course:
        data.append({"course_id":a.course.id, "id": a.id, "name": a.name, "quantity": a.quantity, "unit": a.unit,
            "rayon": a.rayon.name, "termine": a.termine, "rayon_ordreAffichage": a.rayon.ordreAffichage, })

    return JsonResponse(data, safe=False)

@require_POST
def api_course_article_create(request,pk):
    data = json.loads(request.body)

    course = Course.objects.get(pk=pk)
    rayon = Rayon.objects.get(name=data["rayon_name"],magasin=course.magasin)

    article_course = ArticleCourse.objects.create(name=data["name"], quantity=data["quantity"], unit=data["unit"], rayon=rayon, course=course)

    return JsonResponse({"id": article_course.id})

@require_http_methods(["DELETE"])
def api_course_article_delete(request, pk,article_id):
    ArticleCourse.objects.filter(pk=article_id).delete()
    return JsonResponse({"status": "deleted"})


@require_http_methods(["PATCH"])
def api_course_article_update(request, pk, article_id):
    data = json.loads(request.body)

    article_course = ArticleCourse.objects.get(pk=article_id)
    article_course.name = data.get("name")
    article_course.quantity = data.get("quantity")
    article_course.unit = data.get("unit")
    article_course.termine = data.get("termine")
    article_course.save()

    return JsonResponse({"status": "updated"})


def api_magasin_list(request):
    magasins = Magasin.objects.all()
    data = []

    for a in magasins:
        data.append({"id": a.id, "name": a.name})

    return JsonResponse(data, safe=False)



def api_magasin_rayon_list(request,pk):
    rayons = Rayon.objects.filter(magasin=pk).order_by("ordreAffichage")
    data = []

    for a in rayons:
        data.append({"id": a.id, "name": a.name})

    return JsonResponse(data, safe=False)