import requests
from django.db import models
from modelcluster.contrib.taggit import ClusterTaggableManager
from modelcluster.fields import ParentalKey
from taggit.models import TaggedItemBase
from wagtail.admin.edit_handlers import FieldPanel, HelpPanel
from wagtail.core.models import Page
from wagtail.images.edit_handlers import ImageChooserPanel
from wagtailmetadata.models import MetadataPageMixin


class ArticleTag(TaggedItemBase):
    content_object = ParentalKey("shared.Article", on_delete=models.CASCADE)


class Article(MetadataPageMixin, Page):
    """ Univerzalni clanek pro vsechny weby """

    ### FIELDS

    perex = models.CharField("perex", max_length=250, blank=True)
    text = models.TextField("text článku", blank=True)
    image = models.ForeignKey(
        "wagtailimages.Image",
        on_delete=models.PROTECT,
        blank=True,
        null=True,
        verbose_name="obrázek",
    )
    author = models.TextField("autor článku", blank=True)
    tags = ClusterTaggableManager(through=ArticleTag, blank=True)

    ### PANELS

    content_panels = Page.content_panels + [
        FieldPanel("perex"),
        FieldPanel("text"),
        HelpPanel(
            """Text článku lze formátovat s použitím <a href="https://www.markdownguide.org/basic-syntax/">markdown</a>"""
        ),
        FieldPanel("author"),
        ImageChooserPanel("image"),
        FieldPanel("tags"),
    ]

    class Meta:
        verbose_name = "Článek"


class PersonPage(MetadataPageMixin, Page):
    """ Stranka Pirata.
        Snaha je zadavat tady minimum informaci o osobe a zbytek vytahovat via API z jinych zdroju,
        neb nechceme dalsi databazi lidi.
    """

    # ve formatu iapi: https://iapi.pirati.cz/v1/user?username=john.doe
    pirate_id = models.TextField("Pirate ID osoby", blank=False)

    perex = models.TextField("Perex osoby", blank=True)

    content_panels = Page.content_panels + [
        FieldPanel("pirate_id"),
        FieldPanel("perex"),
    ]

    def _iapi(self):
        """ Vrati data o osobe z piratskeho IAPI jako json
            TODO: neni cacheovano
        """
        return requests.get(
            "https://iapi.pirati.cz/v1/user?username=%s" % self.pirate_id
        ).json()

    def _graph(self):
        """ Vrati data o osobe z graph.pirati.cz (forum) jako json
            TODO: neni cacheovano
        """
        return requests.get("https://graph.pirati.cz/user/%s" % self.pirate_id).json()

    @property
    def name(self):
        return self._iapi().get("displayname")

    @property
    def email(self):
        return self._graph().get("email")

    @property
    def phone(self):
        return None  # TODO

    @property
    def longtext(self):  # medailonek
        return "Lorem ipsum dolor amet"  # TODO

    @property
    def portrait(self):  # profilova fotka
        return "https://lide.pirati.cz/media/person/61/profile/1312/2.jpg"  # TODO

    @property
    def facebook(self):
        return "https://www.facebook.com/ales.fuksa.9"  # TODO

    class Meta:
        verbose_name = "Člověk"  # to zni hrde

    def get_context(self, request):
        context = super().get_context(request)
        # Na strance detailu cloveka se vpravo zobrazuji 3 dalsi nahodne profily
        # TODO udelat nahodny vyber
        context["random_people"] = (
            self.get_siblings(inclusive=False).type(PersonPage).live().specific()[:2]
        )
        return context


class PeoplePage(MetadataPageMixin, Page):
    """ Stranka se zobrazenim lidi v dane organizaci
        TOOD: subpagemixin
    """

    settings_panels = []

    subpage_types = [
        "shared.PersonPage",
    ]

    class Meta:
        verbose_name = "Stránka Lidé"

    def get_context(self, request):
        context = super().get_context(request)
        context["people"] = self.get_children().live().specific()
        return context