"""DMS documents — REST serializers."""

from __future__ import annotations

from rest_framework import serializers

from simorgh.apps.dms.documents.models import Document, DocumentType, DocumentVersion


# ---------------------------------------------------------------------------
# DocumentType
# ---------------------------------------------------------------------------

class DocumentTypeSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source="public_id", read_only=True)

    class Meta:
        model = DocumentType
        fields = (
            "id", "public_id", "name", "code", "description",
            "icon", "color", "is_active", "created_at", "updated_at",
        )
        read_only_fields = fields


class DocumentTypeCreateInputSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=200)
    code = serializers.SlugField(max_length=80)
    description = serializers.CharField(required=False, default="", allow_blank=True)
    icon = serializers.CharField(max_length=64, required=False, default="", allow_blank=True)
    color = serializers.CharField(max_length=32, required=False, default="", allow_blank=True)
    is_active = serializers.BooleanField(required=False, default=True)


class DocumentTypeUpdateInputSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=200, required=False)
    description = serializers.CharField(required=False, allow_blank=True)
    icon = serializers.CharField(max_length=64, required=False, allow_blank=True)
    color = serializers.CharField(max_length=32, required=False, allow_blank=True)
    is_active = serializers.BooleanField(required=False)


# ---------------------------------------------------------------------------
# DocumentVersion (nested)
# ---------------------------------------------------------------------------

class DocumentVersionSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source="public_id", read_only=True)
    file_asset_id = serializers.UUIDField(
        source="file_asset.public_id", read_only=True, allow_null=True
    )

    class Meta:
        model = DocumentVersion
        fields = (
            "id", "public_id", "version_major", "version_minor", "version_label",
            "status", "is_current", "label", "change_summary",
            "file_asset_id", "file_size_bytes", "content_type", "checksum_sha256",
            "created_at", "updated_at",
        )
        read_only_fields = fields


# ---------------------------------------------------------------------------
# Document
# ---------------------------------------------------------------------------

class DocumentSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source="public_id", read_only=True)
    document_type_id = serializers.UUIDField(
        source="document_type.public_id", read_only=True, allow_null=True
    )
    repository_id = serializers.UUIDField(source="repository.public_id", read_only=True)
    folder_id = serializers.UUIDField(
        source="folder.public_id", read_only=True, allow_null=True
    )
    current_version = DocumentVersionSerializer(read_only=True)

    class Meta:
        model = Document
        fields = (
            "id", "public_id", "title", "code", "status",
            "document_type_id", "repository_id", "folder_id",
            "workflow_status", "extra", "current_version",
            "created_at", "updated_at",
        )
        read_only_fields = fields


class DocumentCreateInputSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=500)
    repository_id = serializers.UUIDField()
    folder_id = serializers.UUIDField(required=False, allow_null=True)
    document_type_id = serializers.UUIDField(required=False, allow_null=True)
    code = serializers.CharField(max_length=100, required=False, default="", allow_blank=True)
    workflow_status = serializers.CharField(max_length=100, required=False, default="", allow_blank=True)


class DocumentUpdateInputSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=500, required=False)
    folder_id = serializers.UUIDField(required=False, allow_null=True)
    document_type_id = serializers.UUIDField(required=False, allow_null=True)
    workflow_status = serializers.CharField(max_length=100, required=False, allow_blank=True)
    extra = serializers.DictField(required=False)


# ---------------------------------------------------------------------------
# Version create input
# ---------------------------------------------------------------------------

class VersionCreateInputSerializer(serializers.Serializer):
    file_asset_id = serializers.UUIDField(required=False, allow_null=True)
    bump = serializers.ChoiceField(choices=["minor", "major"], default="minor")
    label = serializers.CharField(max_length=200, required=False, default="", allow_blank=True)
    change_summary = serializers.CharField(required=False, default="", allow_blank=True)


class RollbackInputSerializer(serializers.Serializer):
    change_summary = serializers.CharField(required=False, default="", allow_blank=True)
