from django.shortcuts import render
from django.db.models import Sum
from django.db.models import Count, F
from django.http import JsonResponse
from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth.models import User
from django.utils.dateparse import parse_datetime

import datetime



from comandas.models import ProductComanda
from orders.models import Order
from payments.models import Payments
from gestaoRaul.decorators import group_required

@group_required(groupName='Gerente')
def home(request):

        return render(request, 'home.html')


@group_required(groupName='Gerente')
def chartCuisine(request,dateStart,dateEnd):
    try:
        dateStart = parse_datetime(dateStart+' 07:00:00')
        dateEnd = parse_datetime(dateEnd+' 07:00:00')+ datetime.timedelta(days=1)
    except:
        dateStart = parse_datetime('2025-01-01 07:00:00')
        dateEnd = datetime.datetime.now()

    tFila = []
    tPreparando = []
    tFinalizado = []

    total_pagamentos =  Payments.objects.filter(datetime__range=(dateStart, dateEnd)).aggregate(total=Sum('value'))['total']
    total_pagamentos = 0 if total_pagamentos is None else total_pagamentos
    qdt_pagamentos = Payments.objects.filter(datetime__range=(dateStart, dateEnd)).aggregate(total=Count('value'))['total']
    qdt_pagamentos = 0 if qdt_pagamentos is None else qdt_pagamentos
    try:
        ticket_medio = total_pagamentos / qdt_pagamentos
    except:
        ticket_medio = 0

    try:
        produtos_mais_vendidos = ProductComanda.objects.filter(
                                    data_time__range=(dateStart, dateEnd)
                                ).values('product').annotate(
                                    quantidade=Count('product'),
                                    nome=F('product__name')
                                ).order_by('-quantidade')[:5]
        maisVendidos = {}
        for produto in produtos_mais_vendidos:
            maisVendidos[produto['nome']] = produto['quantidade']
        produtos_mais_vendidos = maisVendidos
  
    except:
        produtos_mais_vendidos = {
                                    'petra': 25,
                                    'petra2': 26,
                                    'petra3': 27,
                                    'petra4': 28,
                                    'petra5': 29,
                                  }
      
    orders = Order.objects.filter(delivered__isnull=False, queue__gt=dateStart, queue__lt=dateEnd)
    try:
        for order in orders:
            tFila.append((order.preparing - order.queue).total_seconds())
            tPreparando.append((order.finished - order.preparing).total_seconds())
            tFinalizado.append((order.delivered - order.finished).total_seconds())

        mediaFila = int((sum(tFila) / len(tFila))/60)
        mediaPreparando = int((sum(tPreparando) / len(tPreparando))/60)
        mediaFinalizado = int((sum(tFinalizado) / len(tFinalizado))/60)

        return JsonResponse({
            'mediaFila': mediaFila,
            'mediaPreparando': mediaPreparando,
            'mediaFinalizado': mediaFinalizado,
            'total_pagamentos': round(total_pagamentos, 2),
            'qtd_pagamentos': qdt_pagamentos,
            'ticket_medio': round(ticket_medio, 2),
            'produtos_mais_vendidos': produtos_mais_vendidos,
            })
    except:
        return JsonResponse({
            'mediaFila': 0,
            'mediaPreparando': 0,
            'mediaFinalizado': 0,
            'total_pagamentos': round(total_pagamentos, 2),
            'qtd_pagamentos': qdt_pagamentos,
            'ticket_medio': round(ticket_medio, 2),
            'produtos_mais_vendidos': produtos_mais_vendidos,
            })
