from rest_framework import serializers
from rest_framework.serializers import ModelSerializer

from common.utils import convert_html_to_markdown
from ..models import MessageContent


class SenderMixin(ModelSerializer):
    sender = serializers.SerializerMethodField()

    def get_sender(self, site_msg) -> str:
        sender = site_msg.sender
        if sender:
            return str(sender)
        else:
            return ''


class MessageContentSerializer(SenderMixin, ModelSerializer):
    message = serializers.SerializerMethodField()

    class Meta:
        model = MessageContent
        fields = [
            'id', 'subject', 'message',
            'date_created', 'date_updated',
            'sender',
        ]

    @staticmethod
    def get_message(site_msg) -> str:
        markdown = convert_html_to_markdown(site_msg.message)
        return markdown


class SiteMessageSerializer(SenderMixin, ModelSerializer):
    content = MessageContentSerializer(read_only=True)
    has_read = serializers.BooleanField(read_only=True)
    read_at = serializers.DateTimeField(read_only=True)

    class Meta:
        model = MessageContent
        fields = [
            'id', 'has_read', 'read_at', 'content', 'date_created'
        ]


class SiteMessageIdsSerializer(serializers.Serializer):
    ids = serializers.ListField(child=serializers.UUIDField())


class SiteMessageSendSerializer(serializers.Serializer):
    subject = serializers.CharField()
    message = serializers.CharField()
    user_ids = serializers.ListField(child=serializers.UUIDField(), required=False)
    group_ids = serializers.ListField(child=serializers.UUIDField(), required=False)
    is_broadcast = serializers.BooleanField(default=False)
