"""DMS versioning — REST serializers."""

from __future__ import annotations

from rest_framework import serializers

from simorgh.apps.dms.versioning.models import CheckoutSession, DocumentLock, VersionDiff


# ---------------------------------------------------------------------------
# DocumentLock
# ---------------------------------------------------------------------------

class DocumentLockSerializer(serializers.ModelSerializer):
    locked_by_id = serializers.IntegerField(
        source="locked_by.pk", read_only=True, allow_null=True
    )
    locked_by_name = serializers.SerializerMethodField()
    document_id = serializers.UUIDField(source="document.public_id", read_only=True)

    class Meta:
        model = DocumentLock
        fields = (
            "id",
            "public_id",
            "document_id",
            "locked_by_id",
            "locked_by_name",
            "lock_token",
            "status",
            "is_active",
            "expires_at",
            "notes",
            "created_at",
            "updated_at",
        )
        read_only_fields = fields

    def get_locked_by_name(self, obj):
        if obj.locked_by is None:
            return None
        fn = getattr(obj.locked_by, "get_full_name", None)
        return fn() if callable(fn) else str(obj.locked_by)


# ---------------------------------------------------------------------------
# Input serializers
# ---------------------------------------------------------------------------

class CheckoutInputSerializer(serializers.Serializer):
    expires_at = serializers.DateTimeField(required=False, allow_null=True, default=None)
    notes = serializers.CharField(required=False, allow_blank=True, default="")


class CheckinInputSerializer(serializers.Serializer):
    file_asset_id = serializers.UUIDField(required=False, allow_null=True, default=None)
    bump = serializers.ChoiceField(choices=["minor", "major"], required=False, default="minor")
    label = serializers.CharField(required=False, allow_blank=True, default="")
    change_summary = serializers.CharField(required=False, allow_blank=True, default="")
    lock_token = serializers.UUIDField(required=False, allow_null=True, default=None)


class ForceReleaseInputSerializer(serializers.Serializer):
    reason = serializers.CharField(required=False, allow_blank=True, default="")


# ---------------------------------------------------------------------------
# CheckoutSession
# ---------------------------------------------------------------------------

class CheckoutSessionSerializer(serializers.ModelSerializer):
    actor_id = serializers.IntegerField(
        source="actor.pk", read_only=True, allow_null=True
    )
    lock_holder_id = serializers.IntegerField(
        source="lock_holder.pk", read_only=True, allow_null=True
    )
    version_created_id = serializers.UUIDField(
        source="version_created.public_id", read_only=True, allow_null=True
    )

    class Meta:
        model = CheckoutSession
        fields = (
            "id",
            "public_id",
            "action",
            "actor_id",
            "lock_holder_id",
            "lock_token",
            "version_created_id",
            "notes",
            "created_at",
        )
        read_only_fields = fields


# ---------------------------------------------------------------------------
# VersionDiff
# ---------------------------------------------------------------------------

class VersionDiffSerializer(serializers.ModelSerializer):
    from_version_id = serializers.UUIDField(
        source="from_version.public_id", read_only=True
    )
    to_version_id = serializers.UUIDField(
        source="to_version.public_id", read_only=True
    )

    class Meta:
        model = VersionDiff
        fields = (
            "id",
            "public_id",
            "from_version_id",
            "to_version_id",
            "diff_type",
            "status",
            "diff_summary",
            "diff_data",
            "created_at",
            "updated_at",
        )
        read_only_fields = fields


class VersionDiffRequestSerializer(serializers.Serializer):
    from_version_id = serializers.UUIDField()
    to_version_id = serializers.UUIDField()
    diff_type = serializers.ChoiceField(
        choices=["content", "metadata", "full"],
        required=False,
        default="full",
    )
