from django import forms
from django.utils.functional import cached_property
from django.utils.safestring import SafeString
from django.utils.translation import gettext as _

from wagtail.admin.staticfiles import versioned_static
from wagtail.admin.telepath import Adapter, register

from .base import Block

__all__ = ["StaticBlock"]


class StaticBlock(Block):
    """
    A block that just 'exists' and has no fields.
    """

    def get_admin_text(self):
        if self.meta.admin_text is None:
            if self.label:
                return _("%(label)s: this block has no options.") % {
                    "label": self.label
                }
            else:
                return _("This block has no options.")

        return self.meta.admin_text

    def value_from_datadict(self, data, files, prefix):
        return None

    def normalize(self, value):
        return None

    def render_basic(self, value, context=None):
        return ""

    class Meta:
        admin_text = None
        default = None


class StaticBlockAdapter(Adapter):
    js_constructor = "wagtail.blocks.StaticBlock"

    def js_args(self, block):
        admin_text = block.get_admin_text()

        if isinstance(admin_text, SafeString):
            text_or_html = "html"
        else:
            text_or_html = "text"

        return [
            block.name,
            {
                text_or_html: admin_text,
                "icon": block.meta.icon,
                "label": block.label,
                "description": block.get_description(),
                "blockDefId": block.definition_prefix,
                "isPreviewable": block.is_previewable,
                "attrs": block.meta.form_attrs or {},
            },
        ]

    @cached_property
    def media(self):
        return forms.Media(
            js=[
                versioned_static("wagtailadmin/js/telepath/blocks.js"),
            ]
        )


register(StaticBlockAdapter(), StaticBlock)
