from rest_framework import serializers

from .models import DocumentRecord, EmployeeDocument


class EmployeeDocumentSerializer(serializers.ModelSerializer):
    class Meta:
        model = EmployeeDocument
        fields = (
            'id',
            'name',
            'description',
            'sort_id',
            'user',
            'company',
            'date_added',
            'is_required',
            'last_updated',
        )
        read_only_fields = ('id', 'date_added', 'last_updated')


class EmployeeDocumentReorderItemSerializer(serializers.Serializer):
    id = serializers.IntegerField(min_value=1)
    sort_id = serializers.IntegerField()


class EmployeeDocumentReorderSerializer(serializers.Serializer):
    company_id = serializers.IntegerField(min_value=1)
    user_id = serializers.IntegerField(min_value=1)
    documents = EmployeeDocumentReorderItemSerializer(many=True)


class DocumentRecordSerializer(serializers.ModelSerializer):
    employee_document = EmployeeDocumentSerializer(read_only=True)
    approved_by = serializers.SerializerMethodField()
    rejected_by = serializers.SerializerMethodField()

    class Meta:
        model = DocumentRecord
        fields = (
            'id',
            'employee_document',
            'status',
            'uploaded_date',
            'deadline',
            'approved_by',
            'rejected_by',
            'last_update',
            'document',
        )
        read_only_fields = ('id', 'uploaded_date', 'approved_by', 'rejected_by', 'last_update')

    def get_approved_by(self, obj):
        if not obj.approved_by:
            return None
        return {'id': obj.approved_by.id, 'username': obj.approved_by.username, 'email': obj.approved_by.email}

    def get_rejected_by(self, obj):
        if not obj.rejected_by:
            return None
        return {'id': obj.rejected_by.id, 'username': obj.rejected_by.username, 'email': obj.rejected_by.email}


class RequestDocumentRecordSerializer(serializers.Serializer):
    employee_document_id = serializers.IntegerField(min_value=1)
    deadline = serializers.DateField(required=False, allow_null=True)


class EmployeeRecordQuerySerializer(serializers.Serializer):
    user_id = serializers.IntegerField(min_value=1)
    company_id = serializers.IntegerField(min_value=1)
