from django.forms.utils import ErrorList
from wagtail import blocks
from wagtail.blocks import (
    BooleanBlock,
    CharBlock,
    IntegerBlock,
    ListBlock,
    PageChooserBlock,
    RichTextBlock,
    StructBlock,
    TextBlock,
    URLBlock,
)
from wagtail.blocks.struct_block import StructBlockValidationError
from wagtail.images.blocks import ImageChooserBlock

from shared.blocks import (
    CardLinkBlockMixin,
    CardLinkWithHeadlineBlockMixin,
    ProgramItemBlock,
)


class AddressBlock(StructBlock):
    title = CharBlock(label="Titulek", required=True)
    map_image = ImageChooserBlock(label="Obrázek mapy", required=False)
    map_link = URLBlock(label="Odkaz na detail mapy", required=False)
    address = TextBlock(label="Adresa", required=True)
    address_info = TextBlock(label="Info k adrese", required=False)

    class Meta:
        template = "district/blocks/address_block.html"
        icon = "home"
        label = "Adresa"


class SimplePersonBlock(StructBlock):
    title = blocks.CharBlock(label="Jméno a příjmení", max_length=128, required=True)
    job = blocks.CharBlock(
        label="Povolání", max_length=128, required=False, help_text="Např. 'Informatik'"
    )
    profile_photo = ImageChooserBlock(label="Profilová fotka", required=False)
    email = blocks.EmailBlock(label="Email", required=False)
    city = blocks.CharBlock(label="Město/obec", max_length=64, required=False)
    age = blocks.IntegerBlock(label="Věk", required=False)
    is_pirate = blocks.BooleanBlock(
        label="Je členem Pirátské strany?", default=True, required=False
    )
    other_party = blocks.CharBlock(label="Strana", max_length=64, required=False)
    other_party_logo = ImageChooserBlock(
        label="Logo strany", required=False, help_text="Vyplňte pokud osoba není Pirát"
    )

    # socials
    facebook_url = blocks.URLBlock(label="Odkaz na Facebook", required=False)
    instagram_url = blocks.URLBlock(label="Odkaz na Instagram", required=False)
    twitter_url = blocks.URLBlock(label="Odkaz na Twitter", required=False)
    youtube_url = blocks.URLBlock(label="Odkaz na Youtube kanál", required=False)
    flickr_url = blocks.URLBlock(label="Odkaz na Flickr", required=False)

    class Meta:
        icon = "user"
        label = "Osoba blok"


class CandidateListBlock(StructBlock):
    candidate_list = blocks.StreamBlock(
        label="Kandidáti",
        local_blocks=[
            (
                "person_page",
                PageChooserBlock(
                    label="Osoba", page_type=["district.DistrictPersonPage"]
                ),
            ),
            ("person_block", SimplePersonBlock()),
        ],
    )
    candidate_list_big_count = IntegerBlock(
        label="Počet kanditátů s velkým náhledem", default=7
    )
    candidate_list_shown_count = IntegerBlock(
        label="Počet zobrazených kandidátů při načtení stránky (včetně velkých náhledů)",
        default=16,
    )

    cta_text = CharBlock(label="Text 'call-to-action' baneru", required=False)
    cta_link = URLBlock(label="Odkaz 'call-to-action' baneru", required=False)
    cta_button_text = CharBlock(
        label="Text tlačítka 'call-to-action' baneru", max_length=24, required=False
    )

    class Meta:
        template = "district/blocks/candidate_list_block.html"
        icon = "list-ol"
        label = "List kanditátů"


class CardLinkBlock(CardLinkBlockMixin):
    page = PageChooserBlock(
        label="Stránka",
        page_type=[
            "district.DistrictArticlePage",
            "district.DistrictArticlesPage",
            "district.DistrictCenterPage",
            "district.DistrictContactPage",
            "district.DistrictCrossroadPage",
            "district.DistrictCustomPage",
            "district.DistrictElectionCampaignPage",
            "district.DistrictElectionProgramPage",
            "district.DistrictElectionRootPage",
            "district.DistrictPeoplePage",
            "district.DistrictPersonPage",
            "district.DistrictPostElectionStrategyPage",
            "district.DistrictProgramPage",
        ],
        required=False,
    )

    class Meta:
        template = "district/blocks/card_link_block.html"
        icon = "link"
        label = "Karta s odkazem"


class CardLinkWithHeadlineBlock(CardLinkWithHeadlineBlockMixin):
    card_items = ListBlock(CardLinkBlock(), label="Karty s odkazy")

    class Meta:
        template = "district/blocks/card_link_with_headline_block.html"
        icon = "link"
        label = "Karty odkazů s nadpisem"


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

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


class CenterContactBlock(StructBlock):
    title = CharBlock(label="Titulek", required=True)
    contact_list = ListBlock(PersonCustomPositionBlock())

    class Meta:
        template = "district/blocks/contact_block.html"
        icon = "mail"
        label = "Kontakt"


class HomepageHeaderBlock(StructBlock):
    title = CharBlock(label="Titulek", required=False, help_text="Nap")
    image = ImageChooserBlock()
    button_text = CharBlock(label="Text tlačítka", required=False)
    button_link = URLBlock(label="Odkaz tlačítka", required=False)

    class Meta:
        template = "district/blocks/homepage_header_block.html"
        icon = "placeholder"
        label = "Nadpis s obrázkem a tlačítky"


class HomepageSimpleHeaderBlock(StructBlock):
    title = CharBlock(label="Titulek", required=False)
    subtitle = CharBlock(label="Podtitulek", required=False)
    image = ImageChooserBlock()

    class Meta:
        template = "district/blocks/homepage_simple_header_block.html"
        icon = "image"
        label = "Nadpis s obrázkem v pozadí"


