from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.translation import gettext as _
from django.utils import timezone
from django.core.exceptions import ValidationError

from .managers import CustomUserManager

class Role(models.Model):
    ADMIN = 1
    SALES = 2
    TECHNICIAN = 3
    CUSTOMER = 4
    SUPPLIER = 5

    ROLE_CHOICES = (
        (ADMIN, 'Admin'),
        (SALES, 'Sales'),
        (TECHNICIAN, 'Technician'),
        (CUSTOMER, 'Customer'),
        (SUPPLIER, 'Supplier'),
    )

    id  = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, primary_key=True)
    def __str__(self):
        return self.get_id_display()

class User(AbstractUser):

    email = models.EmailField( unique=True)
    role = models.ManyToManyField(Role)
    is_active = models.BooleanField(default=True)
    terms_accepted = models.BooleanField(default=False)
    created_date = models.DateTimeField(default=timezone.now)
    modified_date = models.DateTimeField(default=timezone.now)
    deleted_at = models.DateTimeField(blank=True, null=True)
    app_access =models.PositiveSmallIntegerField(default=0)
    isprimary=models.PositiveSmallIntegerField(default=0)
    is_sent_creadentials=models.PositiveSmallIntegerField(default=0)
    # customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    is_communication=models.PositiveSmallIntegerField(default=0)
    job_chat=models.PositiveSmallIntegerField(default=0)
    reset_password=models.PositiveSmallIntegerField(default=0)
    signature = models.ImageField(upload_to='signatures/', null=True, blank=True)
    replacement_technician = models.ForeignKey('self',on_delete=models.SET_NULL,null=True,blank=True,related_name='replaced_users')
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
    
    
    objects = CustomUserManager()
    
    @property
    def get_role(self):
        return ", ".join(str(role.id) for role in self.role.all())
        
    @property
    def get_role_names(self):
        return ", ".join([role.get_id_display() for role in self.role.all()])
   
    def __str__(self):
        return self.email
        
        
    def soft_delete(self):
        self.soft_deleted = True
        self.deleted_at = timezone.now()
        self.is_active = False
        self.save()
    


    #
        
    # def get_status(self):
    #     return "Active" if self.is_active else "Inactive"  


class ActivityLog(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE,null=True)
    action = models.CharField(max_length=255,null=True)
    timestamp = models.DateTimeField(auto_now_add=True,null=True)
    model_name = models.CharField(max_length=255,null=True)
    instance_id = models.PositiveIntegerField(null=True)
    instance_str = models.CharField(max_length=255,null=True)
    old_data=models.JSONField(null=True)  
    new_data=models.JSONField(null=True)  
    def __str__(self):
        return f"{self.timestamp} - {self.action}-{self.model_name}:{self.user}"
    
import uuid
from django.db import models





class BaseModel(models.Model):
    uid = models.UUIDField(default=uuid.uuid4())
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True


class TokenAuthentication(BaseModel):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    access = models.TextField()
    class Meta:
        verbose_name_plural = "Token Authentication"

    def __str__(self):
        return str(self.user.username)
    
    