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

from shared.blocks import (
    BoxBlock,
    CardLinkBlockMixin,
    CardLinkWithHeadlineBlockMixin,
    PersonContactBlockMixin,
    ProgramGroupBlockMixin,
)
from shared.blocks import ProgramGroupBlockPopout as SharedProgramGroupBlockPopout


class CardLinkBlock(CardLinkBlockMixin):
    page = PageChooserBlock(
        label="Stránka",
        page_type=[
            "main.MainArticlesPage",
            "main.MainArticlePage",
            "main.MainProgramPage",
            "main.MainPeoplePage",
            "main.MainPersonPage",
            "main.MainSimplePage",
            "main.MainContactPage",
            "main.MainCrossroadPage",
        ],
        required=False,
    )

    class Meta:
        template = "styleguide2/includes/molecules/boxes/card_box_block.html"
        icon = "link"
        label = "Karta s odkazem"


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(StructBlock):
    desktop_line_1 = TextBlock(label="Desktop první řádek")
    desktop_line_2 = TextBlock(label="Desktop druhý řádek")

    mobile_line_1 = TextBlock(label="První mobilní řádek")
    mobile_line_2 = TextBlock(label="Druhý mobilní řádek")
    mobile_line_3 = TextBlock(label="Třetí mobilní řádek")

    desktop_image = ImageChooserBlock(
        label="Obrázek nahrazující animaci (desktop)", required=False
    )
    mobile_image = ImageChooserBlock(
        label="Obrázek nahrazující animaci (mobil / tablet)", required=False
    )

    button_url = URLBlock(
        label="Odkaz tlačítka",
        help_text="Bez odkazu tlačítko nebude viditelné.",
        required=False,
    )
    button_text = CharBlock(label="Text tlačítka", required=False)

    class Meta:
        template = "styleguide2/includes/molecules/menus/carousel.html"
        icon = "form"
        label = "Carousel"


class EuroparlNewsBlock(StructBlock):
    class Meta:
        template = (
            "styleguide2/includes/organisms/articles/europarl_articles_section.html"
        )
        icon = "doc-full-inverse"
        label = "Novinky z Eurovoleb"


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 ProgramGroupBlockCrossroad(ProgramGroupBlockMixin):
    point_list = ListBlock(CardLinkBlock(), label="Karty programu")

    class Meta:
        icon = "date"
        label = "Rozcestníkový program"


class RegionsBlock(StructBlock):
    title = CharBlock(
        label="Titulek",
        help_text="Články pro regiony se načtou automaticky",
    )

    class Meta:
        template = "styleguide2/includes/organisms/main_section/region_section.html"
        icon = "view"
        label = "Články pro regiony"


# ARTICLE BLOCKS
class ArticleImageMixin(StructBlock):
    image = ImageChooserBlock(label="Obrázek")
    image_source = CharBlock(
        label="Zdroj obrázku",
        help_text="Např. 'europoslankyně Markéta Gregorová'",
        required=False,
    )

    text = RichTextBlock(label="Text")


class ArticleLeftImageBlock(ArticleImageMixin):
    class Meta:
        icon = "image"
        label = "Text s obrázkem vlevo"
        template = "styleguide2/includes/molecules/articles/article_richtext_content_with_left_image.html"


class ArticleRightImageBlock(ArticleImageMixin):
    class Meta:
        icon = "image"
        label = "Text s obrázkem vpravo"
        template = "styleguide2/includes/molecules/articles/article_richtext_content_with_right_image.html"


class CardLinkWithHeadlineBlock(CardLinkWithHeadlineBlockMixin):
    card_items = ListBlock(
        CardLinkBlock(
            template="styleguide2/includes/molecules/boxes/card_box_block.html"
        ),
        label="Karty s odkazy",
    )

    class Meta:
        template = (
            "styleguide2/includes/molecules/boxes/card_box_with_headline_block.html"
        )
        icon = "link"
        label = "Karty odkazů s nadpisem"


class HoaxBlock(StructBlock):
    title = CharBlock(label="Titulek")
    hoax = RichTextBlock(label="Hoax")
    image = ImageChooserBlock(label="Obrázek")
    image_explanation = CharBlock(label="Popis obrázku", required=False)
    reality = RichTextBlock(label="Realita")

    class Meta:
        icon = "view"
        label = "Hoax"
        template = "main/blocks/hoax_block.html"


class TeamBlock(StructBlock):
    title = CharBlock(label="Název sekce týmů")
    slug = CharBlock(
        label="Slug sekce",
        required=False,
        help_text="Není třeba vyplňovat, bude automaticky vyplněno",
    )
    team_list = ListBlock(
        CardLinkWithHeadlineBlock(label="Karta týmu"),
        label="Týmy",
    )

    class Meta:
        icon = "group"
        label = "Týmy"

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


class ElectionsProgramBlock(StructBlock):
    title = CharBlock(
        label="Název programu",
        help_text="Např. 'Krajské volby 2024', 'Evropské volby 2024', ..."
    )

    program_page = PageChooserBlock(
        label="Stránka",
        page_type=[
            "elections.ElectionsFullProgramPage",
        ],
        required=False,
    )

    class Meta:
        icon = "view"
        label = "Program z volebního webu"
        template = "styleguide2/includes/molecules/program/program_block.html"


class ProgramGroupBlockPopout(SharedProgramGroupBlockPopout, ProgramGroupBlockMixin):
    pass


class PersonContactBlock(PersonContactBlockMixin):
    person = PageChooserBlock(
        label="Osoba",
        page_type=["main.MainPersonPage"],
    )


# --- TODO: Remove legacy blocks used in migrations only


class LinkBlock(StructBlock):
    pass