# support/models.py
from django.db import models, transaction
from django.utils import timezone
from django.conf import settings

from django.utils.text import slugify
class SupportSubject(models.Model):
    """
    Canonical subjects for support tickets.
    Examples: 'Recharge Failure', 'Wallet Balance', 'KYC', 'Login/OTP', ...
    """
    name = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=120, unique=True, db_index=True)
    is_active = models.BooleanField(default=True)
    sort_order = models.PositiveIntegerField(default=100)  # UI ordering fallback
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ["sort_order", "name"]

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        return super().save(*args, **kwargs)

    def __str__(self):
        return self.name

class SupportService(models.Model):
    """
    Canonical service types (business lines) for tickets.
    Examples: Prepaid, Postpaid, FASTag, DTH, Electricity, Wallet, BBPS, etc.
    """
    name = models.CharField(max_length=50, unique=True)
    code = models.SlugField(max_length=50, unique=True, db_index=True)  # e.g., 'prepaid', 'postpaid', 'fastag'
    is_active = models.BooleanField(default=True)
    sort_order = models.PositiveIntegerField(default=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ["sort_order", "name"]

    def __str__(self):
        return self.name


CustomUser = settings.AUTH_USER_MODEL

TICKET_STATUS = (
    ("open", "Open"),
    ("in_progress", "In Progress"),
    ("waiting_user", "Waiting on User"),
    ("resolved", "Resolved"),
    ("closed", "Closed"),
)

TICKET_PRIORITY = (
    ("low", "Low"),
    ("medium", "Medium"),
    ("high", "High"),
    ("urgent", "Urgent"),
)

class Ticket(models.Model):
    """
    Support ticket core model.
    """
    ticket_id = models.CharField(max_length=32, unique=True, db_index=True)  # VPMVPDDMMYYYY###### 
    requester = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True, related_name="tickets")
    requester_mobile = models.CharField(max_length=15, blank=True, null=True)  # for WhatsApp/phone intake
    order_id = models.CharField(max_length=64, blank=True, null=True)         # link to any transaction/order if available
    subject = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    category = models.CharField(max_length=64, blank=True, null=True)  # e.g., "Recharge", "Wallet", "Login", etc.
    priority = models.CharField(max_length=10, choices=TICKET_PRIORITY, default="medium")
    status = models.CharField(max_length=20, choices=TICKET_STATUS, default="open")
    assignee = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True, related_name="assigned_tickets")
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    subject_ref = models.ForeignKey(
        SupportSubject, null=True, blank=True,
        on_delete=models.SET_NULL, related_name="tickets"
    )
    service = models.ForeignKey(
        SupportService, null=True, blank=True,
        on_delete=models.SET_NULL, related_name="tickets"
    )

    # basic SLA fields (optional)
    first_response_at = models.DateTimeField(blank=True, null=True)
    resolved_at = models.DateTimeField(blank=True, null=True)

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

class TicketComment(models.Model):
    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE, related_name="comments")
    author = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True)
    message = models.TextField()
    is_internal = models.BooleanField(default=False)  # if internal notes for agents/leads/admin
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"CMT {self.ticket_id} by {self.author_id}"  # safe even if None

class TicketAttachment(models.Model):
    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE, related_name="attachments")
    file = models.FileField(upload_to="support_attachments/%Y/%m/")
    uploaded_by = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

# Optional: full audit for field changes
class TicketAudit(models.Model):
    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE, related_name="audits")
    actor = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True)
    field = models.CharField(max_length=64)
    old_value = models.TextField(blank=True, null=True)
    new_value = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)

# Daily sequence for ticket id
class TicketDailySequence(models.Model):
    day = models.DateField(unique=True)
    counter = models.PositiveIntegerField(default=0)

def generate_ticket_id(prefix="VPMVP"):
    """
    Format: VPMVPDDMMYYYY######  e.g., VPMVP04102025000001
    Sequence restarts each day.
    """
    today = timezone.localdate()
    with transaction.atomic():
        seq, _ = TicketDailySequence.objects.select_for_update().get_or_create(day=today)
        seq.counter += 1
        seq.save()
    ddmmyyyy = today.strftime("%d%m%Y")
    return f"{prefix}{ddmmyyyy}{seq.counter:06d}"
