from rest_framework import serializers

from apps.repository.documents.models import (
    AccessRequest,
    Author,
    Collection,
    Document,
    DocumentVersion,
    MetadataSchema,
    QARecord,
)


class AuthorSerializer(serializers.ModelSerializer):
    full_name = serializers.CharField(read_only=True)

    class Meta:
        model = Author
        fields = (
            "id",
            "first_name",
            "last_name",
            "full_name",
            "orcid",
            "email",
            "institution",
            "affiliation_text",
            "verified_at",
        )
        read_only_fields = ("verified_at",)


class CollectionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Collection
        fields = (
            "id",
            "name",
            "slug",
            "description",
            "parent",
            "visibility",
            "qa_workflow_enabled",
            "metadata_schema",
        )
        read_only_fields = fields


class MetadataSchemaSerializer(serializers.ModelSerializer):
    class Meta:
        model = MetadataSchema
        fields = (
            "id",
            "name",
            "description",
            "mandatory_fields",
            "controlled_vocabularies",
            "auto_classification_rules",
        )
        read_only_fields = ("id",)


class DocumentVersionSerializer(serializers.ModelSerializer):
    class Meta:
        model = DocumentVersion
        fields = (
            "id",
            "version_number",
            "file",
            "uploaded_by",
            "uploaded_at",
            "changelog",
        )
        read_only_fields = fields


class DocumentSerializer(serializers.ModelSerializer):
    authors = AuthorSerializer(many=True, read_only=True)
    collection_slug = serializers.CharField(source="collection.slug", read_only=True)
    effective_visibility = serializers.CharField(read_only=True)

    class Meta:
        model = Document
        fields = (
            "id",
            "document_uid",
            "public_document_id",
            "title",
            "abstract",
            "document_type",
            "doi",
            "license_type",
            "language",
            "year",
            "collection",
            "collection_slug",
            "visibility",
            "effective_visibility",
            "authors",
            "grant_reference",
            "grant_closed_flag",
            "status",
            "submitted_at",
            "published_at",
            "created_at",
        )
        read_only_fields = fields


class QARecordSerializer(serializers.ModelSerializer):
    class Meta:
        model = QARecord
        fields = (
            "id",
            "document",
            "reviewer",
            "pre_check_passed",
            "pre_check_notes",
            "decision",
            "comments",
            "assigned_at",
            "decided_at",
        )
        read_only_fields = fields


class AccessRequestSerializer(serializers.ModelSerializer):
    class Meta:
        model = AccessRequest
        fields = (
            "id",
            "document",
            "requester",
            "justification",
            "status",
            "decided_by",
            "decided_at",
            "decision_note",
            "created_at",
        )
        read_only_fields = (
            "id",
            "requester",
            "status",
            "decided_by",
            "decided_at",
            "decision_note",
            "created_at",
        )
