from rest_framework import serializers
from webapp.models.koleksi import (
    Contents, Attachments,
    ContentVersion, ContentVersionAttachment,
    ContentTag, Categories
)

# ========== Attachments ==========
class AttachmentSerializer(serializers.ModelSerializer):
    url = serializers.SerializerMethodField()

    class Meta:
        model = Attachments
        fields = ["pk", "name", "path", "_type", "size", "is_deleted", "url"]

    def get_url(self, obj):
        request = self.context.get("request")
        if request is None:
            return None
        return request.build_absolute_uri(f"/assets/resources/{obj.path}")


# ========== Version Attachments ==========
class ContentVersionAttachmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = ContentVersionAttachment
        fields = ["pk", "name", "path", "content_type", "size", "created"]


# ========== Versions ==========
class ContentVersionSerializer(serializers.ModelSerializer):
    attachments = serializers.SerializerMethodField()

    class Meta:
        model = ContentVersion
        fields = [
            "pk", "judul", "deskripsi", "status_konten",
            "created", "attachments"
        ]

    def get_attachments(self, obj):
        qs = ContentVersionAttachment.objects.filter(pk_version=obj.pk)
        return ContentVersionAttachmentSerializer(qs, many=True).data


# ========== Main Content ==========
class ContentSerializer(serializers.ModelSerializer):
    attachments = serializers.SerializerMethodField()
    versions = serializers.SerializerMethodField()
    tags = serializers.SerializerMethodField()
    category = serializers.SerializerMethodField()
    skpd = serializers.SerializerMethodField()

    class Meta:
        model = Contents
        fields = [
            "pk", "judul", "deskripsi", "status_konten",
            "created", "updated", "pk_categories", "category",
            "pk_skpd_dg", "skpd", "tahun", "user_input", "attributes",
            "attachments", "versions", "tags"
        ]
        read_only_fields = [
            "pk", "created", "updated",
            "attachments", "versions", "tags", "category", "skpd"
        ]

    def get_attachments(self, obj):
        qs = Attachments.objects.filter(pk_contents=obj.pk, is_deleted=False)
        return AttachmentSerializer(qs, many=True, context=self.context).data

    def get_versions(self, obj):
        qs = ContentVersion.objects.filter(pk_contents=obj.pk).order_by("-created")
        return ContentVersionSerializer(qs, many=True).data

    def get_tags(self, obj):
        return [
            ct.tag.name for ct in ContentTag.objects.filter(content=obj).select_related("tag")
        ]

    def get_category(self, obj):
        if isinstance(obj.pk_categories, Categories):
            return obj.pk_categories.text
        return None

    def get_skpd(self, obj):
        if obj.pk_skpd_dg:
            return obj.pk_skpd_dg.urai
        return None


# ========== Create / Update ==========
class ContentCreateSerializer(serializers.Serializer):
    judul = serializers.CharField()
    deskripsi = serializers.CharField(required=False, allow_blank=True)
    tahun = serializers.IntegerField()
    pk_categories = serializers.IntegerField()
    pk_skpd_dg = serializers.IntegerField()
    status_konten = serializers.CharField(required=False, allow_blank=True)
    tags = serializers.CharField(required=False, allow_blank=True)

    attachments = serializers.ListField(
        child=serializers.FileField(), required=False
    )


# ========== PDF → DOCX Serializer ==========   
class PdfToDocxSerializer(serializers.Serializer):
    file = serializers.FileField(required=False)
    url = serializers.URLField(required=False)

    def validate(self, data):
        # HILANGKAN field file jika berupa string empty
        if data.get("file") in ["", None]:
            data["file"] = None

        if not data.get("file") and not data.get("url"):
            raise serializers.ValidationError("Harus mengirim file PDF atau URL PDF.")
        return data

# ========== PDF → IMAGE Serializer ==========    
class PdfToImageSerializer(serializers.Serializer):
    file = serializers.FileField(required=False)
    url = serializers.URLField(required=False)

    def validate(self, data):
        # Hilangkan field file jika berupa string kosong
        if data.get("file") in ["", None]:
            data["file"] = None

        if not data.get("file") and not data.get("url"):
            raise serializers.ValidationError("Harus mengirim file PDF atau URL PDF.")
        return data
    
# ========== IMAGE → PDF Serializer ==========  
class ImagesToPdfSerializer(serializers.Serializer):
    images = serializers.ListField(
        child=serializers.ImageField(),
        required=True,
        help_text="Upload satu atau lebih gambar"
    )

    def validate_images(self, value):
        if not value or len(value) == 0:
            raise serializers.ValidationError("Harus mengunggah minimal satu gambar.")
        return value
    
# ========== IMAGE → DOCX Serializer ==========  
class ImagesToDocxSerializer(serializers.Serializer):
    images = serializers.ListField(
        child=serializers.ImageField(),
        required=True,
        help_text="Upload satu atau lebih gambar"
    )

    def validate_images(self, value):
        if not value or len(value) == 0:
            raise serializers.ValidationError("Harus mengunggah minimal satu gambar.")
        return value
    
# ========== DOCX → PDF Serializer ========== 
class DocxToPdfSerializer(serializers.Serializer):
    file = serializers.FileField(required=True, help_text="Upload file DOCX")

    def validate_file(self, value):
        if not value.name.lower().endswith(".docx"):
            raise serializers.ValidationError("File harus berekstensi DOCX.")
        return value
    

# ========== DOCX → IMAGE Serializer ========== 
class DocxToImageSerializer(serializers.Serializer):
    file = serializers.FileField(required=True)

    def validate_file(self, value):
        if not value.name.lower().endswith(".docx"):
            raise serializers.ValidationError("File harus berekstensi .docx")
        return value
    

