from django.db import models
from django.conf import settings
import uuid


class Group(models.Model):
    """
    Community/Group model.
    Groups are separate from chat groups - these are for community features.
    Posts now reference groups via Post.group ForeignKey.
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True, null=True)
    image = models.ImageField(upload_to='group_images/', blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='created_usergroups'
    )
    is_deleted = models.BooleanField(default=False)  # Soft delete

    class Meta:
        ordering = ['-created_at']
        indexes = [
            models.Index(fields=['is_deleted', 'created_at']),
            models.Index(fields=['created_by']),
        ]

    def __str__(self):
        return self.name


class GroupMember(models.Model):
    """
    Tracks membership and roles in groups.
    Roles: ADMIN, MODERATOR, MEMBER
    """
    ROLE_CHOICES = [
        ('ADMIN', 'Admin'),
        ('MODERATOR', 'Moderator'),
        ('MEMBER', 'Member'),
    ]

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='usergroup_memberships'
    )
    group = models.ForeignKey(
        Group,
        on_delete=models.CASCADE,
        related_name='members'
    )
    role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='MEMBER')
    joined_at = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)

    class Meta:
        unique_together = ('user', 'group')
        ordering = ['-role', 'joined_at']  # Admins first, then mods, then members
        indexes = [
            models.Index(fields=['user', 'is_active']),
            models.Index(fields=['group', 'role']),
        ]

    def __str__(self):
        return f"{self.user.username} - {self.group.name} ({self.role})"
