from textwrap import dedent

from django import forms
from django.conf import settings
from django.template import Context, Template
from lxml import html


class CompressorWidgetMixin(object):
    __template_css = dedent(
        """\
        {% compress css %}
            {{ media.css }}
        {% endcompress %}
    """
    )

    __template_js = dedent(
        """\
        {% compress js %}
            {{ media.js }}
        {% endcompress %}
    """
    )

    __templates = {
        (False, False): Template(""),
        (True, False): Template("{% load compress %}" + __template_css),
        (False, True): Template("{% load compress %}" + __template_js),
        (True, True): Template("{% load compress %}" + __template_js + __template_css),
    }

    compress_css = False
    compress_js = False

    try:
        import compressor
    except ImportError:
        pass
    else:
        if getattr(settings, "COMPRESS_ENABLED", not settings.DEBUG):

            @property
            def media(self):
                media = super().media
                template = self.__templates[self.compress_css, self.compress_js]
                result = html.fromstring(template.render(Context({"media": media})))

                return forms.Media(
                    css={"all": [result.find(".//link").get("href")]}
                    if self.compress_css
                    else media._css,
                    js=[result.find(".//script").get("src")]
                    if self.compress_js
                    else media._js,
                )
