from django import forms
from django.core.exceptions import FieldError
from django.template.loader import get_template
from django.utils.safestring import mark_safe


class CheckboxSelectMultipleWithSelectAll(forms.CheckboxSelectMultiple):
    def render(self, name, value, attrs=None, renderer=None):
        if "id" not in attrs:
            raise FieldError("id required")

        select_all_id = attrs["id"] + "_all"
        select_all_name = name + "_all"
        original = super(CheckboxSelectMultipleWithSelectAll, self).render(
            name, value, attrs, renderer
        )
        template = get_template("widgets/select_all.html")
        return mark_safe(
            template.render(
                {
                    "original_widget": original,
                    "select_all_id": select_all_id,
                    "select_all_name": select_all_name,
                    "all_selected": all(choice[0] in value for choice in self.choices)
                    if value
                    else False,
                    "empty": not self.choices,
                }
            )
        )