from crispy_forms.layout import HTML, Reset, Button
from crispy_forms.utils import flatatt
from django.utils.html import conditional_escape


class ButtonAElement(HTML):
    def __init__(self, text, href, css_class='', **kwargs):
        attrs = {
            'class': f'btn {css_class}',
        }
        attrs.update(dict([(k.replace('_', '-'), conditional_escape(v)) for k, v in kwargs.items()]))
        flat_attrs = flatatt(attrs)
        html = f'<a href="{href}" {flat_attrs}>{text}</a>'
        super().__init__(html)


class BaseInputAttrsFix:
    def __init__(self, *args, **kwargs):
        self._flat_attrs = ''
        super().__init__(*args, **kwargs)

    @property
    def flat_attrs(self):
        return '{} {}'.format(flatatt(self.attrs), self._flat_attrs)

    @flat_attrs.setter
    def flat_attrs(self, value):
        self._flat_attrs = value


class ButtonElement(BaseInputAttrsFix, Button):
    pass


class ButtonSubmit(BaseInputAttrsFix, Button):
    input_type = 'submit'


class ButtonReset(BaseInputAttrsFix, Reset):
    pass
