from http.client import HTTPResponse
from django.db.models.query_utils import Q

from django.shortcuts import render
from rest_framework.decorators import api_view, permission_classes
from django.db.models import Avg, Count, Min, Sum
from rest_framework.permissions import AllowAny, IsAdminUser, IsAuthenticated
from campaign import serializers

from campaign.models import Category, Comment, Donation, Reply,Post,Category,Payment
from account.models import *
from campaign.serializers import CategorySerializer, DonationSerializer, PaymentSerializer, allDonationSerializer, getAllPostSerializer, getPostSerializer,PostSerializer
from rest_framework.response import Response

from campaign.views import comment

# Create your views here.





#Get a particular post by post id
@api_view(['GET'])
@permission_classes([AllowAny])
def getPost(request,pk):
    if request.method == 'GET':
        post = Post.objects.filter(id=pk)
        serializer = getPostSerializer(post,many=True)
        donation_count = Comment.objects.filter(post__id=pk).filter(donation__isnull=False).count()
        data = list(serializer.data)[0]
        raised = Comment.objects.filter(post__id=pk).filter(donation__isnull=False).aggregate(Sum('donation__amount'))['donation__amount__sum']
        paid_amount = Payment.objects.filter(post__id=pk).aggregate(Sum('paid_amount'))['paid_amount__sum']
        data['paid_amount'] =paid_amount
        data['funds']= {
            'donations': donation_count,
            'raised' : raised,
            'target' :data['target_amount']
        }
        data['organizer'] = {
            'first_name': data['first_name'],
            'last_name': data['last_name'],
            'post_owner':data['user_id']
        }
        data['category'] = Category.objects.filter(id=data['category']).values_list('title', flat=True)[0]
        del data['target_amount']
        del data['first_name']
        del data['last_name']
        del data['user_id']
        return Response(data)



#Get all open post
@api_view(['GET'])
@permission_classes([AllowAny])
def getAllPost(request):
    if request.method == 'GET':
        post = Post.objects.filter(post_status='open')
        openPostserializer = getAllPostSerializer(post,many=True)
        data = list(openPostserializer.data)
    
        for i in range(len(data)):
            
            temp = data[i]
            
            donation_count = Comment.objects.filter(post__id=temp['id']).filter(donation__isnull=False).count()
            raised = Comment.objects.filter(post__id=temp['id']).filter(donation__isnull=False).aggregate(Sum('donation__amount'))['donation__amount__sum']
            paid_amount = Payment.objects.filter(post__id=temp['id']).aggregate(Sum('paid_amount'))['paid_amount__sum']
            temp['paid_amount'] =paid_amount
            temp['funds']= {
                'donations': donation_count,
                'raised' : raised,
                'target' :temp['target_amount']
            }
            del temp['target_amount']
            del temp['comment']

        return Response(data)


#Get all open post of particular category
@api_view(['GET'])
@permission_classes([AllowAny])
def getCategoryPost(request,id):
    if request.method == 'GET':
        post = Post.objects.filter(post_status='open',category=id)
        openPostserializer = getAllPostSerializer(post,many=True)

        data = list(openPostserializer.data)
        

        for i in range(len(data)):
            
            temp = data[i]
            
            donation_count = Comment.objects.filter(post__id=temp['id']).filter(donation__isnull=False).count()
            raised = Comment.objects.filter(post__id=temp['id']).filter(donation__isnull=False).aggregate(Sum('donation__amount'))['donation__amount__sum']
            paid_amount = Payment.objects.filter(post__id=temp['id']).aggregate(Sum('paid_amount'))['paid_amount__sum']
            temp['paid_amount'] =paid_amount
            temp['funds']= {
                'donations': donation_count,
                'raised' : raised,
                'target' :temp['target_amount']
            }
            del temp['target_amount']
            del temp['comment']

        return Response(data)


