"""DMS records — serializers."""

from __future__ import annotations

from rest_framework import serializers

from simorgh.apps.dms.records.models import ActionOnExpiry, ArchiveRecord, LegalHold, RetentionPolicy


# ---------------------------------------------------------------------------
# RetentionPolicy
# ---------------------------------------------------------------------------

class RetentionPolicySerializer(serializers.ModelSerializer):
    """Read serializer for RetentionPolicy."""

    public_id = serializers.UUIDField(read_only=True)
    action_on_expiry_display = serializers.CharField(
        source="get_action_on_expiry_display", read_only=True
    )

    class Meta:
        model = RetentionPolicy
        fields = [
            "public_id",
            "name",
            "description",
            "retention_period_days",
            "action_on_expiry",
            "action_on_expiry_display",
            "is_active",
            "created_at",
            "updated_at",
        ]


class RetentionPolicyWriteSerializer(serializers.Serializer):
    """Write serializer for creating/updating a retention policy."""

    name = serializers.CharField(max_length=200)
    description = serializers.CharField(
        allow_blank=True, default="", required=False
    )
    retention_period_days = serializers.IntegerField(min_value=0, default=0)
    action_on_expiry = serializers.ChoiceField(
        choices=ActionOnExpiry.choices,
        default=ActionOnExpiry.REVIEW,
    )
    is_active = serializers.BooleanField(default=True, required=False)


class RetentionPolicyUpdateSerializer(serializers.Serializer):
    """Write serializer for partial update of a retention policy."""

    name = serializers.CharField(max_length=200, required=False)
    description = serializers.CharField(allow_blank=True, required=False)
    retention_period_days = serializers.IntegerField(min_value=0, required=False)
    action_on_expiry = serializers.ChoiceField(
        choices=ActionOnExpiry.choices, required=False
    )
    is_active = serializers.BooleanField(required=False)


# ---------------------------------------------------------------------------
# LegalHold
# ---------------------------------------------------------------------------

class LegalHoldSerializer(serializers.ModelSerializer):
    """Read serializer for LegalHold."""

    public_id = serializers.UUIDField(read_only=True)
    document_id = serializers.UUIDField(source="document.public_id", read_only=True)
    placed_by_id = serializers.IntegerField(source="placed_by.pk", read_only=True, allow_null=True)
    placed_by_name = serializers.CharField(
        source="placed_by.get_full_name", read_only=True, allow_null=True
    )
    released_by_id = serializers.IntegerField(
        source="released_by.pk", read_only=True, allow_null=True
    )
    released_by_name = serializers.CharField(
        source="released_by.get_full_name", read_only=True, allow_null=True
    )
    is_active = serializers.BooleanField(read_only=True)

    class Meta:
        model = LegalHold
        fields = [
            "public_id",
            "document_id",
            "name",
            "notes",
            "placed_by_id",
            "placed_by_name",
            "released_by_id",
            "released_by_name",
            "started_at",
            "ended_at",
            "is_active",
        ]


class LegalHoldWriteSerializer(serializers.Serializer):
    """Write serializer for placing a legal hold."""

    name = serializers.CharField(max_length=200)
    notes = serializers.CharField(allow_blank=True, default="", required=False)


# ---------------------------------------------------------------------------
# ArchiveRecord
# ---------------------------------------------------------------------------

class ArchiveRecordSerializer(serializers.ModelSerializer):
    """Read serializer for ArchiveRecord."""

    public_id = serializers.UUIDField(read_only=True)
    document_id = serializers.UUIDField(source="document.public_id", read_only=True)
    version_id = serializers.UUIDField(
        source="version.public_id", read_only=True, allow_null=True
    )
    retention_policy_id = serializers.UUIDField(
        source="retention_policy.public_id", read_only=True, allow_null=True
    )
    retention_policy_name = serializers.CharField(
        source="retention_policy.name", read_only=True, allow_null=True
    )
    archived_by_id = serializers.IntegerField(
        source="archived_by.pk", read_only=True, allow_null=True
    )
    archived_by_name = serializers.CharField(
        source="archived_by.get_full_name", read_only=True, allow_null=True
    )

    class Meta:
        model = ArchiveRecord
        fields = [
            "public_id",
            "document_id",
            "version_id",
            "retention_policy_id",
            "retention_policy_name",
            "archived_by_id",
            "archived_by_name",
            "archived_at",
            "reason",
            "expires_at",
            "is_permanent",
            "created_at",
        ]


class ArchiveRecordWriteSerializer(serializers.Serializer):
    """Write serializer for creating an archive record."""

    reason = serializers.CharField(allow_blank=True, default="", required=False)
    version_id = serializers.UUIDField(
        required=False,
        allow_null=True,
        help_text="Optional: archive a specific document version.",
    )
    retention_policy_id = serializers.UUIDField(
        required=False,
        allow_null=True,
        help_text="Optional: retention policy to apply.",
    )
    is_permanent = serializers.BooleanField(default=False, required=False)
