import datetime
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.models import Comment, Donation, Payment, Reply,Post
from campaign.serializers import getAllPostSerializer, getPostSerializer,PostSerializer
from rest_framework.response import Response
import os


# user post a campaign
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def uploadPost(request):
    if request.method == 'POST':
        temp = request.data.copy()
        temp['post_owner'] =request.user.id
        temp['expiry_date'] = datetime.datetime.strptime(temp['expiry_date'], "%Y-%m-%d").date()
        serializer = PostSerializer(data=temp)
        if serializer.is_valid():
            serializer.save()
            return Response({'respose':'succesfull'})
        else:
            return Response(serializer.errors)

#user get all his open post       
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def getOpenPost(request):
    if request.method == 'GET':
        post = Post.objects.filter(post_owner=request.user.id,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)


#user get all his closed post       
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def getClosedPost(request):
    if request.method == 'GET':
        post = Post.objects.filter(post_owner=request.user.id,post_status='closed')
        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)

#user get all his open post       
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def getPendingPost(request):
    if request.method == 'GET':
        post = Post.objects.filter(post_owner=request.user.id,post_status='pending')
        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)

#user edit post       
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def editPost(request,id):
    if request.method== 'POST': 
        Post.objects.filter(id=id).update(
            title= request.data.get('title'),
            description= request.data.get('description'),
            expiry_date= request.data.get('expiry_date'),
            target_amount= request.data.get('target_amount'),
            post_type= request.data.get('post_type'),
            category= request.data.get('category'),
            post_status = "pending"
        )
        post = Post.objects.get(id=id)
        if len(request.FILES) != 0:
            if len(post.banner) > 0 and os.path.exists(post.banner.path):
                os.remove(post.banner.path)
            post.banner = request.FILES['banner']
            post.save()
        return Response(True)