from datetime import date

from django.core.cache import cache
from django.db.models import Q, F
from django.shortcuts import render
from django.shortcuts import get_object_or_404
from django.views.generic import ListView, DetailView
#from silk.profiling.profiler import silk_profile

from config.models import SideBar
from .models import Post, Tag, Category
from comment.models import Comment



class CommonViewMinxin:
	def get_context_data(self, **kwargs):
		context = super().get_context_data(**kwargs)
		context.update({
			'sidebars': self.get_sidebars(),
		})
		context.update(self.get_navs())
		return context

	def get_sidebars(self):
		return SideBar.objects.filter(status=SideBar.STATUS_SHOW)

	def get_navs(self):
		categories = Category.objects.filter(status=Category.STATUS_NORMAL)
		nav_categories = []
		normal_categories = []
		for cate in categories:
			if cate.is_nav:
				nav_categories.append(cate)
			else:
				normal_categories.append(cate)

		return {
			'navs': nav_categories,
			'categories': normal_categories,
		}

class IndexView(CommonViewMinxin, ListView):
	queryset = Post.latest_posts()
	paginate_by = 5
	context_object_name = 'post_list'
	template_name = 'blog/list.html'



class CategoryView(IndexView):
	def get_context_data(self, **kwargs):
		context = super().get_context_data(**kwargs)
		category_id = self.kwargs.get('category_id')
		category = get_object_or_404(Category, pk=category_id)
		context.update({
			'category': category,
		})
		return context


	def get_queryset(self):
		'''重写queryset，根据分类过滤'''
		queryset = super().get_queryset()
		category_id = self.kwargs.get('category_id')
		return queryset.filter(category_id=category_id)



class TagView(IndexView):
	def get_context_data(self, **kwargs):
		context = super().get_context_data(**kwargs)
		tag_id = self.kwargs.get('tag_id')
		tag = get_object_or_404(Tag, pk=tag_id)
		context.update({
			'tag': tag,
		})
		return context


	def get_queryset(self):
		'''重写queryset，根据标签过滤'''
		queryset = super().get_queryset()
		tag_id = self.kwargs.get('tag_id')
		return queryset.filter(tag__id=tag_id)



class PostDetailView(CommonViewMinxin, DetailView):
	queryset = Post.latest_posts()
	template_name = 'blog/detail.html'
	context_object_name = 'post'
	pk_url_kwarg = 'post_id'


	def get(self, request, *args, **kwargs):
		response = super().get(request, *args, **kwargs)
		self.handle_visited()
		return response

	def handle_visited(self):
		increase_pv = False
		increase_uv = False
		uid = self.request.uid
		pv_key = 'pv:%s:%s' % (uid, self.request.path)
		uv_key = 'uv:%s:%s:%s' % (uid, str(date.today()), self.request.path)
		if not cache.get(pv_key):
			increase_pv = True
			cache.set(pv_key, 1, 1*60)    #1分钟有效

		if not cache.get(uv_key):
			increase_uv = True
			cache.set(uv_key, 1, 24*60*60)

		if increase_pv and increase_uv:
			Post.objects.filter(pk=self.object.id).update(pv=F('pv') + 1,
				uv=F('uv') + 1)
		elif increase_pv:
			Post.objects.filter(pk=self.object.id).update(pv=F('pv') + 1)
		elif increase_pv:
			Post.objects.filter(pk=self.object.id).update(pv=F('uv') + 1)


class SearchView(IndexView):
	def get_context_data(self):
		context = super().get_context_data()
		context.update({
			'keyword': self.request.GET.get('keyword', '')
		})
		return context


	def get_queryset(self):
		queryset = super().get_queryset()
		keyword = self.request.GET.get('keyword')
		if not keyword:
			return queryset
		return queryset.filter(Q(title__icontains=keyword) | Q(desc__icontains
			=keyword))



class AuthorView(IndexView):
	def get_queryset(self):
		queryset = super().get_queryset()
		author_id = self.kwargs.get('owner_id')
		return queryset.filter(owner_id=author_id)

'''
def post_list(request, category_id=None, tag_id=None):
	tag = None
	category = None

	if tag_id:
		post_list, tag = Post.get_by_tag(tag_id)
	elif category_id:
		post_list, category=Post.get_by_category(category_id)
	else:
		post_list = Post.latest_posts()

	context = {
	    'category': category,
	    'tag': tag,
	    'post_list': post_list,
	    'sidebars': SideBar.get_all(),
	}
	context.update(Category.get_navs())
	return render(request, 'blog/list.html', context=context)


def post_detail(request, post_id=None):
	try:
		post = Post.objects.get(id=post_id)
	except Post.DoesNotExist:
		raise Http404('Post does not exist!')

	context={
	    'post': post,
	    'sidebars': SideBar.get_all(),
	}
	context.update(Category.get_navs())
	return render(request, 'blog/detail.html', context=context)
'''


[(26, 'config.models.SideBar.objects.filter', 'SideBar.objects.filter', ([], {'status': 'SideBar.STATUS_SHOW'}), False, 'from config.models import SideBar\n'), (55, 'django.shortcuts.get_object_or_404', 'get_object_or_404', (['Category'], {'pk': 'category_id'}), False, 'from django.shortcuts import get_object_or_404\n'), (74, 'django.shortcuts.get_object_or_404', 'get_object_or_404', (['Tag'], {'pk': 'tag_id'}), False, 'from django.shortcuts import get_object_or_404\n'), (107, 'django.core.cache.cache.get', 'cache.get', (['pv_key'], {}), False, 'from django.core.cache import cache\n'), (109, 'django.core.cache.cache.set', 'cache.set', (['pv_key', '(1)', '(1 * 60)'], {}), False, 'from django.core.cache import cache\n'), (111, 'django.core.cache.cache.get', 'cache.get', (['uv_key'], {}), False, 'from django.core.cache import cache\n'), (113, 'django.core.cache.cache.set', 'cache.set', (['uv_key', '(1)', '(24 * 60 * 60)'], {}), False, 'from django.core.cache import cache\n'), (138, 'django.db.models.Q', 'Q', ([], {'title__icontains': 'keyword'}), False, 'from django.db.models import Q, F\n'), (138, 'django.db.models.Q', 'Q', ([], {'desc__icontains': 'keyword'}), False, 'from django.db.models import Q, F\n'), (106, 'datetime.date.today', 'date.today', ([], {}), False, 'from datetime import date\n'), (116, 'django.db.models.F', 'F', (['"""pv"""'], {}), False, 'from django.db.models import Q, F\n'), (117, 'django.db.models.F', 'F', (['"""uv"""'], {}), False, 'from django.db.models import Q, F\n'), (119, 'django.db.models.F', 'F', (['"""pv"""'], {}), False, 'from django.db.models import Q, F\n'), (121, 'django.db.models.F', 'F', (['"""uv"""'], {}), False, 'from django.db.models import Q, F\n')]