from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.contrib.auth.hashers import make_password, check_password

# Create your models here.
class Plato(models.Model):
    DISPONIBILIDAD = [
        ('disponible', 'Disponible'),
        ('no_disponible', 'No Disponible'),
    ]

    plato = models.CharField(max_length=100)
    ingredientes = models.TextField()
    descripcion = models.TextField(null=True, blank=True)
    t_preparacion = models.IntegerField()
    precio = models.FloatField()
    disponibilidad = models.CharField(max_length=15, choices=DISPONIBILIDAD, default='disponible')
    imagen = models.ImageField(upload_to='img/', null=True, blank=True)

    def __str__(self):
        return f"{self.plato} - ${self.precio} - {self.disponibilidad}"
    
class Combo(models.Model):
    DISPONIBILIDAD = [
        ('disponible', 'Disponible'),
        ('no_disponible', 'No Disponible'),
    ]

    nombre = models.CharField(max_length=100)
    precio = models.FloatField()
    disponibilidad = models.CharField(max_length=15, choices=DISPONIBILIDAD, default='disponible')
    platos = models.ManyToManyField(Plato, through='PlatoCombo')
    imagen = models.ImageField(upload_to='img/combo/', null=True, blank=True) 
    
    def __str__(self):
        return f"{self.nombre} - ${self.precio} - {self.disponibilidad}"

class PlatoCombo(models.Model):
    combo = models.ForeignKey(Combo, on_delete=models.CASCADE)
    plato = models.ForeignKey(Plato, on_delete=models.CASCADE)
    
    def __str__(self):
        return f"Combo: {self.combo.nombre} - Plato: {self.plato.plato}"

class Descuento(models.Model):
    monto_min = models.FloatField()
    descuento = models.FloatField()

    def __str__(self):
        return f"Descuento: {self.descuento}% - Monto mínimo: ${self.monto_min}"

class UsuarioManager(BaseUserManager):
    def create_user(self, username, email, password=None, **extra_fields):
        if not email:
            raise ValueError('El correo electrónico es obligatorio')
        email = self.normalize_email(email)
        extra_fields.setdefault('is_active', True)
        user = self.model(username=username, email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('El superusuario debe tener is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('El superusuario debe tener is_superuser=True.')

        return self.create_user(username, email, password, **extra_fields)
    
class Usuario(AbstractBaseUser, PermissionsMixin):
    ROLES = [
        ('admin', 'Admin'),
        ('cliente', 'Cliente'),
        ('repartidor', 'Repartidor'),
        ('empleado', 'Empleado'),
    ]

    username = models.CharField(max_length=100, unique=True)
    email = models.EmailField(unique=True)
    nombre = models.CharField(max_length=100)
    apellido = models.CharField(max_length=100, null=True, blank=True)
    domicilio = models.TextField(null=True, blank=True)
    telefono = models.CharField(max_length=100, null=True, blank=True)
    rol = models.CharField(max_length=10, choices=ROLES, default='cliente')
    img = models.TextField(null=True, blank=True)
    creado_en = models.DateTimeField(auto_now_add=True, null=True)
    actualizado_en = models.DateTimeField(auto_now=True, null=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UsuarioManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email', 'nombre']

    def set_password(self, raw_password):
        self.password = make_password(raw_password)

    def check_password(self, raw_password):
        return check_password(raw_password, self.password)

    def __str__(self):
        return f"{self.nombre} {self.apellido} - {self.email} - {self.telefono} - {self.domicilio}"

class Repartidor(models.Model):
    DISPONIBILIDAD = [
        ('disponible', 'Disponible'),
        ('no_disponible', 'No Disponible'),
    ]
    
    usuario = models.OneToOneField(Usuario, on_delete=models.CASCADE)
    disponibilidad = models.CharField(max_length=15, choices=DISPONIBILIDAD, default='disponible')

    def __str__(self):
        return f"Repartidor: {self.usuario.nombre} - Disponibilidad: {self.disponibilidad}"

class Resenia(models.Model):
    TIPOS = [
        ('positiva', 'Positiva'),
        ('negativa', 'Negativa')
    ]
    
    descripcion = models.TextField()
    tipo = models.CharField(max_length=100, choices=TIPOS)

    def __str__(self):
        return f"{self.get_tipo_display()} - {self.descripcion[:50]}"

class Pedido(models.Model):
    ESTADOS = [
        ('pendiente_aprobacion', 'Pendiente de aprobación'),
        ('en_preparacion', 'En preparación'),
        ('preparado', 'Preparado'),
        ('pendiente_entrega', 'Pendiente de entrega'),
        ('entregado', 'Entregado'),
        ('aceptado', 'Aceptado'),
        ('rechazado', 'Rechazado'),
        ('cancelado', 'Cancelado'),
        ('Dirección no encontrada', 'Dirección no encontrada'),
    ]
    
    comentarios = models.TextField(null=True, blank=True)
    direccion = models.CharField(max_length=255, null=True, blank=True)
    resenia = models.ForeignKey(Resenia, on_delete=models.CASCADE, null=True, blank=True)
    repartidor = models.ForeignKey(Repartidor, on_delete=models.CASCADE, null=True, blank=True)
    estado = models.CharField(max_length=50, choices=ESTADOS, default='pendiente_aprobacion')
    creado_en = models.DateTimeField(auto_now_add=True, null=True)
    precio_total = models.FloatField(null=True, blank=True, default=0)
    estado = models.CharField(max_length=50, choices=ESTADOS)
    motivo_rechazo = models.TextField(blank=True, null=True)

    def __str__(self):
        return f"Pedido: {self.id} - Estado: {self.estado}"

class PedidosCliente(models.Model):
    usuario = models.ForeignKey(Usuario, on_delete=models.CASCADE)
    pedido = models.ForeignKey(Pedido, on_delete=models.CASCADE)

    def __str__(self):
        return f"Cliente: {self.usuario.nombre} - Pedido: {self.pedido.id}"

class PlatoPedido(models.Model):
    pedido = models.ForeignKey(Pedido, on_delete=models.CASCADE)
    plato = models.ForeignKey(Plato, on_delete=models.CASCADE)
    cantidad = models.IntegerField()

    def __str__(self):
        return f"Pedido: {self.pedido.id} - Plato: {self.plato.plato} - Cantidad: {self.cantidad}"
