"""
Namespace that defines fields common to all blocks used in the LMS
"""
from xblock.core import Namespace, Boolean, Scope, String, Float
from xmodule.fields import Date, Timedelta


class StringyBoolean(Boolean):
    """
    Reads strings from JSON as booleans.

    'true' (case insensitive) return True, other strings return False
    Other types are returned unchanged
    """
    def from_json(self, value):
        if isinstance(value, basestring):
            return value.lower() == 'true'
        return value


class StringyFloat(Float):
    """
    Reads values as floats. If the value parses as a float, returns
    that, otherwise returns None
    """
    def from_json(self, value):
        try:
            return float(value)
        except:
            return None


class LmsNamespace(Namespace):
    """
    Namespace that defines fields common to all blocks used in the LMS
    """
    hide_from_toc = StringyBoolean(
        help="Whether to display this module in the table of contents",
        default=False,
        scope=Scope.settings
    )
    graded = Boolean(
        help="Whether this module contributes to the final course grade",
        default=False,
        scope=Scope.settings
    )
    format = String(
        help="What format this module is in (used for deciding which "
             "grader to apply, and what to show in the TOC)",
        scope=Scope.settings,
    )

    start = Date(help="Start time when this module is visible", scope=Scope.settings)
    due = String(help="Date that this problem is due by", scope=Scope.settings, default='')
    source_file = String(help="DO NOT USE", scope=Scope.settings)
    xqa_key = String(help="DO NOT USE", scope=Scope.settings)
    ispublic = Boolean(help="Whether this course is open to the public, or only to admins", scope=Scope.settings)
    graceperiod = Timedelta(
        help="Amount of time after the due date that submissions will be accepted",
        scope=Scope.settings
    )
    showanswer = String(help="When to show the problem answer to the student", scope=Scope.settings, default="closed")
    rerandomize = String(help="When to rerandomize the problem", default="always", scope=Scope.settings)
    days_early_for_beta = StringyFloat(
        help="Number of days early to show content to beta users",
        default=None,
        scope=Scope.settings
    )
