# -*- coding: utf-8 -*-
# Create your views here.
from django.shortcuts import render
from django.template import RequestContext
from colloquium.models import Talk
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from djphys.menus import Make_Submenu
from django.views.decorators.clickjacking import xframe_options_sameorigin
from django.db.models import Q
from functools import reduce
from djphys.redirect import Redirect


@xframe_options_sameorigin
def talk_list(request, talk_list=None):
    r = Redirect(request, "research/colloquium/")
    if r:
        return r()
    if talk_list is None:
        talk_list = Talk.objects.exclude(title='TBA').order_by('-date')
    if 'speaker' in request.GET:
        talk_list = talk_list.filter(
            speaker__icontains=request.GET.get('speaker'))
    term = request.GET.get('term')
    if term:
        talk_list = talk_list.filter(abstract__icontains=term)
    paginator = Paginator(talk_list, 15)
    page_number = request.GET.get('page')
    try:
        talks = paginator.page(page_number)
        page_number = int(page_number)
    except PageNotAnInteger:
        page_number = 1
        talks = paginator.page(page_number)
    except EmptyPage:
        talks = paginator.page(paginator.num_pages)
        page_number = paginator.num_pages

    return render(request,
                  'colloquium/talk_list.html',
                  {'talks': talks,
                   'pnum': page_number,
                   'submenu': Make_Submenu(request, "research"), })


@xframe_options_sameorigin
def colloquia(request):
    """
    Attempt to identify colloquia responding to the term(s)
    in words
    """
    words = request.POST.get('term')
    try:
        word_list = words.split(' ')
        speaks = Talk.objects.filter(
            reduce(Q.__or__, [Q(speaker__icontains=x) for x in word_list]))
        titles = Talk.objects.filter(
            reduce(Q.__or__, [Q(title__icontains=x) for x in word_list]))
        abstracts = Talk.objects.filter(
            reduce(Q.__or__, [Q(abstract__icontains=x) for x in word_list]))
        all = speaks.union(titles, abstracts).order_by('-date')
        return talk_list(request, all if all.count() else None)
    except:
        return talk_list(request)


@xframe_options_sameorigin
def colloquium(request, pk: int):
    try:
        return render(request, 'colloquium/detail.html',
                      {'object': Talk.objects.get(id=pk)})
    except:
        return talk_list(request)


def dump(request):
    Talk.export()
    return colloquia(request)
