from django.db.models.expressions import Value
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.core.mail import send_mail
from django.shortcuts import redirect
from django.template.loader import render_to_string
from django.utils import html
from django.utils.html import strip_tags
from django.views.generic.list import ListView
from django.views.generic import DetailView 
from .models import Order, OrderLine, User
from CarroApp.carro import Carro
from PedidosApp.models import Producto
from smtplib import SMTPException

# Create your views here.


@login_required(login_url='/acceder/acceder/')
def procesar_orden(request):
    order = Order.objects.create(user=request.user, completado = True)
    carro = Carro(request)
    order_lines = list()
    contador = 0
    stock_actualizado = list()  # lista vacia para el estock a actualizar

    for key, value in carro.carro.items():
        
        stock = Producto.objects.get(id=key).stock
        cantidad = value["cantidad"]
        
        if stock >= cantidad:
            order_lines.append(
                OrderLine(producto_id=key,
                cantidad = value["cantidad"],
                user = request.user,
                order = order,
                )
            )
 
            stock_nuevo = stock-cantidad
            if stock_nuevo == 0:
                disponible = False
            else:
                disponible = True
                
            stock_actualizado.append(Producto(id=key, stock=stock_nuevo, disponibilidad=disponible))
            
            #Producto.objects.filter(id=key).update(stock=stock_nuevo,disponibilidad=disponible)
        
        if stock < cantidad and stock > 0 :
            order_lines.append(
                OrderLine(producto_id=key,
                cantidad = stock,
                user=request.user,
                order=order,
                )
            )

            stock_nuevo = 0
            disponible = False
            contador = contador+1
            
            stock_actualizado.append(Producto(id=key, stock=stock_nuevo, disponibilidad=disponible))
            
            #Producto.objects.filter(id=key).update(stock=stock_nuevo, disponibilidad=disponible)
            
        if stock == 0:
            contador = contador+1
    
    # Caso en el cual se han agotado todos los productos.
    # Se envía un mensaje al cliente, se elimina la order creada, y se redirecciona a la página de pedidos.
    if order_lines == []:
        
        order.delete()
        messages.warning(request, "El pedido no ha sido creado correctamente.")
        messages.warning(request, "¡Es posible que algunos productos se hayan agotado durante tu compra y ya no esten disponibles!")
        
        carro.limpiar()
        return redirect("Pedidos")
        
    else:
        
        OrderLine.objects.bulk_create(order_lines)
        Producto.objects.bulk_update(stock_actualizado,['stock','disponibilidad'])
        
    
    # Envio de correo electronico 

    try:
        enviar_email_orden(
            order = order,
            order_lines = order_lines,
            username = request.user.username,
            user_email = request.user.email
            )
        
        

        if contador == 0:
            messages.success(request,"El pedido se ha creado correctamente.")
        else:
            messages.success(request, "El pedido se ha creado correctamente.")
            messages.warning(request, "¡Es posible que algunos productos se hayan agotado durante tu compra y ya no esten disponibles!")
        
        carro.limpiar()
        return redirect("Pedidos")
    
    except:
        messages.error(request, "Ha habido un error durante el envío del correo de confirmación")
        carro.limpiar()
        return redirect("Pedidos")
        



def enviar_email_orden(**kwargs):
    
    subject = "Gracias por tu pedido"
    html_message = render_to_string("OrdenesApp/nuevo_pedido.html", {
    "order" : kwargs.get("order"),
    "order_lines" : kwargs.get("order_lines"),
    "username" : kwargs.get("username")
    

    })
    plain_message = strip_tags(html_message)
    from_email = "vgvision.ve@gmail.com"
    to = kwargs.get("user_email")
    
    send_mail(subject,plain_message,from_email,[to,'vgvision.ve@gmail.com',],html_message=html_message)
   


class OrderList(ListView):
    model = Order
    ordering = ["-id"]
    template_name = "PedidosApp/listado.html"
    user = Order.user

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(user=self.request.user)


class OrderDetail(DetailView):
    model = Order
    template_name = "PedidosApp/detalle.html"

    def get_queryset(self):
       queryset = super().get_queryset()
       return queryset.filter(user=self.request.user)
       

