from django.db import models
from django.utils.translation import ugettext_lazy as _

from wagtail.wagtailadmin.edit_handlers import (
    FieldPanel, FieldRowPanel, MultiFieldPanel, StreamFieldPanel
)
from wagtail.wagtailcore import blocks
from wagtail.wagtailcore.fields import StreamField
from wagtail.wagtailcore.models import Page
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
from wagtail.wagtailsnippets.blocks import SnippetChooserBlock
from wagtail.wagtailsnippets.models import register_snippet

from kfet.cms.context_processors import get_articles


@register_snippet
class MemberTeam(models.Model):
    first_name = models.CharField(
        verbose_name=_('Prénom'),
        blank=True, default='', max_length=255,
    )
    last_name = models.CharField(
        verbose_name=_('Nom'),
        blank=True, default='', max_length=255,
    )
    nick_name = models.CharField(
        verbose_name=_('Alias'),
        blank=True, default='', max_length=255,
    )
    photo = models.ForeignKey(
        'wagtailimages.Image',
        verbose_name=_('Photo'),
        on_delete=models.SET_NULL,
        null=True, blank=True,
        related_name='+',
    )

    class Meta:
        verbose_name = _('K-Fêt-eux-se')

    panels = [
        FieldPanel('first_name'),
        FieldPanel('last_name'),
        FieldPanel('nick_name'),
        ImageChooserPanel('photo'),
    ]

    def __str__(self):
        return self.get_full_name()

    def get_full_name(self):
        return '{} {}'.format(self.first_name, self.last_name).strip()


class MenuBlock(blocks.StaticBlock):
    class Meta:
        icon = 'list-ul'
        label = _('Carte')
        template = 'kfetcms/block_menu.html'

    def get_context(self, *args, **kwargs):
        context = super().get_context(*args, **kwargs)
        context.update(get_articles())
        return context


class GroupTeamBlock(blocks.StructBlock):
    show_only = blocks.IntegerBlock(
        label=_('Montrer seulement'),
        required=False,
        help_text=_(
            'Nombre initial de membres affichés. Laisser vide pour tou-te-s '
            'les afficher.'
        ),
    )
    members = blocks.ListBlock(
        SnippetChooserBlock(MemberTeam),
        label=_('K-Fêt-eux-ses'),
        classname='team-group',
    )

    class Meta:
        icon = 'group'
        label = _('Groupe de K-Fêt-eux-ses')
        template = 'kfetcms/block_teamgroup.html'


class ChoicesStreamBlock(blocks.StreamBlock):
    rich = blocks.RichTextBlock(label=_('Éditeur'))
    carte = MenuBlock()
    group_team = GroupTeamBlock()


class KFetStreamBlock(ChoicesStreamBlock):
    group = ChoicesStreamBlock(label=_('Contenu groupé'))


class KFetPage(Page):

    content = StreamField(KFetStreamBlock, verbose_name=_('Contenu'))

    # Layout fields

    TEMPLATE_COL_1 = 'kfet/base_col_1.html'
    TEMPLATE_COL_2 = 'kfet/base_col_2.html'
    TEMPLATE_COL_MULT = 'kfet/base_col_mult.html'

    no_header = models.BooleanField(
        verbose_name=_('Sans en-tête'),
        default=False,
        help_text=_(
            "Coché, l'en-tête (avec le titre) de la page n'est pas affiché."
        ),
    )
    layout = models.CharField(
        verbose_name=_('Template'),
        choices=[
            (TEMPLATE_COL_1, _('Une colonne : centrée sur la page')),
            (TEMPLATE_COL_2, _('Deux colonnes : fixe à gauche, contenu à droite')),
            (TEMPLATE_COL_MULT, _('Contenu scindé sur plusieurs colonnes')),
        ],
        default=TEMPLATE_COL_MULT, max_length=255,
        help_text=_(
            "Comment cette page devrait être affichée ?"
        ),
    )
    main_size = models.CharField(
        verbose_name=_('Taille de la colonne de contenu'),
        blank=True, max_length=255,
    )
    col_count = models.CharField(
        verbose_name=_('Nombre de colonnes'),
        blank=True, max_length=255,
        help_text=_(
            "S'applique au page dont le contenu est scindé sur plusieurs colonnes."
        ),
    )

    # Panels

    content_panels = Page.content_panels + [
        StreamFieldPanel('content'),
    ]

    layout_panel = [
        FieldPanel('no_header'),
        FieldPanel('layout'),
        FieldRowPanel([
            FieldPanel('main_size'),
            FieldPanel('col_count'),
        ]),
    ]

    settings_panels = [
        MultiFieldPanel(layout_panel, _('Affichage'))
    ] + Page.settings_panels

    # Base template
    template = "kfetcms/base.html"

    class Meta:
        verbose_name = _('page K-Fêt')
        verbose_name_plural = _('pages K-Fêt')

    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)

        page = context['page']

        if not page.seo_title:
            page.seo_title = page.title

        return context