# Esta aplicación construye y controla el widged del carro de la compra

from django.contrib import messages

#******************************************************************************************
#* La clase "Carro" construye el carrito de las compras y consta de varias funciones para *
#* las diferentes fucionabilidades, tales como: agregar productos, eliminar entre otros.  *
#******************************************************************************************

class Carro:

    # 1) Constructor de la clase Carro
    #    *****************************

    def __init__(self, request):
        self.request = request
        self.session = request.session

        carro = self.session.get("carro")

        if not carro:
            carro = self.session["carro"] = {}
        
        self.carro = carro

    # 2) Método para añadir un producto al carro de la compra
    #    ****************************************************
    def agregar(self,producto,cantidad):
        
        # Hay que comprobar si el producto (id) se encuentra en el carro.
        # Si no existe, se debe agregar por primera vez
        # Adicionalmente hay que verificar si hay productos dispoibles en stock

        if str(producto.id) not in self.carro.keys():
            if producto.stock > 0 and producto.stock >= cantidad and cantidad >= 1:

                self.carro[producto.id] = {

                "producto_id": producto.id,
                "nombre": producto.nombre,
                "cantidad": cantidad,
                "precio": str(producto.tipo.precio),
                "stock": producto.stock,
                "disponibilidad": producto.disponibilidad,
                "descripcion" :producto.descripcion,
                }

            if producto.stock > 0 and producto.stock < cantidad:

                self.carro[producto.id] = {

                "producto_id": producto.id,
                "nombre": producto.nombre,
                "cantidad": producto.stock,
                "precio": str(producto.tipo.precio),
                "stock": producto.stock,
                "disponibilidad": producto.disponibilidad,
                "descripcion" :producto.descripcion,
                 }

        
        # Lego hay que comprobar si el producto ya fue agregado, en cuyo caso
        # hay que verificar si todavia quedan productos disponibles en stock para adicionar mas.
        else:
           for key, value  in self.carro.items():
                if key == str(producto.id):
                    if value["stock"] >= value["cantidad"]:
                        value["cantidad"] = cantidad  # value["cantidad"]+
                    if value["stock"] < value["cantidad"]:
                        value["cantidad"] = value["stock"]
                    if value["cantidad"] < 1:
                        self.eliminar(producto)
                        break
                                
        self.guardar()


    # 3) Método para guardar los elementos del carro de la compra y hacer que persistan.
    #    *******************************************************************************

    def guardar(self):
        self.session["carro"] = self.carro
        self.session.modified = True

    # 4) Método para eliminar un producto que ya fue agregado
    #    *****************************************************
    def eliminar(self, producto):
        producto_id = str(producto.id)
        if producto_id in self.carro:
            del self.carro[producto_id] 
            self.guardar()


    # 5 Método para actualizar la cantidad de un producto que ya fue agregado
    #   *********************************************************************
    def actualizar(self, producto, cantidad):
        for key, value in self.carro.items():
              if key == str(producto.id):
                    if value["stock"] >= value["cantidad"]:
                        value["cantidad"] = cantidad
                    if value["stock"] < value["cantidad"]:
                        value["cantidad"] = value["stock"]
                    if value["cantidad"] < 1:
                        self.eliminar(producto)
                        break
        self.guardar()


    
    # 6 Método para limpiar el carrito y eliminar todos los productos que se encuentran en éste.
    #   ****************************************************************************************

    def limpiar(self):
        self.session["carro"] = {}
        self.session.modified = True


# ****************** Los siguientes métodos no se usan en esta versión, estan desactualizados **************

# Método para decrementar en la cantidad de productos en el carrito

    def decrementar(self, producto):
        for key, value in self.carro.items():
            if key == str(producto.id):
                value["cantidad"] = value["cantidad"] - 1

                # Si la cantidad de productos es menor a uno, el producto se debe eliminar del carrito
                if value["cantidad"] < 1:
                    self.eliminar(producto)
                break
        self.guardar()

# Metodos adicionales para incrementar y decrementar mas productos

# Metodo para decrementar de 5 en 5 productos

    def decrementar_5(self, producto):
        for key, value in self.carro.items():
            if key == str(producto.id):
                value["cantidad"] = value["cantidad"] - 5

                # Si la cantidad de productos es menor a uno, el producto se debe eliminar del carrito
                if value["cantidad"] < 1:
                    self.eliminar(producto)
                break
        self.guardar()


#Incrementar de 5 en 5 productos
    def incrementar_5(self,producto):
        for key, value in self.carro.items():
            if key == str(producto.id):
                if value["stock"] > value["cantidad"] +5:
                    value["cantidad"] = value["cantidad"] + 5
                    break
                else:
                    value["cantidad"] = value["stock"]

        self.guardar()

      

