"""
DRF serializers for face registration, identification, and listing.
"""

import json

from django.conf import settings
from rest_framework import serializers

from .models import FaceRecord


class FaceRecordSerializer(serializers.ModelSerializer):
    """Read serializer for FaceRecord — excludes the embedding vector."""

    class Meta:
        model = FaceRecord
        fields = ["id", "name", "photo", "created_at", "metadata"]
        read_only_fields = ["id", "created_at"]


class RegisterSerializer(serializers.Serializer):
    """Write serializer for face registration."""

    name = serializers.CharField(max_length=255, required=True)
    photo = serializers.ImageField(required=True)
    metadata = serializers.JSONField(required=False, default=dict)

    def validate_photo(self, value):
        """Validate photo file: max size 10MB, allowed types jpeg/jpg/png/webp."""
        max_size = getattr(settings, "MAX_UPLOAD_SIZE", 10 * 1024 * 1024)
        if value.size > max_size:
            raise serializers.ValidationError(
                f"Photo file size ({value.size} bytes) exceeds maximum allowed size "
                f"({max_size} bytes / {max_size // (1024 * 1024)} MB)."
            )

        allowed_types = ["image/jpeg", "image/png", "image/webp"]
        if value.content_type not in allowed_types:
            raise serializers.ValidationError(
                f"Unsupported file type '{value.content_type}'. "
                f"Allowed types: {', '.join(allowed_types)}."
            )

        return value

    def validate_metadata(self, value):
        """Ensure metadata is a valid dict."""
        if isinstance(value, str):
            try:
                value = json.loads(value)
            except json.JSONDecodeError:
                raise serializers.ValidationError("Metadata must be valid JSON.")
        if not isinstance(value, dict):
            raise serializers.ValidationError("Metadata must be a JSON object (dict).")
        return value


class IdentifySerializer(serializers.Serializer):
    """Write serializer for face identification."""

    photo = serializers.ImageField(required=True)

    def validate_photo(self, value):
        """Validate photo file: max size 10MB, allowed types jpeg/jpg/png/webp."""
        max_size = getattr(settings, "MAX_UPLOAD_SIZE", 10 * 1024 * 1024)
        if value.size > max_size:
            raise serializers.ValidationError(
                f"Photo file size ({value.size} bytes) exceeds maximum allowed size "
                f"({max_size} bytes / {max_size // (1024 * 1024)} MB)."
            )

        allowed_types = ["image/jpeg", "image/png", "image/webp"]
        if value.content_type not in allowed_types:
            raise serializers.ValidationError(
                f"Unsupported file type '{value.content_type}'. "
                f"Allowed types: {', '.join(allowed_types)}."
            )

        return value


class IdentifyResultSerializer(serializers.Serializer):
    """Read serializer for identification results."""

    matched = serializers.BooleanField()
    name = serializers.CharField()
    confidence = serializers.FloatField()
    id = serializers.IntegerField(allow_null=True)
    distance = serializers.FloatField()
