# support/serializers.py
from rest_framework import serializers
from django.utils import timezone
from .models import Ticket, TicketComment, TicketAttachment, generate_ticket_id
from .models import SupportService, Ticket
from rest_framework import serializers
from .models import SupportSubject

class TicketAttachmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = TicketAttachment
        fields = ["id", "file", "uploaded_by", "created_at"]
        read_only_fields = ["id", "uploaded_by", "created_at"]

class TicketCommentSerializer(serializers.ModelSerializer):
    author_name = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = TicketComment
        fields = ["id", "author", "author_name", "message", "is_internal", "created_at"]
        read_only_fields = ["id", "author", "author_name", "created_at"]

    def get_author_name(self, obj):
        if obj.author:
            return f"{getattr(obj.author, 'first_name', '')} {getattr(obj.author, 'last_name', '')}".strip()
        return None


from .models import Ticket, SupportSubject, SupportService

class TicketSerializer(serializers.ModelSerializer):
    comments = TicketCommentSerializer(many=True, read_only=True)
    attachments = TicketAttachmentSerializer(many=True, read_only=True)
    requester_mobile = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    subject_ref = serializers.PrimaryKeyRelatedField(
        queryset=SupportSubject.objects.filter(is_active=True),
        required=False, allow_null=True
    )
    service = serializers.PrimaryKeyRelatedField(
        queryset=SupportService.objects.filter(is_active=True),
        required=False, allow_null=True
    )

    class Meta:
        model = Ticket
        fields = [
            "id", "ticket_id",
            "requester", "requester_mobile",
            "order_id",
            "subject", "description", "category",
            "priority", "status", "assignee",
            "subject_ref", "service",
            "created_at", "updated_at",
            "first_response_at", "resolved_at",
            "comments","attachments",
        ]
        read_only_fields = ["id", "ticket_id", "created_at", "updated_at", "first_response_at", "resolved_at"]

    def validate(self, attrs):
        """
        If `subject` is blank but `subject_ref` is provided, auto-fill from catalog.
        Still allow free-text subject if no catalog chosen.
        """
        subject = attrs.get("subject")
        subject_ref = attrs.get("subject_ref")
        if (not subject or str(subject).strip() == "") and subject_ref:
            attrs["subject"] = subject_ref.name
        # if *both* are empty -> hard fail (keeps API sane)
        if (not attrs.get("subject") or str(attrs["subject"]).strip() == "") and not subject_ref:
            raise serializers.ValidationError({"subject": ["This field may not be blank."]})
        return attrs


    def create(self, validated):
        # Set ticket_id
        validated["ticket_id"] = generate_ticket_id()
        return super().create(validated)

    def update(self, instance, validated):
        # auto set timestamps
        if instance.first_response_at is None and ("status" in validated or "assignee" in validated):
            validated.setdefault("first_response_at", timezone.now())
        if validated.get("status") in ("resolved", "closed"):
            validated.setdefault("resolved_at", timezone.now())
        return super().update(instance, validated)

    

# support/serializers.py


class SupportSubjectSerializer(serializers.ModelSerializer):
    count_7d = serializers.IntegerField(read_only=True)
    count_24h = serializers.IntegerField(read_only=True)

    class Meta:
        model = SupportSubject
        fields = ["id", "name", "slug", "is_active", "sort_order", "created_at", "updated_at",
                  "count_24h", "count_7d"]



class SupportServiceSerializer(serializers.ModelSerializer):
    ticket_count_24h = serializers.IntegerField(read_only=True)
    ticket_count_7d  = serializers.IntegerField(read_only=True)

    class Meta:
        model = SupportService
        fields = ["id", "name", "code", "is_active", "sort_order",
                  "ticket_count_24h", "ticket_count_7d", "created_at", "updated_at"]
