# *coding: utf-8*
from api.serializers import *
from rest_framework import generics
from rest_framework import permissions
from oauth2_provider.ext.rest_framework import TokenHasReadWriteScope
import django_filters
from base64 import b64decode
from django.core.files.base import ContentFile
from django.shortcuts import HttpResponse
from django.http import JsonResponse

class PostFilter(django_filters.rest_framework.FilterSet):
    class Meta:
        model = Post
        fields = ['refTown','refUser']

class ArticleFilter(django_filters.rest_framework.FilterSet):
    class Meta:
        model = Article
        fields = ['refTown']

class PostCommentFilter(django_filters.rest_framework.FilterSet):
    class Meta:
        model = PostComments
        fields = ['refPost']

class UserLikeFilter(django_filters.rest_framework.FilterSet):
    class Meta:
        model = UserLike
        fields = ['refUser']


class ArticleListView(generics.ListCreateAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = Article.objects.filter(valid=True).select_related("refTown").cache()
    serializer_class = ArticleSerializer
    filter_class = ArticleFilter
    ordering_fields = ('createdAt')
    ordering = ('-createdAt',)


class ArticleDetailView(generics.RetrieveUpdateDestroyAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = Article.objects.all().select_related("refTown")
    serializer_class = ArticleSerializer

class PostListView(generics.ListCreateAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = Post.objects.filter(valid=True).select_related('refUser').select_related('refTown').cache()
    serializer_class = PostSerializer
    filter_class = PostFilter
    ordering_fields = ('createdAt')
    ordering = ('-createdAt',)


class PostDetailView(generics.RetrieveUpdateDestroyAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = Post.objects.all().select_related('refUser').select_related('refTown')
    serializer_class = PostSerializer

class AddPostView(generics.CreateAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = Post.objects.all().select_related('refUser').select_related('refTown')
    serializer_class = PostCreateSerializer


class PostMediaListView(generics.ListCreateAPIView):
    def post(self, request, format=None):
        if request.method == "POST":
            data = request._data
            refPost = data['refPost']
            image_base64 = data['mediaUrl']
            fileName = data['filename']
            format, imgstr = image_base64.split(';base64,')  # format ~= data:image/X,
            # Get user
            post = Post.objects.get(pk=refPost)
            post.mediaType=1
            post.mediaUrl = ContentFile(b64decode(imgstr), name=fileName)
            post.save()
            newdict = {'mediaUrl': post.mediaUrl.name}
            return JsonResponse(newdict, safe=False)
        else:
            HttpResponse(status=404)


class PostCommentsListView(generics.ListCreateAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = PostComments.objects.filter(valid=True).select_related('refUser')
    serializer_class = PostCommentsSerializer
    filter_class = PostCommentFilter
    ordering_fields = ('createdAt')
    ordering = ('createdAt',)

class CreatePostCommentsView(generics.CreateAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = PostComments.objects.all().select_related('refUser').select_related('refPost')
    serializer_class = PostCommentsCreateSerializer

class UserLikeListView(generics.ListCreateAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = UserLike.objects.filter().select_related('refUser').select_related('refPost')
    serializer_class = UserLikeSerializer
    filter_class = UserLikeFilter
    pagination_class = NoPaginationResults
    ordering_fields = ('createdAt')
    ordering = ('createdAt',)

class UserLikeDetailView(generics.RetrieveUpdateDestroyAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = UserLike.objects.all().select_related('refUser').select_related('refPost')
    serializer_class = UserLikeSerializer