from django.db import models
from django.contrib.auth.models import AbstractUser
from django.core.exceptions import ValidationError


class Cliente(models.Model):
    nome = models.CharField(max_length=255)
    cpf_cnpj = models.CharField(max_length=14, unique=True)
    email = models.EmailField(unique=True)
    telefone = models.CharField(max_length=20, blank=True, null=True)
    endereco = models.TextField(blank=True, null=True)
    data_cadastro = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.nome
    

class Usuario(AbstractUser):
    NIVEL_ACESSO_CHOICES = [
        ('admin', 'Administrador'),
        ('gerente', 'Gerente'),
        ('operador', 'Operador'),
    ]

    cliente = models.ForeignKey(
        Cliente, 
        on_delete=models.CASCADE, 
        related_name='usuarios', 
        blank=True, 
        null=True  # Agora o superusuário pode ser criado sem cliente
    )
    nivel_acesso = models.CharField(
        max_length=10, 
        choices=NIVEL_ACESSO_CHOICES, 
        default='operador',
        blank=True,  # Apenas usuários normais precisam de nível de acesso
        null=True
    )

    def clean(self):
        """Garante que apenas usuários normais tenham um cliente vinculado"""
        if not self.is_superuser and self.cliente is None:
            raise ValidationError("Usuários normais devem estar vinculados a um Cliente.")
        if self.is_superuser and self.cliente is not None:
            raise ValidationError("Superusuários não podem estar vinculados a um Cliente.")

    def save(self, *args, **kwargs):
        self.clean()  # Valida antes de salvar
        super().save(*args, **kwargs)

    def __str__(self):
        return f"{self.username} - {self.cliente.nome if self.cliente else 'Superusuário'}"


class Motorista(models.Model):
    cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE, related_name='motoristas')
    nome = models.CharField(max_length=255)
    cnh = models.CharField(max_length=20, unique=True)
    login = models.CharField(max_length=255, unique=True)
    senha = models.CharField(max_length=128)

    def __str__(self):
        return f"{self.nome} - {self.cliente.nome}"


class Fornecedor(models.Model):
    cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE, related_name='fornecedores')
    nome = models.CharField(max_length=255)
    endereco = models.TextField()
    telefone = models.CharField(max_length=20)

    def __str__(self):
        return f"{self.nome} - {self.cliente.nome}"
