"""DMS audit bounded context — DRF serializers.

All serializers expose ``public_id`` as ``id`` to match the API convention
used across all DMS bounded contexts.
"""

from __future__ import annotations

from rest_framework import serializers

from simorgh.apps.dms.audit.models import (
    AccessLog,
    DocumentAuditLog,
    SecurityEvent,
)


class DocumentAuditLogSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source="public_id", read_only=True)
    action_display = serializers.CharField(source="get_action_display", read_only=True)
    actor_id = serializers.SerializerMethodField()

    class Meta:
        model = DocumentAuditLog
        fields = [
            "id",
            "document_id",
            "version_ref_id",
            "actor_id",
            "action",
            "action_display",
            "before_state",
            "after_state",
            "metadata",
            "ip_address",
            "user_agent",
            "occurred_at",
        ]
        read_only_fields = fields

    def get_actor_id(self, obj) -> str | None:
        return str(obj.actor_id) if obj.actor_id else None


class AccessLogSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source="public_id", read_only=True)
    access_type_display = serializers.CharField(
        source="get_access_type_display", read_only=True
    )
    actor_id = serializers.SerializerMethodField()

    class Meta:
        model = AccessLog
        fields = [
            "id",
            "document_id",
            "version_ref_id",
            "actor_id",
            "access_type",
            "access_type_display",
            "ip_address",
            "user_agent",
            "metadata",
            "occurred_at",
        ]
        read_only_fields = fields

    def get_actor_id(self, obj) -> str | None:
        return str(obj.actor_id) if obj.actor_id else None


class SecurityEventSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source="public_id", read_only=True)
    event_type_display = serializers.CharField(
        source="get_event_type_display", read_only=True
    )
    severity_display = serializers.CharField(
        source="get_severity_display", read_only=True
    )
    actor_id = serializers.SerializerMethodField()

    class Meta:
        model = SecurityEvent
        fields = [
            "id",
            "document_id",
            "actor_id",
            "event_type",
            "event_type_display",
            "severity",
            "severity_display",
            "description",
            "ip_address",
            "metadata",
            "occurred_at",
        ]
        read_only_fields = fields

    def get_actor_id(self, obj) -> str | None:
        return str(obj.actor_id) if obj.actor_id else None
