from django.db import models
from django.contrib.auth import get_user_model
from django.utils import timezone
from organisations.models import Organisation, OrganisationBranch

User = get_user_model()


class ChatRoom(models.Model):
    ROOM_TYPES = [
        ('organisation', 'Organisation Chat'),
        ('department', 'Department Chat'),
        ('group', 'Group Chat'),
        ('support', 'Support Chat'),
    ]
    
    STATUS_CHOICES = [
        ('active', 'Active'),
        ('inactive', 'Inactive'),
        ('closed', 'Closed'),
    ]
    
    PRIORITY_CHOICES = [
        ('low', 'Low'),
        ('medium', 'Medium'),
        ('high', 'High'),
        ('urgent', 'Urgent'),
    ]
    
    name = models.CharField(max_length=255)
    room_type = models.CharField(choices=ROOM_TYPES, max_length=20)
    status = models.CharField(choices=STATUS_CHOICES, default='active', max_length=20)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(auto_now=True)
    ticket_id = models.CharField(blank=True, max_length=100, null=True, unique=True)
    priority = models.CharField(choices=PRIORITY_CHOICES, default='medium', max_length=20)
    subject = models.CharField(blank=True, max_length=500, null=True)
    description = models.TextField(blank=True, null=True)
    branch = models.ForeignKey(
        OrganisationBranch, 
        blank=True, 
        null=True, 
        on_delete=models.CASCADE, 
        related_name='chat_rooms'
    )
    created_by = models.ForeignKey(
        User, 
        on_delete=models.CASCADE, 
        related_name='created_chat_rooms'
    )
    organisation = models.ForeignKey(
        Organisation, 
        blank=True, 
        null=True, 
        on_delete=models.CASCADE, 
        related_name='chat_rooms'
    )

    class Meta:
        db_table = 'chat_rooms'
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.name} ({self.room_type})"


class Message(models.Model):
    MESSAGE_TYPES = [
        ('text', 'Text'),
        ('file', 'File'),
        ('image', 'Image'),
        ('system', 'System'),
    ]
    
    message_type = models.CharField(choices=MESSAGE_TYPES, default='text', max_length=20)
    content = models.TextField()
    file_url = models.URLField(blank=True, null=True)
    file_name = models.CharField(blank=True, max_length=255, null=True)
    file_size = models.BigIntegerField(blank=True, null=True)
    is_edited = models.BooleanField(default=False)
    edited_at = models.DateTimeField(blank=True, null=True)
    is_deleted = models.BooleanField(default=False)
    deleted_at = models.DateTimeField(blank=True, null=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(auto_now=True)
    room = models.ForeignKey(
        ChatRoom, 
        on_delete=models.CASCADE, 
        related_name='messages'
    )
    user = models.ForeignKey(
        User, 
        on_delete=models.CASCADE, 
        related_name='chat_messages'
    )

    class Meta:
        db_table = 'public"."chat_messages'
        ordering = ['created_at']
        indexes = [
            models.Index(fields=['room', 'created_at'], name='chat_messag_room_id_cc7f0e_idx'),
            models.Index(fields=['user', 'created_at'], name='chat_messag_user_id_ecc172_idx'),
        ]

    def __str__(self):
        return f"Message from {self.user} in {self.room.name}"


class SupportTicket(models.Model):
    STATUS_CHOICES = [
        ('open', 'Open'),
        ('in_progress', 'In Progress'),
        ('resolved', 'Resolved'),
        ('closed', 'Closed'),
    ]
    
    PRIORITY_CHOICES = [
        ('low', 'Low'),
        ('medium', 'Medium'),
        ('high', 'High'),
        ('urgent', 'Urgent'),
    ]
    
    ticket_id = models.CharField(max_length=100, unique=True)
    subject = models.CharField(max_length=500)
    description = models.TextField()
    status = models.CharField(choices=STATUS_CHOICES, default='open', max_length=20)
    priority = models.CharField(choices=PRIORITY_CHOICES, default='medium', max_length=20)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(auto_now=True)
    resolved_at = models.DateTimeField(blank=True, null=True)
    assigned_staff = models.ForeignKey(
        User, 
        blank=True, 
        null=True, 
        on_delete=models.SET_NULL, 
        related_name='assigned_tickets'
    )
    chat_room = models.OneToOneField(
        ChatRoom, 
        on_delete=models.CASCADE, 
        related_name='support_ticket'
    )
    customer = models.ForeignKey(
        User, 
        on_delete=models.CASCADE, 
        related_name='support_tickets'
    )

    class Meta:
        db_table = 'public"."support_tickets'
        ordering = ['-created_at']

    def __str__(self):
        return f"Ticket {self.ticket_id}: {self.subject}"


class RoomMember(models.Model):
    joined_at = models.DateTimeField(default=timezone.now)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    room = models.ForeignKey(
        ChatRoom, 
        on_delete=models.CASCADE, 
        related_name='members'
    )
    user = models.ForeignKey(
        User, 
        on_delete=models.CASCADE, 
        related_name='chat_memberships'
    )

    class Meta:
        db_table = 'public"."room_members'
        ordering = ['joined_at']
        unique_together = [['room', 'user']]

    def __str__(self):
        return f"{self.user} in {self.room.name}"


class MessageReadStatus(models.Model):
    read_at = models.DateTimeField(default=timezone.now)
    message = models.ForeignKey(
        Message, 
        on_delete=models.CASCADE, 
        related_name='read_status'
    )
    user = models.ForeignKey(
        User, 
        on_delete=models.CASCADE, 
        related_name='message_reads'
    )

    class Meta:
        db_table = 'public"."message_read_status'
        unique_together = [['message', 'user']]

    def __str__(self):
        return f"{self.user} read message at {self.read_at}"


class DirectMessage(models.Model):
    MESSAGE_TYPES = [
        ('text', 'Text'),
        ('file', 'File'),
        ('image', 'Image'),
    ]
    
    message_type = models.CharField(choices=MESSAGE_TYPES, default='text', max_length=20)
    content = models.TextField()
    file_url = models.URLField(blank=True, null=True)
    file_name = models.CharField(blank=True, max_length=255, null=True)
    file_size = models.BigIntegerField(blank=True, null=True)
    is_read = models.BooleanField(default=False)
    read_at = models.DateTimeField(blank=True, null=True)
    is_edited = models.BooleanField(default=False)
    edited_at = models.DateTimeField(blank=True, null=True)
    is_deleted = models.BooleanField(default=False)
    deleted_at = models.DateTimeField(blank=True, null=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(auto_now=True)
    sender = models.ForeignKey(
        User, 
        on_delete=models.CASCADE, 
        related_name='sent_direct_messages'
    )
    recipient = models.ForeignKey(
        User, 
        on_delete=models.CASCADE, 
        related_name='received_direct_messages'
    )

    class Meta:
        db_table = 'direct_messages'
        ordering = ['created_at']
        indexes = [
            models.Index(fields=['sender', 'recipient', 'created_at'], name='dm_sender_recipient_idx'),
            models.Index(fields=['recipient', 'is_read'], name='dm_recipient_read_idx'),
        ]

    def __str__(self):
        return f"DM from {self.sender} to {self.recipient}"
