from rest_framework import serializers
from webapp.models.koleksi import (
    Surat, Suratf, Suratd, Disposisi,
    SuratVersionAttachment, SuratVersion
)


# ============================================================
#  VERSION ATTACHMENT
# ============================================================
class SuratVersionAttachmentSerializer(serializers.ModelSerializer):
    url = serializers.SerializerMethodField()

    class Meta:
        model = SuratVersionAttachment
        fields = ["_pk", "name", "path", "url", "_type", "size", "created"]

    def get_url(self, obj):
        """
        Menghasilkan URL absolut berdasarkan path lampiran versi.
        """
        request = self.context.get("request")
        if request:
            # Menggunakan path lengkap dari settings (misalnya: MEDIA_URL/RELPATH/...)
            return request.build_absolute_uri(f"/assets/upload/surat/{obj.path}")
        return obj.path


# ============================================================
#  VERSION RECORD
# ============================================================
class SuratVersionSerializer(serializers.ModelSerializer):
    attachments = serializers.SerializerMethodField()

    class Meta:
        model = SuratVersion
        fields = [
            "_pk",
            "nomor", "tanggal",
            "pengirim_nama", "penerima_nama",
            "perihal", "sifat", "jenis",
            "status_surat",
            "created",
            "attachments",
        ]

    def get_attachments(self, obj):
        """
        Mengembalikan daftar lampiran yang terkait dengan versi surat.
        """
        qs = SuratVersionAttachment.objects.filter(pk_version=obj._pk)
        return SuratVersionAttachmentSerializer(
            qs,
            many=True,
            context={"request": self.context.get("request")}
        ).data


# ============================================================
#  LAMPIRAN SURAT
# ============================================================
class SuratfSerializer(serializers.ModelSerializer):
    url = serializers.SerializerMethodField()

    class Meta:
        model = Suratf
        fields = ["_pk", "name", "url", "_type", "size"]

    def get_url(self, obj):
        """
        Menghasilkan URL absolut untuk lampiran surat.
        """
        request = self.context.get("request")
        if request:
            # Menggunakan path lengkap dari settings (misalnya: MEDIA_URL/RELPATH/...)
            return request.build_absolute_uri(f"/assets/upload/surat/{obj.path}")
        return obj.path


# ============================================================
#  TUJUAN SURAT
# ============================================================
class SuratdSerializer(serializers.ModelSerializer):
    class Meta:
        model = Suratd
        fields = ["_pk", "kepada", "catatan", "created", "updated"]


# ============================================================
#  DISPOSISI SURAT
# ============================================================
class DisposisiSerializer(serializers.ModelSerializer):
    class Meta:
        model = Disposisi
        fields = ["_pk", "tanggal", "sifat", "kepada", "catatan", "user_input"]


# ============================================================
#  SURAT UTAMA (LENGKAP)
# ============================================================
class SuratSerializer(serializers.ModelSerializer):
    lampiran = SuratfSerializer(source="suratf_set", many=True, read_only=True)
    tujuan = SuratdSerializer(source="suratd_set", many=True, read_only=True)
    disposisi = DisposisiSerializer(source="disposisi_set", many=True, read_only=True)
    # ❌ FIELD 'versions' DIHAPUS untuk optimasi kinerja.
    # Versi diakses melalui endpoint khusus /api/surat/{pk}/versions/

    class Meta:
        model = Surat
        fields = [
            "_pk", "_type", "nomor", "tanggal",
            "pengirim", "pengirim_nama", "pengirim_instansi",
            "penerima", "penerima_nama", "penerima_instansi",
            "sifat", "jenis", "perihal",
            "user_input", "status_surat",
            "created", "updated",
            "lampiran", "tujuan", "disposisi",
            # 'versions', <-- dihapus
        ]
        read_only_fields = ["_pk", "created", "updated"]

    # ❌ METHOD 'get_versions' DIHAPUS
    # def get_versions(self, obj):
    #     versions = SuratVersion.objects.filter(pk_surat=obj._pk).order_by("-created")
    #     return SuratVersionSerializer(
    #         versions,
    #         many=True,
    #         context={"request": self.context.get("request")}
    #     ).data