from django.template.loader import render_to_string
from wagtail.blocks import (
    CharBlock,
    ChoiceBlock,
    ListBlock,
    PageChooserBlock,
    StructBlock,
    URLBlock,
)
from wagtail.contrib.table_block.blocks import TableBlock as ContribTableBlock


class AlignedTableBlock(StructBlock):
    alignment = ChoiceBlock(
        choices=[
            ("left", "Vlevo"),
            ("center", "Vprostřed"),
            ("right", "Vpravo"),
            ("full", "Celá šířka obrazovky"),
        ],
        default="left",
        label="Zarovnání",
    )

    table = ContribTableBlock(label="Tabulka")

    def render(self, value, context=None):
        template = getattr(self.meta, "template", None)

        if template and value:
            value = dict(value)

            table_header = (
                value["table"]["data"][0]
                if value["table"].get("data", None)
                and len(value["table"]["data"]) > 0
                and value["table"].get("first_row_is_table_header", False)
                else None
            )

            new_context = dict(context)

            new_context.update(
                {
                    "table_header": table_header,
                    "table": value["table"],
                    "alignment": value["alignment"],
                }
            )

            if value["table"].get("first_row_is_table_header", False):
                new_context["table"]["data"] = new_context["table"]["data"][1:]

            return render_to_string(template, new_context)
        else:
            return self.render_basic(value or "", context=context)

    class Meta:
        icon = "table"
        label = "Tabulka s upravitelným zarovnáním"


class PersonUrlBlock(StructBlock):
    title = CharBlock(label="Název", required=True)
    url = URLBlock(label="URL", required=True)
    custom_icon = CharBlock(
        label="Vlastní ikonka ze styleguide",
        required=False,
        help_text="Pro vlastní ikonku zadejde název ikonky z https://styleguide.pirati.cz/latest/?p=viewall-atoms-icons (bez tečky), např. 'ico--beer'",
    )


class PersonContactBlock(StructBlock):
    position = CharBlock(label="Název pozice", required=False)
    person = PageChooserBlock(
        label="Osoba",
        page_type=["uniweb.UniwebPersonPage"],
    )

    class Meta:
        icon = "user"
        label = "Osoba s volitelnou pozicí"


class PeopleGroupListBlock(StructBlock):
    group_title = CharBlock(label="Titulek", required=True)
    person_list = ListBlock(
        PersonContactBlock(),
        label="List osob",
    )

    class Meta:
        template = "uniweb/blocks/people_group_block.html"
        icon = "list-ul"
        label = "Skupina členů"