from django.http import response
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 account.models import User

from campaign.models import Donation, Payment, Reply,Post,Category
from campaign.serializers import CategorySerializer, PaymentSerializer, getAllPostSerializer, getPostSerializer,PostSerializer
from rest_framework.response import Response

from campaign.views import comment



#admin get all pending post       
@api_view(['GET'])
@permission_classes([IsAdminUser])
def getAdminViewPendingPost(request,type):
    if request.method == 'GET':
        post = Post.objects.filter(post_status='pending',post_type=type)
        openPostserializer = getAllPostSerializer(post,many=True)
        data = list(openPostserializer.data)
        
        for i in range(len(data)):
            temp = data[i]
            paid_amount = Payment.objects.filter(post__id=temp['id']).aggregate(Sum('paid_amount'))['paid_amount__sum']
            temp['paid_amount'] =paid_amount
            del temp['banner']
            del temp['target_amount']
            del temp['post_status']
            del temp['created_time']
            del temp['comment']
        return Response(data)



#admin get all closed post       
@api_view(['GET'])
@permission_classes([IsAdminUser])
def getAdminViewClosedPost(request,type):
    if request.method == 'GET':
        post = Post.objects.filter(post_status='closed',post_type=type)
        closedPostserializer = getAllPostSerializer(post,many=True)
        data = list(closedPostserializer.data)
        for i in range(len(data)):
            temp = data[i]
            paid_amount = Payment.objects.filter(post__id=temp['id']).aggregate(Sum('paid_amount'))['paid_amount__sum']
            temp['paid_amount'] =paid_amount
            del temp['banner']
            del temp['target_amount']
            del temp['post_status']
            del temp['created_time']
            del temp['comment']
        return Response(data)

#admin get all closed post       
@api_view(['GET'])
@permission_classes([IsAdminUser])
def getAdminViewOpenPost(request,type):
    if request.method == 'GET':
        post = Post.objects.filter(post_status='open',post_type=type)
        openPostserializer = getAllPostSerializer(post,many=True)
        data = list(openPostserializer.data)
        for i in range(len(data)):
            temp = data[i]
            paid_amount = Payment.objects.filter(post__id=temp['id']).aggregate(Sum('paid_amount'))['paid_amount__sum']
            temp['paid_amount'] =paid_amount
            del temp['banner']
            del temp['target_amount']
            del temp['post_status']
            del temp['created_time']
            del temp['comment']
        return Response(data)

#approve pending post
@api_view(['POST'])
@permission_classes([IsAdminUser])
def approvePost(request):
    Post.objects.filter(id=request.data.get('id')).update(post_status='open')
    return Response({"response":"success"})

# #pay fundraiser
# @api_view(['POST'])
# @permission_classes([IsAdminUser])
# def payFundRaiser(request):
#     Post.objects.filter(id=request.data.get('id')).update(paid_amount=request.data.get('amount'))
#     return Response({"response":"success"})

#pay fundraiser
@api_view(['POST'])
@permission_classes([IsAdminUser])
def payFundRaiser(request):
    if request.method == 'POST':
        serializer = PaymentSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            paid_amount = Payment.objects.filter(post=request.data.get('post')).aggregate(Sum('paid_amount'))['paid_amount__sum']
            return Response({"paid_amount":paid_amount})
        else:
            return Response(serializer.errors)

#print payment history

# list all fund_raiser and their detail

@api_view(['GET'])
@permission_classes([IsAdminUser])
def userList(request):
    data={}
    accounts = User.objects.filter(is_superuser=False).values('id','first_name', 'last_name','email')
    data= []
    for i in range(len(accounts)):
        total_campaign = Post.objects.filter(post_owner__email=accounts[i]['email']).count()
        total_raised = Donation.objects.filter(comment__post__post_owner__email=accounts[i]['email']).aggregate(Sum('amount'))['amount__sum']
        
        total_campaign_donation = Donation.objects.filter(donor__email=accounts[i]['email']).count()
        total_donations = Donation.objects.filter(donor__email=accounts[i]['email']).aggregate(Sum('amount'))['amount__sum']
        
        data.append({})
        data[i]['id'] = accounts[i]['id']
        data[i]['first_name'] = accounts[i]['first_name']
        data[i]['last_name'] = accounts[i]['last_name']
        data[i]['email'] = accounts[i]['email']
        if not total_campaign:
            total_campaign=0
        if not total_raised:
            total_raised=0
        data[i]['total_campaign'] = total_campaign
        data[i]['total_raised'] = total_raised
        data[i]['total_campaign_donation'] = total_campaign_donation
        data[i]['total_donations'] = total_donations
    return Response(data)


# @api_view(['GET'])
# @permission_classes([IsAdminUser])
# def fundRaiserList(request):
#     data={}
#     fund_raisers= User.objects.all().values('id','user__first_name', 'user__last_name','user__email')
#     data= []
#     for i in range(len(fund_raisers)):
#         total_campaign = Post.objects.filter(post_owner__user__email=fund_raisers[i]['user__email']).count()
#         total_raised = Donation.objects.filter(comment__post__post_owner__user__email=fund_raisers[i]['user__email']).aggregate(Sum('amount'))['amount__sum']
#         data.append({})
#         data[i]['id'] = fund_raisers[i]['id']
#         data[i]['first_name'] = fund_raisers[i]['user__first_name']
#         data[i]['last_name'] = fund_raisers[i]['user__last_name']
#         data[i]['email'] = fund_raisers[i]['user__email']
#         if not total_campaign:
#             total_campaign=0
#         if not total_raised:
#             total_raised=0
#         data[i]['total_campaign'] = total_campaign
#         data[i]['total_raised'] = total_raised
#     return Response(data)


# list all donors and their detail
# @api_view(['GET'])
# @permission_classes([IsAdminUser])
# def donorList(request):
#     data={}
#     donors = Donor.objects.all().values('id','user__first_name', 'user__last_name','user__email','user__newsletter_subscribed')
#     data= []
#     for i in range(len(donors)):
#         total_campaign = Donation.objects.filter(donor__user__email=donors[i]['user__email'],id__in=Donation.objects.values('comment__post__id')
#                                .distinct()
#                                .values_list('comment__post__id', flat=True)).count()
#         total_donations = Donation.objects.filter(donor__user__email=donors[i]['user__email']).aggregate(Sum('amount'))['amount__sum']
#         data.append({})
#         data[i]['id'] = donors[i]['id']
#         data[i]['first_name'] = donors[i]['user__first_name']
#         data[i]['last_name'] = donors[i]['user__last_name']
#         data[i]['email'] = donors[i]['user__email']
#         data[i]['newsletter_subscribed'] = donors[i]['user__newsletter_subscribed']
        
#         if not total_campaign:
#             total_campaign=0
#         if not total_donations:
#             total_donations=0
#         data[i]['total_campaign'] = total_campaign
#         data[i]['total_donations'] = total_donations
#     return Response(data)



# add category
@api_view(['POST'])
@permission_classes([IsAdminUser])
def addCategory(request):
    if request.method == 'POST':
        serializer = CategorySerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)


# add category
@api_view(['POST'])
@permission_classes([IsAdminUser])
def editCategory(request,id):
    if request.method == 'POST':
        Category.objects.filter(id=id).update(title=request.data.get('title'))
        return Response(True)

@api_view(["DELETE"])
@permission_classes([IsAdminUser])
def deleteCategory(request,id):
    if request.method == 'DELETE':
        Category.objects.filter(id=id).delete()
        return Response({"response":"success"})