class PersonBadgeBlock(StructBlock):
    person = PageChooserBlock(
        label="Osoba", page_type=("district.DistrictPersonPage",), required=True
    )
    wrap_in_card = BooleanBlock(label="Zabalit do karty", default=False, required=False)
    caption = CharBlock(
        label="Popisek",
        required=False,
        help_text="Vlastní popisek na vizitce. Pokud není uvedeno, použije se výchozí profese osoby.",
    )

    class Meta:
        template = "district/blocks/person_badge_block.html"
        icon = "user"
        label = "Vizitka"


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

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


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 InteractiveProgramItemBlock(StructBlock):
    content = RichTextBlock(label="Obsah", required=True)


class InteractiveProgramBlock(StructBlock):
    name = CharBlock(label="Název části programu", required=True)

    heading = CharBlock(label="Nadpis", required=True)
    description = RichTextBlock(
        label="Krátký popis, BEZ BODŮ", required=False, blank=True
    )

    icon = blocks.ChoiceBlock(
        label="Ikona",
        required=True,
        choices=[
            ("verejne-sluzby", "Veřejné služby"),
            ("zdravotni-pece", "Zdravotní péče"),
            ("sport", "Sport"),
            ("sport-plavec", "Sport - plavec"),
            ("socialni-politika", "Sociální politika"),
            ("aktivni-verejnost", "Aktivní veřejnost"),
            ("priroda", "Příroda"),
            ("vzdelavani", "Vzdělávání"),
            ("kultura", "Kultura"),
            ("otevrena-radnice", "Otevřená radnice"),
            ("cestovni-ruch", "Cestovní ruch"),
            ("doprava", "Doprava"),
            ("bydleni", "Bydlení"),
        ],
    )

    program_items = ListBlock(
        InteractiveProgramItemBlock(), label="Seznam bodů", required=True
    )

    class Meta:
        template = "district/blocks/interactive_program_block.html"
        icon = "list-ul"
        label = "Část programu"


class StaticProgramBlock(StructBlock):
    headline = CharBlock(label="Titulek bloku", required=True)
    perex = TextBlock(label="Krátký text pod nadpisem", required=True)
    person = PersonCustomPositionBlock()
    completion_percentage = IntegerBlock(label="Procento dokončení", required=True)
    program_items = ListBlock(ProgramItemBlock(), label="Seznam bodů")

    class Meta:
        template = "district/blocks/program_block.html"
        icon = "list-ul"
        label = "Blok programu"


class RedmineProgramBlock(StructBlock):
    headline = CharBlock(label="Titulek bloku", required=True)
    perex = TextBlock(label="Krátký text pod nadpisem", required=True)
    person = PersonCustomPositionBlock()
    redmine_issue = IntegerBlock(label="Číslo Redmine issue", required=True)
    completion_percentage = IntegerBlock(
        label="Procento dokončení - bude doplněno automaticky",
        required=False,
        help_text="Hodnota se automaticky načte s Redmine",
    )
    program_items = ListBlock(
        ProgramItemBlock(),
        label="Seznam bodů - bude doplněno automaticky",
        help_text="Hodnota se automaticky načte s Redmine",
        required=False,
    )

    class Meta:
        template = "district/blocks/program_block.html"
        icon = "site"
        label = "Blok programu stahovaný z Redmine"


class HeroBannerBlock(StructBlock):
    sm_banner = ImageChooserBlock(
        label="Obrázek pro zobrazení menší než 640px", required=True
    )
    md_banner = ImageChooserBlock(
        label="Obrázek pro zobrazení větší než 768px", required=True
    )
    lg_banner = ImageChooserBlock(
        label="Obrázek pro zobrazení větší než 1024px", required=True
    )
    xl_banner = ImageChooserBlock(
        label="Obrázek pro zobrazení větší než 1280px", required=True
    )
    xxl_banner = ImageChooserBlock(
        label="Obrázek pro zobrazení větší než 1536px", required=True
    )

    title = CharBlock(label="Titulek bloku", required=False)
    subtitle = CharBlock(label="Podtitulek", required=False)
    button_text = CharBlock(label="Text tlačítka", required=False)
    button_link = URLBlock(label="Odkaz tlačítka", required=False)

    def clean(self, value):
        errors = {}

        if value["button_link"] and not value["button_text"]:
            errors["button_text"] = ErrorList(
                ["Zadejte prosím text tlačítka, nebo smažte odkaz v tlačítku"]
            )

        if not value["button_link"] and value["button_text"]:
            errors["button_link"] = ErrorList(
                ["Zadejte prosím odkaz tlačítka, nebo smažte text v tlačítku"]
            )

        if errors:
            raise StructBlockValidationError(errors)

        return super().clean(value)

    class Meta:
        template = "district/blocks/hero_banner_block.html"
        icon = "image"
        label = "Hero banner"


class ArticlesBlock(StructBlock):
    articles = ListBlock(
        PageChooserBlock(
            "district.DistrictArticlePage", required=True, label="Aktualita"
        ),
        label="Seznam aktualit",
        required=True,
    )

    class Meta:
        template = "district/blocks/articles_block.html"
        icon = "list-ul"
        label = "Blok aktualit"


class ArticleLinksBlock(StructBlock):
    articles = ListBlock(
        PageChooserBlock(
            "district.DistrictArticlePage", required=True, label="Aktualita"
        ),
        label="Seznam aktualit",
        required=True,
    )

    class Meta:
        template = "district/blocks/article_links_block.html"
        icon = "list-ul"
        label = "Seznam nadpisů článků"