# -*- coding: utf-8 -*-

from itertools import chain
from django.forms import CheckboxSelectMultiple, CheckboxInput
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe


class CheckboxesAsCells(CheckboxSelectMultiple):

    def render(self, name, value, attrs=None, choices=()):
        if value is None: value = []
        has_id = attrs and 'id' in attrs
        final_attrs = self.build_attrs(attrs, name=name)
        output = [u'']
        # Normalize to strings
        str_values = set([force_unicode(v) for v in value])
        for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
            # If an ID attribute was given, add a numeric index as a suffix,
            # so that the checkboxes don't all have the same ID attribute.
            if has_id:
                final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))

            cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
            option_value = force_unicode(option_value)
            rendered_cb = cb.render(name, option_value)
            output.append(u'<td>%s</td>' % rendered_cb)
        output.append(u'')
        return mark_safe(u'\n'.join(output))

