"""DMS asset serializers."""

from __future__ import annotations

from rest_framework import serializers

from simorgh.apps.storage.models import FileMetadata, FileVariant, UploadSession


class FileVariantSerializer(serializers.ModelSerializer):
    kind = serializers.CharField(source="get_kind_display", read_only=True)
    status = serializers.CharField(source="get_status_display", read_only=True)

    class Meta:
        model = FileVariant
        fields = (
            "id",
            "public_id",
            "kind",
            "status",
            "content_type",
            "size_bytes",
            "width",
            "height",
            "created_at",
            "updated_at",
        )
        read_only_fields = fields


class FileAssetSerializer(serializers.ModelSerializer):
    upload_status = serializers.CharField(read_only=True)
    virus_scan_status = serializers.CharField(read_only=True)
    processing_status = serializers.CharField(read_only=True)
    variants = FileVariantSerializer(many=True, read_only=True)
    uploaded_by_id = serializers.IntegerField(read_only=True)

    class Meta:
        model = FileMetadata
        fields = (
            "id",
            "public_id",
            "filename",
            "content_type",
            "size_bytes",
            "checksum_sha256",
            "upload_status",
            "virus_scan_status",
            "processing_status",
            "storage_backend",
            "folder_id",
            "app_context",
            "uploaded_by_id",
            "created_at",
            "updated_at",
            "variants",
        )
        read_only_fields = fields


class DirectUploadInputSerializer(serializers.Serializer):
    file = serializers.FileField()
    folder_id = serializers.UUIDField(required=False, allow_null=True, default=None)


class CreateSessionInputSerializer(serializers.Serializer):
    filename = serializers.CharField(max_length=256)
    content_type = serializers.CharField(max_length=128, required=False, default="")
    total_size_bytes = serializers.IntegerField(min_value=1)
    total_chunks = serializers.IntegerField(min_value=1, default=1)
    expected_checksum_sha256 = serializers.CharField(
        max_length=64, required=False, default=""
    )
    folder_id = serializers.UUIDField(required=False, allow_null=True, default=None)


class UploadSessionSerializer(serializers.ModelSerializer):
    status = serializers.CharField(read_only=True)
    is_expired = serializers.BooleanField(read_only=True)
    all_chunks_received = serializers.BooleanField(read_only=True)
    completed_file_id = serializers.IntegerField(read_only=True)

    class Meta:
        model = UploadSession
        fields = (
            "id",
            "public_id",
            "filename",
            "content_type",
            "total_size_bytes",
            "total_chunks",
            "received_chunks",
            "status",
            "expires_at",
            "is_expired",
            "all_chunks_received",
            "completed_file_id",
            "created_at",
            "updated_at",
        )
        read_only_fields = fields


class ReceiveChunkInputSerializer(serializers.Serializer):
    chunk_index = serializers.IntegerField(min_value=0)
    data = serializers.FileField()
