"""
Store status messages in the database.
"""

from config_models.admin import ConfigurationModelAdmin
from config_models.models import ConfigurationModel
from django.contrib import admin
from django.core.cache import cache
from django.db import models

from openedx.core.djangoapps.xmodule_django.models import CourseKeyField


class GlobalStatusMessage(ConfigurationModel):
    """
    Model that represents the current status message.
    """
    message = models.TextField(blank=True, null=True)

    def full_message(self, course_key):
        """ Returns the full status message, including any course-specific status messages. """
        cache_key = "status_message.{course_id}".format(course_id=unicode(course_key))
        if cache.get(cache_key):
            return cache.get(cache_key)

        msg = self.message
        if course_key:
            try:
                course_home_message = self.coursemessage_set.get(course_key=course_key)
                # Don't add the message if course_home_message is blank.
                if course_home_message:
                    msg = u"{} <br /> {}".format(msg, course_home_message.message)
            except CourseMessage.DoesNotExist:
                # We don't have a course-specific message, so pass.
                pass
        cache.set(cache_key, msg)
        return msg

    def __unicode__(self):
        return "{} - {} - {}".format(self.change_date, self.enabled, self.message)


class CourseMessage(models.Model):
    """
    Model that allows the user to specify messages for individual courses.

    This is not a ConfigurationModel because using it's not designed to support multiple configurations at once,
    which would be problematic if separate courses need separate error messages.
    """
    global_message = models.ForeignKey(GlobalStatusMessage)
    course_key = CourseKeyField(max_length=255, blank=True, db_index=True)
    message = models.TextField(blank=True, null=True)

    def __unicode__(self):
        return unicode(self.course_key)


admin.site.register(GlobalStatusMessage, ConfigurationModelAdmin)
admin.site.register(CourseMessage)
