# *coding: utf-8*

from api.serializers import *
from rest_framework import permissions
from oauth2_provider.ext.rest_framework import TokenHasReadWriteScope
from rest_framework import generics
from drf_multiple_model.views import MultipleModelAPIView
import django_filters


class PlaceFilter(django_filters.rest_framework.FilterSet):
    categoryName = django_filters.CharFilter(name="refCategory__name",lookup_expr='contains')
    class Meta:
        model = Place
        fields = ['refTown','refCategory','categoryName','valid']

class PlaceListView(generics.ListCreateAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = Place.objects.filter(valid=True).select_related('refCategory').cache()
    serializer_class = PlaceSerializer
    filter_class = PlaceFilter
    #distance_filter_field = 'location'
    ordering = ('location',)
    #distance_filter_convert_meters = True
    #bbox_filter_include_overlapping = False  # Optional
    pagination_class = NoPaginationResults



class PlaceDetailView(generics.RetrieveUpdateDestroyAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = Place.objects.all().select_related('refCategory').cache()
    serializer_class = PlaceSerializer

class PlaceUsersView(generics.CreateAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = PlacesUsers.objects.all().select_related('refPlace')
    serializer_class = PlacesUsersForCreateSerializer

class PlacesUsersDetailView(generics.RetrieveUpdateDestroyAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = PlacesUsers.objects.all().select_related('refPlace')
    serializer_class = PlacesUsersSerializer

class PlaceCommentsView(generics.CreateAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = PlacesComments.objects.filter(valid=True).select_related('refPlace')
    serializer_class = PlacesCommentsForCreateSerializer

class PlaceVoteView(generics.CreateAPIView):
    #permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = PlacesVote.objects.all().select_related('refPlace').select_related("refUser")
    serializer_class = PlacesVoteSerializer


#### Custom Methods #########
class PlaceFullDetailView(MultipleModelAPIView):
    ##permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]

    def get_queryList(self):
        refPlace = self.request.query_params.get('refPlace', None)
        comments = PlacesComments.objects.filter(valid=True, refPlace=refPlace).order_by('-createdAt').select_related("refPlace").select_related("refUser")
        usersGoing = PlacesUsers.objects.filter(refPlace=refPlace).order_by('refUser','-createdAt').select_related("refPlace").select_related("refUser").distinct("refUser")
        queryList = [
            (comments, PlacesCommentsSerializer),
            (usersGoing, PlacesUsersSerializer),
        ]
        return queryList