from itertools import chain

from django.core.urlresolvers import reverse
from django.contrib.auth.decorators import login_required
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import render, Http404, HttpResponseRedirect, get_object_or_404

# Create your views here.



from rest_framework import generics, permissions
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework_jwt.authentication import JSONWebTokenAuthentication


from analytics.signals import page_view
from comments.forms import CommentForm
from comments.models import Comment



from .models import Video, Category, TaggedItem
from .permissions import IsMember
from .serializers import CategorySerializer, VideoSerializer


class VideoDetailAPIView(generics.RetrieveAPIView):
	queryset = Video.objects.all()
	serializer_class = VideoSerializer
	permission_classes = [IsMember]
	#add permission for membership & free preview on obj

	def get_object(self):
		cat_slug = self.kwargs["cat_slug"]
		vid_slug = self.kwargs["vid_slug"]
		category = get_object_or_404(Category, slug=cat_slug)
		obj = get_object_or_404(Video, category=category, slug=vid_slug)
		return obj


class CategoryListAPIView(generics.ListAPIView):
	authentication_classes = [SessionAuthentication, BasicAuthentication, JSONWebTokenAuthentication]
	queryset = Category.objects.all()
	serializer_class = CategorySerializer
	permission_classes = [permissions.IsAuthenticated, ]
	paginate_by = 10

	# def get_queryset(self):
	#     user = self.request.user
	#     return user.accounts.all()
	# #pass

class CategoryDetailAPIView(generics.RetrieveAPIView):
	authentication_classes = [SessionAuthentication, BasicAuthentication, JSONWebTokenAuthentication]
	queryset = Category.objects.all()
	serializer_class = CategorySerializer
	permission_classes = [permissions.IsAuthenticated, ]

	def get_object(self):
		slug = self.kwargs["slug"]
		obj = get_object_or_404(Category, slug=slug)
		return obj



#@login_required
def video_detail(request, cat_slug, vid_slug):
	cat = get_object_or_404(Category, slug=cat_slug)
	obj = get_object_or_404(Video, slug=vid_slug, category=cat)
	page_view.send(request.user, 
				page_path=request.get_full_path(), 
				primary_obj=obj,
				secondary_obj=cat)
	if request.user.is_authenticated() or obj.has_preview:
		try:
			is_member = request.user.is_member
		except:
			is_member = None
		if is_member or obj.has_preview:
			comments = obj.comment_set.all()
			for c in comments:
				c.get_children()
			comment_form = CommentForm()
			context = {"obj": obj, 
				"comments":comments, 
				"comment_form": comment_form}
			return render(request, "videos/video_detail.html", context)
		else:
			# upgrade account
			next_url = obj.get_absolute_url()
			return HttpResponseRedirect("%s?next=%s"%(reverse('account_upgrade'), next_url))
	else:
		next_url = obj.get_absolute_url()
		return HttpResponseRedirect("%s?next=%s"%(reverse('login'), next_url))



def category_list(request):
	queryset = Category.objects.all()
	# queryset2 = Category.objects.all()
	# queryset3 = list(chain(queryset,queryset2))
	context = {
		"queryset": queryset,
	}
	return render(request, "videos/category_list.html", context)



# @login_required
def category_detail(request, cat_slug):
	obj = get_object_or_404(Category, slug=cat_slug)
	queryset = obj.video_set.all()
	page_view.send(request.user, 
				page_path=request.get_full_path(), 
				primary_obj=obj)


	print queryset
	return render(request, "videos/video_list.html", {"obj": obj, "queryset": queryset})



# def video_edit(request):

# 	return render(request, "videos/video_single.html", {})


# def video_create(request):

# 	return render(request, "videos/video_single.html", {})