import os
import random
import tarfile
from braces.views import LoginRequiredMixin
from django.http import Http404, HttpResponse
from django.shortcuts import get_object_or_404
from django.views.generic.detail import DetailView

from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
import requests

from .models import Answer, Activity
from .serializers import AnswerSerializer, ActivityImageSerializer


class ActivityImageViewSet(viewsets.ModelViewSet):
    model = Activity
    queryset = Activity.objects.all()
    serializer_class = ActivityImageSerializer
    permission_classes = [IsAuthenticated]

    def put(self, request, **kwargs):
        activity = self.get_object()
        serializer = ActivityImageSerializer(activity, request.FILES)
        if serializer.is_valid():
            serializer.save()
            return Response(status=200)
        else:
            return Response(serializer.errors, status=400)


class AnswerViewSet(viewsets.ModelViewSet):
    model = Answer
    serializer_class = AnswerSerializer
    filter_fields = ('activity', 'user',)
    lookup_field = 'activity'

    def perform_create(self, serializer):
        activity = Activity.objects.get(id=self.request.data['activity'])

        if activity.type == 'slidesreveal' and len(activity.answers.filter(user=self.request.user)) > 0:
            return Response(status=200)
        serializer.save(user=self.request.user)

    def get_queryset(self):
        return Answer.objects.filter(user=self.request.user)

    def get_object(self):
        if 'activity' in self.kwargs:
            activity = self.kwargs['activity']
            try:
                return self.get_queryset().filter(activity=activity).latest('timestamp')
            except Answer.DoesNotExist:
                # Raises Http404 to create a new object when the request is a PUT and the Answer does not exist
                # see django-rest-framework UpdateMixin for details
                raise Http404
        return super(AnswerViewSet, self).get_object()


# This view return the raw html inside data['content'] of an activity
# It is used to closely emulate the embed behavior for iframes in slidesreveal activities
# Also, it's worth noting that such raw html is always created outside of Timtec and uploaded through an administrative interface
class SlidesRevealView(LoginRequiredMixin, DetailView):

    def get_queryset(self):
        raise Http404

    def get(self, request, pk):
        activity = get_object_or_404(Activity, pk=pk)
        if activity.type != 'slidesreveal':
            raise Http404
        else:
            # Send HTML ready to use with reveal.js
            return HttpResponse(activity.data['content'])