from django.db import models
from django.utils import timezone
from wagtail.admin.panels import FieldPanel
from wagtail.fields import RichTextField, StreamField
from wagtail.models import Page

from .blocks import DocumentBlock, EventBlock, PersonBlock


class HomePage(Page):
    heading_text = RichTextField(verbose_name="Hlavní text stránky")

    # --- Events ---

    events = StreamField(
        [("event", EventBlock())],
        verbose_name="Události",
        use_json_field=True,
        blank=True,
        null=True,
    )

    # --- Documents ---

    documents = StreamField(
        [("document", DocumentBlock())],
        verbose_name="Dokumenty",
        use_json_field=True,
        blank=True,
        null=True,
    )

    # --- Donations ---

    donation_text = RichTextField(verbose_name="Text pro dary")

    # --- Contact info ---

    address = models.CharField(verbose_name="Sídlo")
    branch = models.CharField(verbose_name="Pobočka")
    email = models.EmailField(verbose_name="Email")
    ds_id = models.CharField(verbose_name="Datová schránka")

    # --- People ---

    director = StreamField(
        [("person", PersonBlock())],
        verbose_name="Ředitel",
        use_json_field=True,
        blank=True,
        null=True,
    )

    controller = StreamField(
        [("person", PersonBlock())],
        verbose_name="Kontrolor",
        use_json_field=True,
        blank=True,
        null=True,
    )

    council_members = StreamField(
        [("person", PersonBlock())],
        verbose_name="Správní rada",
        use_json_field=True,
        blank=True,
        null=True,
    )

    volunteers = StreamField(
        [("person", PersonBlock())],
        verbose_name="Dobrovolníci",
        use_json_field=True,
        blank=True,
        null=True,
    )

    employees = StreamField(
        [("person", PersonBlock())],
        verbose_name="Zaměstnanci",
        use_json_field=True,
        blank=True,
        null=True,
    )

    subpage_types = [
        "home.HomeArticlesPage"
    ]

    content_panels = Page.content_panels + [
        FieldPanel("heading_text", icon="pilcrow"),
        FieldPanel("events", icon="calendar-alt"),
        FieldPanel("documents", icon="doc-full-inverse"),
        FieldPanel("donation_text", icon="pilcrow"),
        FieldPanel("address", icon="home"),
        FieldPanel("branch", icon="home"),
        FieldPanel("email", icon="pilcrow"),
        FieldPanel("ds_id", icon="mail"),
        FieldPanel("director", icon="user"),
        FieldPanel("controller", icon="user"),
        FieldPanel("council_members", icon="group"),
        FieldPanel("volunteers", icon="group"),
        FieldPanel("employees", icon="group"),
    ]

    @property
    def articles_page(self) -> "HomeArticlesPage":
        return (
            HomeArticlesPage
            .objects
            .live()
            .first()
        )

    @property
    def latest_articles(self):
        return (
            HomeArticlePage
            .objects
            .live()
            .all()
            [:3]
        )


class HomeArticlesPage(Page):
    content = RichTextField(verbose_name="Obsah", blank=True, null=True)

    parent_page_type = [
        "home.HomePage"
    ]
    subpage_types = [
        "home.HomeArticlePage"
    ]

    content_panels = Page.content_panels + [
        FieldPanel("content", icon="pilcrow"),
    ]

    @property
    def articles(self):
        return (
            HomeArticlePage
            .objects
            .live()
            .all()
        )


class HomeArticlePage(Page):
    tags = models.ManyToManyField(
        "Tag",
        verbose_name="Štítky"
    )

    author = models.CharField(verbose_name="Autor")

    date = models.DateField(
        verbose_name="Datum vytvoření",
        default=timezone.now
    )

    perex = models.TextField(verbose_name="Perex")
    content = RichTextField(verbose_name="Obsah")

    parent_page_type = [
        "home.HomeArticlesPage"
    ]

    content_panels = Page.content_panels + [
        FieldPanel("author", icon="user"),
        FieldPanel("date", icon="calendar"),
        FieldPanel("perex", icon="pilcrow"),
        FieldPanel("content", icon="pilcrow"),
    ]

    @property
    def shortened_perex(self) -> str:
        if len(self.perex) > 310:
            return self.perex[:300] + "..."

        return self.perex

    class Meta:
        ordering = ["-date"]


class Tag(models.Model):
    name = models.CharField(verbose_name="Jméno")

    class Meta:
        verbose_name = "Štítek"
        verbose_name_plural = "Štítky"