#Get top N open post of particular category
@api_view(['GET'])
@permission_classes([AllowAny])
def getTopNPost(request,N):
    if request.method == 'GET':
        post = Post.objects.filter(post_status='open')
        openPostserializer = getAllPostSerializer(post,many=True)

        data = list(openPostserializer.data)
        


        for i in range(len(data)):
            
            temp = data[i]
            
            donation_count = Comment.objects.filter(post__id=temp['id']).filter(donation__isnull=False).count()
            raised = Comment.objects.filter(post__id=temp['id']).filter(donation__isnull=False).aggregate(Sum('donation__amount'))['donation__amount__sum']
            paid_amount = Payment.objects.filter(post__id=temp['id']).aggregate(Sum('paid_amount'))['paid_amount__sum']
            temp['paid_amount'] =paid_amount
            if not raised:
                raised =0
            if not donation_count:
                raised =0
            temp['funds']= {
                'donations': donation_count,
                'raised' : raised,
                'target' :temp['target_amount']
            }
            del temp['target_amount']
            del temp['comment']
        
        if len(data) >N:
            
            for i in range(len(data)):
                raised_amount_one = data[i]['funds']['raised']
                for j in range(i,len(data)):

                    raised_amount_two = data[j]['funds']['raised']
                    if raised_amount_two>raised_amount_one:
                        data[i],data[j] = data[j],data[i]

            return Response(data[:N])





        return Response(data)

# get category
@api_view(['GET'])
@permission_classes([AllowAny])
def getCategory(request):
    if request.method == 'GET':
        category = Category.objects.all()
        serializer = CategorySerializer(category,many=True)
        return Response(serializer.data)



#print payment history
@api_view(['GET'])
@permission_classes([AllowAny])
def printPayment(request,post):
    if request.method == 'GET':
        payment = Payment.objects.filter(post=post)
        payserializer = PaymentSerializer(payment,many=True)
        donation = Donation.objects.filter(comment__post=post)
        donationserializer = DonationSerializer(donation,many=True)
        
        return Response({"payments":payserializer.data,"donations":donationserializer.data})

@api_view(['GET'])
@permission_classes([AllowAny])
def searchCampaign(request,word):
  if request.method == 'GET':
    post = Post.objects.filter(Q(title__icontains=word) | Q(description__icontains=word),post_status='open')
    openPostserializer = getAllPostSerializer(post,many=True)
    data = list(openPostserializer.data)

    for i in range(len(data)):
        
        temp = data[i]
        
        donation_count = Comment.objects.filter(post__id=temp['id']).filter(donation__isnull=False).count()
        raised = Comment.objects.filter(post__id=temp['id']).filter(donation__isnull=False).aggregate(Sum('donation__amount'))['donation__amount__sum']
        paid_amount = Payment.objects.filter(post__id=temp['id']).aggregate(Sum('paid_amount'))['paid_amount__sum']
        temp['paid_amount'] =paid_amount
        temp['funds']= {
            'donations': donation_count,
            'raised' : raised,
            'target' :temp['target_amount']
        }
        del temp['target_amount']
        del temp['comment']

    return Response(data)


@api_view(['GET'])
@permission_classes([AllowAny])
def getTopDonors(request,pk):
    if request.method == 'GET':
        post = Comment.objects.filter(post=pk)
        serializer = allDonationSerializer(post,many=True)
        data = list(serializer.data)
        result = data.copy()
        for item in data:
            if 'donation' not in item:
                result.remove(item)
        result = sorted(result, key = lambda i: i['donation'],reverse=True)
        return Response(result)


@api_view(['GET'])
@permission_classes([AllowAny])
def share(request,pk):
    if request.method == 'GET':
        post = Post.objects.filter(id=pk)
        serializer = PostSerializer(post,many=True)
        data = list(serializer.data)[0]
        
        return render(request,"share.html",{"title":data['title'],"description":data['description'],"image":data['banner'],"id":pk})
