from django.db import models
from django.contrib.auth import get_user_model
from django.db.models import F, Sum, FloatField
from django.db.models.deletion import CASCADE


from PedidosApp.models import Producto




User = get_user_model()

# Una orden estara formada por varias lineas de pedidos. Por ello hay que definir dos nuevos modelos
# (tablas dentro de la base de datos) 1) Orden 2) LineaOrden     

class Order(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    completado = models.BooleanField(default=False)
    entregado = models.BooleanField(default=False,verbose_name="Entregado")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="Creado")
    updated = models.DateTimeField(auto_now=True, verbose_name="Actualizado")


    @property
    def total(self):
        return self.orderline_set.aggregate(
            total = Sum(F("producto__tipo__precio") * F("cantidad"), output_field=FloatField())
        )["total"] or FloatField(0)


    def __str__(self):
        return str(self.id)

    class Meta:
        db_table = 'ordenes'
        verbose_name = 'Pedido'
        verbose_name_plural = 'Pedidos'
        ordering = ['-id']


class OrderLine(models.Model):

    user = models.ForeignKey(User,on_delete=models.CASCADE, verbose_name="Usuario")
    producto = models.ForeignKey(Producto,on_delete=models.CASCADE,verbose_name="Producto")
    order = models.ForeignKey(Order,on_delete=models.CASCADE, verbose_name="Orden")
    cantidad = models.IntegerField(default=1)
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="Creado")

    def __str__(self):
        return f'{self.cantidad} de {self.producto.nombre}'

    class Meta:
        db_table = 'orderlines'
        verbose_name = 'Línea de pedido'
        verbose_name_plural = 'Líneas de pedido'
        ordering = ['-id']


