from django.utils.text import slugify
from wagtail.core.blocks import (
    CharBlock,
    ListBlock,
    PageChooserBlock,
    RichTextBlock,
    StructBlock,
    TextBlock,
    URLBlock,
)
from wagtail.documents.blocks import DocumentChooserBlock
from wagtail.images.blocks import ImageChooserBlock


class CTAMixin(StructBlock):
    button_link = URLBlock(label="Odkaz tlačítka")
    button_text = CharBlock(label="Text tlačítka")

    class Meta:
        icon = "doc-empty"
        label = "Výzva s odkazem"
        template = "main/blocks/article_quote_block.html"


class BoxBlock(CTAMixin, StructBlock):
    title = CharBlock(label="Nadpis")
    image = ImageChooserBlock(label="Logo/obrázek")

    class Meta:
        icon = "form"
        label = "Box"


class BoxesBlock(StructBlock):
    title = CharBlock(label="Nadpis")
    list = ListBlock(BoxBlock, label="Boxíky")
    image = ImageChooserBlock(label="Obrázek pozadí", required=False)

    class Meta:
        template = "main/blocks/boxes_block.html"
        icon = "grip"
        label = "Skupina boxů"


class HomePageCarouseSlideBlock(CTAMixin, StructBlock):
    image = ImageChooserBlock(label="Hlavní obrázek jednoho slidu carouselu")
    line_1 = TextBlock(label="První řádek")
    line_2 = TextBlock(label="Druhý řádek")

    class Meta:
        icon = "form"
        label = "Stránka carouselu"


class HomePageCarouselBlock(StructBlock):
    slides = ListBlock(HomePageCarouseSlideBlock, label="Obrázky s nadpisy - carouselu")

    class Meta:
        template = "main/blocks/homepage_carousel_block.html"
        icon = "folder-open-1"
        label = "Carousel s  obrázky"


class NewsBlock(StructBlock):
    title = CharBlock(
        label="Titulek",
        help_text="Nejnovější články se načtou automaticky",
    )
    image = ImageChooserBlock(label="Obrázek pozadí", required=False)

    class Meta:
        template = "main/blocks/news_block.html"
        icon = "doc-full-inverse"
        label = "Novinky"


class PeopleGroupBlock(StructBlock):
    title = CharBlock(label="Titulek")
    slug = CharBlock(
        label="Slug skupiny",
        required=False,
        help_text="Není třeba vyplňovat, bude automaticky vyplněno",
    )
    person_list = ListBlock(
        PageChooserBlock(page_type="main.MainPersonPage", label="Detail osoby"),
        label="Skupina osob",
    )

    class Meta:
        icon = "group"
        label = "Slug skupiny"

    def get_prep_value(self, value):
        value = super().get_prep_value(value)
        value["slug"] = slugify(value["title"])
        return value


class PeopleOverviewBlock(StructBlock):
    title = CharBlock(label="Hlavní titulek")
    list = ListBlock(BoxBlock, label="Boxíky")

    class Meta:
        template = "main/blocks/people_overview_block.html"
        icon = "group"
        label = "Skupina osob"


class ProgramBlock(StructBlock):
    icon = ImageChooserBlock(label="Ikona")
    title = CharBlock(label="Titulek článku programu")
    text = TextBlock(label="Obsah")

    class Meta:
        icon = "date"
        label = "Program"


class ProgramGroupBlock(StructBlock):
    title = CharBlock(label="Titulek části programu")
    slug = CharBlock(
        label="Slug části programu",
        required=False,
        help_text="Není třeba vyplňovat, bude automaticky vyplněno",
    )
    point_list = ListBlock(ProgramBlock(), label="Jednotlivé články programu")

    class Meta:
        icon = "date"
        label = "Skupina programů"

    def get_prep_value(self, value):
        value = super().get_prep_value(value)
        value["slug"] = slugify(value["title"])
        return value


class RegionsBlock(StructBlock):
    title = CharBlock(
        label="Titulek",
        help_text="Články pro regiony se načtou automaticky",
    )
    image = ImageChooserBlock(label="Obrázek pozadí", required=False)

    class Meta:
        template = "main/blocks/regions_block.html"
        icon = "view"
        label = "Články pro regiony"


class TweetsBlock(StructBlock):
    title = CharBlock(
        label="Titulek",
        help_text="Tweety budou načteny pro všechny profily uvedené v nastavení webu automaticky",
    )

    class Meta:
        template = "main/blocks/twitter_block.html"
        icon = "openquote"
        label = "Tweety"


class PersonContactBlock(StructBlock):
    position = CharBlock(label="Název pozice", required=False)
    # email, phone?
    person = PageChooserBlock(
        label="Osoba",
        page_type=["main.MainPersonPage"],
    )

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


class PersonContactBoxBlock(CTAMixin, StructBlock):
    title = CharBlock(label="Titulek")
    image = ImageChooserBlock(label="Ikona")
    subtitle = CharBlock(label="Podtitulek")

    class Meta:
        icon = "mail"
        label = "Kontakty"


# Footer
class LinkBlock(StructBlock):
    text = CharBlock(
        label="Titulek odkazu (text, který se zobrazí místo dlouhého odkazu)"
    )
    link = URLBlock(label="Odkaz")

    class Meta:
        icon = "link"
        label = "Odkaz"


class OtherLinksBlock(StructBlock):
    title = CharBlock(label="Titulek")
    list = ListBlock(LinkBlock, label="Seznam odkazů s titulkem")

    class Meta:
        icon = "link"
        label = "Ostatní odkazy"
        template = "main/blocks/article_quote_block.html"


class SocialLinkBlock(LinkBlock):
    icon = CharBlock(
        label="Ikona",
        help_text="Seznam ikon - https://styleguide.pirati.cz/latest/?p=viewall-atoms-icons <br/>"
        "Název ikony zadejte bez tečky na začátku",
    )  # TODO CSS class name or somthing better?

    class Meta:
        icon = "link"
        label = "Odkaz"


# ARTICLE BLOCKS
class ArticleQuoteBlock(StructBlock):
    quote = CharBlock(label="Citace")
    autor_name = CharBlock(label="Jméno autora")

    class Meta:
        icon = "user"
        label = "Blok citace"
        template = "main/blocks/article_quote_block.html"


class ArticleImageBlock(StructBlock):
    image = ImageChooserBlock(label="Obrázek")
    href = URLBlock(label="Odkaz k textu")
    text = CharBlock(label="Text")

    class Meta:
        icon = "image"
        label = "Obrázek s textem a odkazem"
        template = "main/blocks/article_image_block.html"


class ArticleDownloadBlock(StructBlock):
    file = DocumentChooserBlock(label="Stáhnutelný soubor")

    class Meta:
        icon = "user"
        label = "Blok stáhnutelného dokumentu"
        template = "main/blocks/article_download_block.html"


class TwoTextColumnBlock(StructBlock):
    text_column_1 = RichTextBlock(label="První sloupec textu")
    text_column_2 = RichTextBlock(label="Druhý sloupec textu")

    class Meta:
        icon = "text"
        label = "Text ve dvou sloupcích"


# TwitterCarouselBlock