"""
Сериализаторы, используемые в приложении.
"""
from django.contrib.auth import get_user_model
from rest_framework import serializers
from main.models import UserProfile
from access_controller.settings import ZENDESK_ROLES


class UserSerializer(serializers.HyperlinkedModelSerializer):
    """
    Класс serializer для модели User.

    :param model: Модель, на основании которой создается сериализатор
    :type model: :class:`django.contrib.auth.Models`
    :param fields: Передаваемые поля
    :type email: :class:`list`
    """
    class Meta:
        model = get_user_model()
        fields = ['email']


class ProfileSerializer(serializers.HyperlinkedModelSerializer):
    """
    Класс serializer для модели профиля пользователя.

    :param user: Вложенный сериализатор
    :type user: :class:`UserSerializer`
    :param model: Модель, на основании которой создается сериализатор
    :type model: :class:`django.contrib.auth.Models`
    :param fields: Передаваемые поля
    :type email: :class:`list`
    """
    user = UserSerializer()

    class Meta:
        model = UserProfile
        fields = ['user', 'id', 'name', 'zendesk_role']


class ZendeskUserSerializer(serializers.Serializer):
    """
    Класс serializer для объектов пользователей из Zenpy.

    :param name: Имя пользователя
    :type name: :class:`str`
    :param zendesk_role: Роль из Zendesk
    :type zendesk_role: :class:`str`
    :param email: Email пользователя
    :type email: :class:`str`
    """
    name = serializers.CharField()
    zendesk_role = serializers.SerializerMethodField('get_zendesk_role')
    email = serializers.EmailField()

    @staticmethod
    def get_zendesk_role(obj) -> str:
        """
        Функция строкового заполнения поля сериализатора zendesk_role.

        :param obj: объект пользователя Zendesk
        :return: роль engineer либо light_agent
        """
        if obj.custom_role_id == ZENDESK_ROLES['engineer']:
            return 'engineer'
        if obj.custom_role_id == ZENDESK_ROLES['light_agent']:
            return 'light_agent'
        return "empty"

    def create(self, validated_data):
        pass

    def update(self, instance, validated_data):
        pass
