from django.db import models
from django.contrib.auth.models import AbstractUser
from django.conf import settings


class AccountsRole(models.Model):
    name = models.CharField(max_length=100, unique=True)
    description = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.name

class CustomUser(AbstractUser):
    username = None  # On supprime le champ username si on veut utiliser l'email comme identifiant
    email = models.EmailField(unique=True)
    full_name = models.CharField(max_length=255)
    role = models.ForeignKey(AccountsRole, on_delete=models.SET_NULL, null=True, blank=True)
    USERNAME_FIELD = 'email'  # Utiliser l'email comme identifiant
    REQUIRED_FIELDS = ['full_name']  # Champs demandés avec createsuperuser

    def __str__(self):
        return self.email
    
class AccountsPrivilege(models.Model):
    code = models.CharField(max_length=100, unique=True)
    description = models.TextField()

    def __str__(self):
        return self.code
    
class AccountsRolePrivilege(models.Model):
    role = models.ForeignKey(AccountsRole, on_delete=models.CASCADE)
    privilege = models.ForeignKey(AccountsPrivilege, on_delete=models.CASCADE)

    class Meta:
        unique_together = ('role', 'privilege')
        
class Type(models.Model):
    name = models.CharField(max_length=100)
    image_path = models.CharField(max_length=255)

    def __str__(self):
        return self.name
    
class XVR(models.Model):
    ip_adress = models.GenericIPAddressField()
    password = models.CharField(max_length=100)
    count_chan = models.IntegerField()

    def __str__(self):
        return self.ip_adress
    
class Camera(models.Model):
    TYPE_CHOICES = [('ip', 'IP'), ('ana', 'Analog')]
    designation = models.CharField(max_length=100)
    type = models.CharField(max_length=4, choices=TYPE_CHOICES, null=True, blank=True)
    ip_address = models.GenericIPAddressField(null=True, blank=True)
    password = models.CharField(max_length=100, blank=True)
    username = models.CharField(max_length=100, blank=True)
    port = models.IntegerField(null=True, blank=True)
    zone = models.CharField(max_length=100)
    status = models.BooleanField(default=True)
    channel = models.IntegerField(null=True, blank=True)
    xvr = models.ForeignKey(XVR, on_delete=models.SET_NULL, null=True, blank=True)
    long = models.FloatField(null=True, blank=True, default=None)
    lat = models.FloatField(null=True, blank=True, default=None)
    degr = models.FloatField(null=True, blank=True, default=None)

    def __str__(self):
        return self.designation
    
class CameraRole(models.Model):
    role = models.ForeignKey(AccountsRole, on_delete=models.CASCADE)
    camera = models.ForeignKey(Camera, on_delete=models.CASCADE)
    stream = models.TextField()
    
class Screen(models.Model):
    STATUS_CHOICES = [('on', 'On'), ('off', 'Off')]

    designation = models.CharField(max_length=100)
    status = models.CharField(max_length=3, choices=STATUS_CHOICES)
    default = models.BooleanField(default=False)
    type = models.ForeignKey(Type, on_delete=models.CASCADE)
    role = models.ForeignKey(AccountsRole, on_delete=models.CASCADE)

    def __str__(self):
        return self.designation
    
class ScreenCamera(models.Model):
    screen = models.ForeignKey(Screen, on_delete=models.CASCADE)
    camera = models.ForeignKey(Camera, on_delete=models.CASCADE)
    stream = models.TextField()

class DefaultUserScreen(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    screen = models.ForeignKey(Screen, on_delete=models.CASCADE)
    is_default = models.BooleanField(default=False)