"""DMS search — REST serializers."""

from __future__ import annotations

from rest_framework import serializers

from simorgh.apps.dms.search.models import DocumentSearchIndex, SavedSearch


# ---------------------------------------------------------------------------
# DocumentSearchIndex output
# ---------------------------------------------------------------------------

class DocumentSearchIndexSerializer(serializers.ModelSerializer):
    """Read-only serializer for search results."""

    document_id = serializers.UUIDField(source="document.public_id", read_only=True)

    class Meta:
        model = DocumentSearchIndex
        fields = (
            "public_id",
            "document_id",
            "title",
            "code",
            "document_type_code",
            "document_type_name",
            "repository_public_id",
            "folder_public_id",
            "status",
            "workflow_status",
            "file_name",
            "content_type",
            "file_size",
            "version_label",
            "tags",
            "indexed_at",
            "index_version",
        )
        read_only_fields = fields


# ---------------------------------------------------------------------------
# Search params input
# ---------------------------------------------------------------------------

class SearchParamsSerializer(serializers.Serializer):
    """Validates incoming search query parameters.

    All fields are optional.  Unrecognised query params are ignored so that
    future extensions (e.g. OpenSearch facet hints) don't break older clients.
    """

    q = serializers.CharField(required=False, allow_blank=True, default=None)
    repository_id = serializers.UUIDField(required=False, allow_null=True, default=None)
    folder_id = serializers.UUIDField(required=False, allow_null=True, default=None)
    document_type = serializers.CharField(
        required=False, allow_blank=True, default=None
    )
    status = serializers.CharField(required=False, allow_blank=True, default=None)
    content_type = serializers.CharField(
        required=False, allow_blank=True, default=None
    )
    indexed_after = serializers.DateTimeField(
        required=False, allow_null=True, default=None
    )
    indexed_before = serializers.DateTimeField(
        required=False, allow_null=True, default=None
    )
    tags = serializers.ListField(
        child=serializers.CharField(), required=False, default=list
    )
    sort = serializers.ChoiceField(
        choices=["title", "indexed_at", "status", "content_type", "version_label"],
        required=False,
        default="indexed_at",
    )
    order = serializers.ChoiceField(
        choices=["asc", "desc"],
        required=False,
        default="desc",
    )


# ---------------------------------------------------------------------------
# SavedSearch
# ---------------------------------------------------------------------------

class SavedSearchSerializer(serializers.ModelSerializer):
    """Read serializer for SavedSearch."""

    owner_id = serializers.IntegerField(source="owner.pk", read_only=True)

    class Meta:
        model = SavedSearch
        fields = (
            "public_id",
            "name",
            "description",
            "query_params",
            "is_shared",
            "owner_id",
            "last_used_at",
            "use_count",
            "created_at",
            "updated_at",
        )
        read_only_fields = (
            "public_id",
            "owner_id",
            "last_used_at",
            "use_count",
            "created_at",
            "updated_at",
        )


class SavedSearchWriteSerializer(serializers.Serializer):
    """Input serializer for create / update of SavedSearch.

    All fields are optional so that partial updates work with ``partial=True``.
    Callers must enforce ``name`` presence at the service layer for creates.
    """

    name = serializers.CharField(max_length=200, required=False)
    description = serializers.CharField(
        required=False, allow_blank=True, default=""
    )
    query_params = serializers.DictField(required=False, default=dict)
    is_shared = serializers.BooleanField(required=False, default=False)
