from django.db import models
from coresite.mixin import AbstractTimeStampModel

class Permission(AbstractTimeStampModel):
    """What users can do"""
    name = models.CharField(max_length=255)
    codename = models.CharField(max_length=255, unique=True)
    is_active = models.BooleanField(default=True)
    
    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Permission'
        verbose_name_plural = 'Permissions'
        ordering = ['name']

class Role(AbstractTimeStampModel):
    """Group of permissions"""
    name = models.CharField(max_length=255)
    description = models.TextField(blank=True, null=True)
    company = models.ForeignKey('companies.Company', on_delete=models.CASCADE, related_name='roles')
    permissions = models.ManyToManyField(Permission, blank=True, related_name='roles')
    is_active = models.BooleanField(default=True)
    
    def __str__(self):
        return f"{self.company.name} - {self.name}"

    class Meta:
        unique_together = ['name', 'company']
        verbose_name = 'Role'
        verbose_name_plural = 'Roles'
        ordering = ['company', 'name']

class UserCompanyRole(AbstractTimeStampModel):
    """User's role in a specific company"""
    user = models.ForeignKey('core.User', on_delete=models.CASCADE, related_name='company_roles')
    company = models.ForeignKey('companies.Company', on_delete=models.CASCADE, related_name='user_roles')
    role = models.ForeignKey(Role, on_delete=models.SET_NULL, null=True, blank=True, related_name='user_assignments')
    is_active = models.BooleanField(default=True)
    
    def __str__(self):
        role_name = self.role.name if self.role else "No Role"
        return f"{self.user.username} - {self.company.name} - {role_name}"
    
    def clean(self):
        """Validate that role belongs to the company"""
        super().clean()
        if self.role and self.role.company != self.company:
            from django.core.exceptions import ValidationError
            raise ValidationError({
                'role': f'Role "{self.role.name}" does not belong to company "{self.company.name}"'
            })
    
    def save(self, *args, **kwargs):
        """Override save to validate role-company relationship"""
        self.clean()
        super().save(*args, **kwargs)
    
    class Meta:
        unique_together = ['user', 'company']
        verbose_name = 'User Company Role'
        verbose_name_plural = 'User Company Roles'
        ordering = ['user', 'company']
