from django.views.generic import ListView
from django.views.generic.detail import DetailView
from django.views.generic.dates import YearArchiveView, MonthArchiveView
from django.contrib.syndication.views import Feed
from django.shortcuts import get_object_or_404
from django.conf import settings

from utils.views import PaginatedListView

from .models import Entry, HomepageCurrator
from locations.models import CheckIn, Country, Region
from sightings.models import Sighting


class EntryList(PaginatedListView):
    """
    Return a list of Entries in reverse chronological order
    """
    queryset = Entry.objects.filter(status__exact=1).order_by('-pub_date').select_related()
    template_name = "archives/jrnl.html"


class EntryCountryList(PaginatedListView):
    """
    Return a list of Entries by Country in reverse chronological order
    """
    template_name = "archives/writing.html"

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(EntryCountryList, self).get_context_data(**kwargs)
        try:
            context['region'] = Country.objects.get(slug__exact=self.kwargs['slug'])
        except:
            context['region'] = Region.objects.get(slug__exact=self.kwargs['slug'])
        return context

    def get_queryset(self):
        try:
            region = Country.objects.get(slug__exact=self.kwargs['slug'])
            qs = Entry.objects.filter(
                status__exact=1,
                location__state__country=region
            ).order_by('-pub_date')
        except:
            region = Region.objects.get(slug__exact=self.kwargs['slug'])
            qs = Entry.objects.filter(
                status__exact=1,
                location__state__country__lux_region=region.id
            ).order_by('-pub_date')
        return qs


class EntryYearArchiveView(YearArchiveView):
    queryset = Entry.objects.filter(status__exact=1).select_related()
    date_field = "pub_date"
    make_object_list = True
    allow_future = True
    template_name = "archives/writing_date.html"


class EntryMonthArchiveView(MonthArchiveView):
    queryset = Entry.objects.filter(status__exact=1).select_related()
    date_field = "pub_date"
    allow_future = True
    template_name = "archives/writing_date.html"


class EntryDetailView(DetailView):
    model = Entry
    template_name = "details/entry.html"
    slug_field = "slug"

    def get_object(self):
        obj = get_object_or_404(
            self.model,
            slug=self.kwargs['slug'],
            pub_date__month=self.kwargs['month'],
            pub_date__year=self.kwargs['year']
        )
        return obj

    def get_context_data(self, **kwargs):
        context = super(EntryDetailView, self).get_context_data(**kwargs)
        context['wildlife'] = Sighting.objects.filter(location=self.get_object().location).order_by('ap_id', 'ap__apclass__kind').distinct("ap")
        return context


class EntryDetailViewTXT(EntryDetailView):
    template_name = "details/entry.txt"


class HomepageList(ListView):
    """
    Return a main entry and list of Entries in reverse chronological order
    """
    context_object_name = 'recent'
    exclude = HomepageCurrator.objects.get(pk=1)
    queryset = Entry.objects.filter(status__exact=1).exclude(pk=exclude.featured.pk)[:8]

    def get_template_names(self):
        obj = HomepageCurrator.objects.get(pk=1)
        return ['%s' % obj.template_name]

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(HomepageList, self).get_context_data(**kwargs)
        context['homepage'] = HomepageCurrator.objects.get(pk=1)
        context['location'] = CheckIn.objects.latest()
        context['IMAGES_URL'] = settings.IMAGES_URL
        return context


class JrnlLatestView(EntryDetailView):
    template_name = "details/entry_latest.html"

    def get_object(self):
        obj = self.model.objects.latest()
        return obj

class JrnlRSSFeedView(Feed):
    title = "Luxagraf: Topographical Writings"
    link = "/jrnl/"
    description = "Latest postings to luxagraf.net"
    description_template = 'feeds/blog_description.html'

    def items(self):
        return Entry.objects.filter(status__exact=1).order_by('-pub_date')[:10]
    
    def item_pubdate(self, item):
        """
        Takes an item, as returned by items(), and returns the item's
        pubdate.
        """
        return item.pub_date