"""DMS AI — serializers."""

from __future__ import annotations

from rest_framework import serializers

from simorgh.apps.dms.ai.models import (
    AIClassification,
    AIClassificationType,
    EntityType,
    ExtractedEntity,
    OCRResult,
    OCRStatus,
)


# ---------------------------------------------------------------------------
# OCRResult
# ---------------------------------------------------------------------------

class OCRResultSerializer(serializers.ModelSerializer):
    """Read serializer for OCRResult."""

    public_id = serializers.UUIDField(read_only=True)
    document_version_id = serializers.UUIDField(
        source="document_version.public_id", read_only=True
    )
    status_display = serializers.CharField(source="get_status_display", read_only=True)

    class Meta:
        model = OCRResult
        fields = [
            "public_id",
            "document_version_id",
            "provider",
            "status",
            "status_display",
            "language_code",
            "full_text",
            "confidence_score",
            "page_count",
            "processing_metadata",
            "error_message",
            "submitted_at",
            "completed_at",
        ]


class OCRSubmitSerializer(serializers.Serializer):
    """Write serializer for submitting an OCR job."""

    provider = serializers.CharField(
        max_length=100,
        default="default",
        required=False,
    )
    language_code = serializers.CharField(
        max_length=20,
        allow_blank=True,
        default="",
        required=False,
    )


class OCRRecordResultSerializer(serializers.Serializer):
    """Write serializer for recording OCR results (called by provider adapters)."""

    full_text = serializers.CharField(allow_blank=True, default="")
    page_count = serializers.IntegerField(min_value=0, default=0)
    confidence_score = serializers.FloatField(
        min_value=0.0, max_value=1.0, required=False, allow_null=True
    )
    language_code = serializers.CharField(
        max_length=20, allow_blank=True, default="", required=False
    )
    processing_metadata = serializers.DictField(
        child=serializers.JSONField(), default=dict, required=False
    )


class OCRFailSerializer(serializers.Serializer):
    """Write serializer for recording OCR failures."""

    error_message = serializers.CharField()


# ---------------------------------------------------------------------------
# AIClassification
# ---------------------------------------------------------------------------

class AIClassificationSerializer(serializers.ModelSerializer):
    """Read serializer for AIClassification."""

    public_id = serializers.UUIDField(read_only=True)
    document_version_id = serializers.UUIDField(
        source="document_version.public_id", read_only=True
    )
    classification_type_display = serializers.CharField(
        source="get_classification_type_display", read_only=True
    )

    class Meta:
        model = AIClassification
        fields = [
            "public_id",
            "document_version_id",
            "provider",
            "classification_type",
            "classification_type_display",
            "label",
            "confidence_score",
            "summary",
            "tags",
            "processing_metadata",
            "created_at",
            "updated_at",
        ]


class AIClassificationSubmitSerializer(serializers.Serializer):
    """Write serializer for submitting an AI classification job."""

    classification_type = serializers.ChoiceField(
        choices=AIClassificationType.choices,
        default=AIClassificationType.DOCUMENT_TYPE,
        required=False,
    )
    provider = serializers.CharField(
        max_length=100,
        default="default",
        required=False,
    )


class AIClassificationRecordSerializer(serializers.Serializer):
    """Write serializer for recording AI classification results."""

    label = serializers.CharField(max_length=255, allow_blank=True, default="")
    confidence_score = serializers.FloatField(
        min_value=0.0, max_value=1.0, required=False, allow_null=True
    )
    summary = serializers.CharField(allow_blank=True, default="", required=False)
    tags = serializers.ListField(
        child=serializers.CharField(max_length=100),
        default=list,
        required=False,
    )
    processing_metadata = serializers.DictField(
        child=serializers.JSONField(), default=dict, required=False
    )


# ---------------------------------------------------------------------------
# ExtractedEntity
# ---------------------------------------------------------------------------

class ExtractedEntitySerializer(serializers.ModelSerializer):
    """Read serializer for ExtractedEntity."""

    public_id = serializers.UUIDField(read_only=True)
    document_version_id = serializers.UUIDField(
        source="document_version.public_id", read_only=True
    )
    entity_type_display = serializers.CharField(
        source="get_entity_type_display", read_only=True
    )
    source_id = serializers.UUIDField(
        source="source.public_id", read_only=True, allow_null=True
    )

    class Meta:
        model = ExtractedEntity
        fields = [
            "public_id",
            "document_version_id",
            "source_id",
            "entity_type",
            "entity_type_display",
            "value",
            "normalized_value",
            "confidence_score",
            "provider",
            "position_metadata",
        ]


class ExtractedEntityItemSerializer(serializers.Serializer):
    """Serializer for a single entity item in a bulk-add request."""

    entity_type = serializers.ChoiceField(
        choices=EntityType.choices,
        default=EntityType.CUSTOM,
        required=False,
    )
    value = serializers.CharField(max_length=500)
    normalized_value = serializers.CharField(
        max_length=500, allow_blank=True, default="", required=False
    )
    confidence_score = serializers.FloatField(
        min_value=0.0, max_value=1.0, required=False, allow_null=True
    )
    provider = serializers.CharField(
        max_length=100, allow_blank=True, default="", required=False
    )
    position_metadata = serializers.DictField(
        child=serializers.JSONField(), default=dict, required=False
    )


class ExtractedEntityBulkSerializer(serializers.Serializer):
    """Write serializer for bulk-adding extracted entities."""

    entities = ExtractedEntityItemSerializer(many=True)
    ocr_result_id = serializers.UUIDField(required=False, allow_null=True)
