from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from konova.models import BaseResource
from user.models import UserActionLogEntry


class ServerMessageImportance(models.TextChoices):
    """
    Defines importance levels for server messages
    """
    DEFAULT = "default", _("Default")
    INFO = "info", _("Info")
    WARNING = "warning", _("Warning")


class ServerMessage(BaseResource):
    """
    Holds messages, which can be displayed on the user's dashboard
    """
    subject = models.CharField(max_length=500, null=False, blank=False)
    body = models.TextField()
    is_active = models.BooleanField(default=True)
    publish_on = models.DateTimeField()
    unpublish_on = models.DateTimeField(null=True, blank=True)
    importance = models.CharField(max_length=100, choices=ServerMessageImportance.choices)

    def save(self, user=None, *args, **kwargs):
        user = kwargs.pop("user", None)
        if user is not None:
            if self.created is None:
                self.created = UserActionLogEntry.get_created_action(user)
            else:
                self.modified = UserActionLogEntry.get_edited_action(user)

        super().save(*args, **kwargs)

    @staticmethod
    def get_current_news():
        """ Getter for the most current news

        Meaning the ones that are
            * activated
            * publish_on has passed
            * unpublish_on (if set) has not been passed, yet

        """
        now = timezone.now()
        news = ServerMessage.objects.filter(
            is_active=True,
            publish_on__lte=now,
        ).exclude(
            unpublish_on__lte=now,
        ).order_by(
            "-publish_on"
        )
        return news