import logging

from django.forms.utils import ErrorList
from wagtail import blocks
from wagtail.blocks import (
    CharBlock,
    ListBlock,
    StructBlock,
    TextBlock,
)
from wagtail.blocks.struct_block import StructBlockValidationError
from wagtail.contrib.table_block.blocks import TableBlock
from wagtail.images.blocks import ImageChooserBlock

from maps_utils.blocks import MapFeatureCollectionBlock, MapPointBlock
from shared.const import (
    RICH_TEXT_DEFAULT_FEATURES,
)

from ..children import (
    FlipCardBlock,
    LinkBlock,
    PersonBoxBlock,
)
from .images import FigureBlock
from .video import YouTubeVideoBlock

logger = logging.getLogger(__name__)


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"


class NewsBlock(StructBlock):
    title = CharBlock(
        label="Titulek",
        help_text="Nejnovější články se načtou automaticky",
    )
    description = TextBlock(label="Popis", required=False)

    class Meta:
        icon = "doc-full-inverse"
        label = "Novinky"


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

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


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

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


class FlipCardsBlock(StructBlock):
    cards = ListBlock(
        FlipCardBlock(label="Karta"),
        label="Karty",
    )

    class Meta:
        icon = "group"
        label = "Seznam obracecích karet"
        template = "styleguide2/includes/organisms/cards/flip_card_list.html"


class PeopleOverviewBlock(StructBlock):
    title_line_1 = CharBlock(label="První řádek titulku")
    title_line_2 = CharBlock(label="Druhý řádek titulku")

    description = TextBlock(label="Popis")

    list = ListBlock(PersonBoxBlock, label="Boxíky")

    class Meta:
        template = (
            "styleguide2/includes/organisms/main_section/representatives_section.html"
        )
        icon = "group"
        label = "Skupina osob"


class CardBlock(blocks.StructBlock):
    img = ImageChooserBlock(label="Obrázek", required=False)

    headline = blocks.TextBlock(label="Titulek", required=False)

    content = blocks.StreamBlock(
        label="Obsah",
        local_blocks=[
            (
                "text",
                blocks.RichTextBlock(
                    label="Textový editor", features=RICH_TEXT_DEFAULT_FEATURES
                ),
            ),
            (
                "table",
                TableBlock(
                    template="styleguide2/includes/atoms/table/table.html",
                    label="Tabulka",
                ),
            ),
            ("figure", FigureBlock()),
            ("youtube", YouTubeVideoBlock()),
            ("map_point", MapPointBlock(label="Špendlík na mapě")),
            ("map_collection", MapFeatureCollectionBlock(label="Mapová kolekce")),
        ],
        required=False,
    )

    page = blocks.PageChooserBlock(label="Stránka", required=False)

    link = blocks.URLBlock(label="Odkaz", required=False)

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

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

        if value["page"] and value["link"]:
            errors["page"] = ErrorList(
                ["Stránka nemůže být vybrána současně s odkazem."]
            )
            errors["link"] = ErrorList(
                ["Odkaz nemůže být vybrán současně se stránkou."]
            )

        if errors:
            raise StructBlockValidationError(errors)

        return super().clean(value)


class NewsletterSubscriptionBlock(blocks.StructBlock):
    list_id = blocks.CharBlock(label="ID newsletteru", required=True)

    title_line_1 = blocks.CharBlock(
        label="Nadpis bloku (1. řádek)", required=True, default="Odebírej náš"
    )

    title_line_2 = blocks.CharBlock(
        label="Nadpis bloku (2. řádek)", required=True, default="newsletter"
    )

    description = blocks.CharBlock(
        label="Popis newsletteru",
        required=True,
        default="Fake news tam nenajdeš, ale dozvíš se, co chystáme doopravdy!",
    )

    class Meta:
        label = "Formulář pro odebírání newsletteru"
        icon = "form"
        template = "styleguide2/includes/organisms/main_section/newsletter_section.html"