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

logger = logging.getLogger(__name__)


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']


# Company Membership Model
class UserCompanyRole(AbstractTimeStampModel):
    """Company membership with role and per-company identity"""
    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'
    )

    # Per-company identity
    first_name = models.CharField(max_length=100, null=True, blank=True)
    last_name = models.CharField(max_length=100, null=True, blank=True)
    image = models.ImageField(upload_to='company_members/', null=True, blank=True)
    phone = models.CharField(max_length=50, null=True, blank=True)
    designation = models.CharField(max_length=100, null=True, blank=True)

    # Membership lifecycle
    invited_at = models.DateTimeField(null=True, blank=True)
    left_at = models.DateTimeField(null=True, blank=True)

    # Status
    is_active = models.BooleanField(
        default=True,
        null=True, blank=True,
        help_text="Whether the membership is currently active"
    )
    is_default = models.BooleanField(
        default=False,
        null=True, blank=True,
        help_text="Whether this is the user's default company"
    )
    is_owner = models.BooleanField(
        default=False,
        null=True, blank=True,
        help_text="Whether this is the company account owner"
    )
    is_available = models.BooleanField(
        default=True,
        null=True, blank=True,
        help_text="Whether the user is currently available for work/assignments"
    )

    # Audit
    created_by = models.ForeignKey(
        'core.User',
        on_delete=models.SET_NULL,
        null=True, blank=True,
        related_name="created_company_memberships"
    )

    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)

    def resolve_phone(self):
        if self.phone:
            return self.phone
        if hasattr(self.user, "profile"):
            return self.user.profile.phone_number
        return None

    def resolve_first_name(self):
        if self.first_name:
            return self.first_name

        if hasattr(self.user, "profile"):
            return self.user.profile.first_name
        return None

    def resolve_last_name(self):
        if self.last_name:
            return self.last_name

        if hasattr(self.user, "profile"):
            return self.user.profile.last_name
        return None

    class Meta:
        unique_together = ['user', 'company']
        verbose_name = 'User Company Role'
        verbose_name_plural = 'User Company Roles'
        ordering = ['updated_at', 'user', 'company']
