"""DMS preview — REST serializers."""

from __future__ import annotations

from rest_framework import serializers

from simorgh.apps.dms.preview.models import PreviewFormat, PreviewRecord


class PreviewRecordSerializer(serializers.ModelSerializer):
    """Read serializer for a PreviewRecord — used in list and detail responses."""

    file_asset_id = serializers.UUIDField(
        source="file_asset.public_id", read_only=True, allow_null=True
    )

    class Meta:
        model = PreviewRecord
        fields = (
            "id",
            "public_id",
            "preview_format",
            "page_number",
            "width",
            "height",
            "status",
            "failure_reason",
            "provider",
            "provider_job_id",
            "file_asset_id",
            "file_size_bytes",
            "content_type",
            "is_primary",
            "created_at",
            "updated_at",
        )
        read_only_fields = fields


class PreviewRequestInputSerializer(serializers.Serializer):
    """Input for POST /previews/ — request a new preview rendition."""

    preview_format = serializers.ChoiceField(choices=PreviewFormat.values)
    page_number = serializers.IntegerField(min_value=1, required=False, allow_null=True)
    width = serializers.IntegerField(min_value=1, required=False, allow_null=True)
    height = serializers.IntegerField(min_value=1, required=False, allow_null=True)
    provider = serializers.CharField(max_length=100, required=False, default="", allow_blank=True)
    is_primary = serializers.BooleanField(required=False, default=False)


class PreviewCompleteInputSerializer(serializers.Serializer):
    """Input for POST /previews/{id}/complete/ — mark a preview as ready."""

    file_asset_id = serializers.UUIDField()
    width = serializers.IntegerField(min_value=1, required=False, allow_null=True)
    height = serializers.IntegerField(min_value=1, required=False, allow_null=True)


class PreviewFailInputSerializer(serializers.Serializer):
    """Input for POST /previews/{id}/fail/ — mark a preview as failed."""

    reason = serializers.CharField(required=False, default="", allow_blank=True)


class PreviewMarkProcessingInputSerializer(serializers.Serializer):
    """Input for POST /previews/{id}/processing/ — mark as processing."""

    provider_job_id = serializers.CharField(
        max_length=255, required=False, default="", allow_blank=True
    )
