from rest_framework import serializers

from .extraction import analyze_document
from .models import CustomsDocument, Folder


class FolderSerializer(serializers.ModelSerializer):
    created_by = serializers.CharField(source='created_by.username', read_only=True)
    document_count = serializers.IntegerField(read_only=True)
    validated_count = serializers.IntegerField(read_only=True)
    not_validated_count = serializers.IntegerField(read_only=True)
    pending_review_count = serializers.IntegerField(read_only=True)

    class Meta:
        model = Folder
        fields = [
            'id', 'name', 'created_by', 'created_at',
            'document_count', 'validated_count', 'not_validated_count',
            'pending_review_count',
        ]
        read_only_fields = [
            'id', 'created_by', 'created_at',
            'document_count', 'validated_count', 'not_validated_count',
            'pending_review_count',
        ]


class FolderWriteSerializer(serializers.ModelSerializer):
    """Create/rename — name is the only writable field."""

    class Meta:
        model = Folder
        fields = ['id', 'name']

    def create(self, validated_data):
        validated_data['created_by'] = self.context['request'].user
        return super().create(validated_data)


class CustomsDocumentSerializer(serializers.ModelSerializer):
    uploaded_by = serializers.CharField(source='uploaded_by.username', read_only=True)
    folder_name = serializers.CharField(source='folder.name', read_only=True, allow_null=True)

    class Meta:
        model = CustomsDocument
        fields = [
            'id', 'file', 'original_filename', 'folder', 'folder_name',
            'uploaded_by', 'uploaded_at', 'status', 'officer_name',
            'text_source', 'auto_classified',
        ]
        read_only_fields = fields


class CustomsDocumentDetailSerializer(CustomsDocumentSerializer):
    """Adds the raw extracted text — useful when an admin reviews an
    "À confirmer" document, too bulky for the list endpoint."""

    class Meta(CustomsDocumentSerializer.Meta):
        fields = CustomsDocumentSerializer.Meta.fields + ['extracted_text']
        read_only_fields = fields


class CustomsDocumentUploadSerializer(serializers.ModelSerializer):
    """Uploads a PDF and classifies it server-side right after saving."""

    class Meta:
        model = CustomsDocument
        fields = [
            'id', 'file', 'original_filename', 'folder', 'status', 'officer_name',
            'text_source', 'auto_classified',
        ]
        read_only_fields = [
            'id', 'original_filename', 'status', 'officer_name',
            'text_source', 'auto_classified',
        ]

    def create(self, validated_data):
        validated_data['uploaded_by'] = self.context['request'].user
        validated_data.setdefault('original_filename', validated_data['file'].name)
        instance = super().create(validated_data)

        # The document is already saved: an extraction failure downgrades it to
        # "À confirmer" rather than losing the operator's upload.
        result = analyze_document(instance.file.path)
        instance.status = result['statut']
        instance.officer_name = result['agent_detecte']
        instance.text_source = result['source']
        instance.extracted_text = result['texte_brut']
        instance.auto_classified = True
        instance.save(update_fields=[
            'status', 'officer_name', 'text_source', 'extracted_text', 'auto_classified',
        ])
        return instance


class CustomsDocumentReviewSerializer(serializers.Serializer):
    officer_name = serializers.CharField(required=False, allow_blank=True, max_length=255)
    status = serializers.ChoiceField(choices=[
        CustomsDocument.Status.VALIDATED,
        CustomsDocument.Status.NOT_VALIDATED,
    ])
