import requests
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.contrib.auth.models import User
from rest_framework.permissions import IsAuthenticated
from django.shortcuts import get_object_or_404
from core.models import UserInformation, Course, UserCourse, CoursePayment
from .serializers import PaymentSerializer


class CoursePaymentList(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = self.request.user
        user_information = get_object_or_404(UserInformation, user=user)
        search_email = request.GET['search_email']
        filter_type = request.GET['filter_type']
        offset = int(request.GET['offset'])
        limit = int(request.GET['limit'])

        if user_information.role == 'Student':
            payments =  CoursePayment.objects.filter(user_id = user.id)

            serializer = PaymentSerializer(payments, many=True)

            return Response(serializer.data, status=status.HTTP_200_OK)
            
        elif user_information.role == 'Admin':
            count =  CoursePayment.objects.filter(user__email__icontains=search_email, payment_type__icontains=filter_type).count()
            payments =  CoursePayment.objects.filter(user__email__icontains=search_email, payment_type__icontains=filter_type).order_by('-id')[offset:limit]

            serializer = PaymentSerializer(payments, many=True)

            return Response({'payments': serializer.data, 'count': count}, status=status.HTTP_200_OK)
        else:
            return Response(status=status.HTTP_404_NOT_FOUND)
    

    def post(self, request):
        user = self.request.user
        user_information = get_object_or_404(UserInformation, user=user)

        course_id = request.data.get('course_id')
        pay_amount = request.data.get('pay_amount')
        no_of_subscriptions = request.data.get('no_of_subscriptions', 1)
        payment_type = request.data.get('payment_type')
        tnx_id = request.data.get('tnx_id')
        total_amount = request.data.get('total_amount')
        discounted_amount = request.data.get('discounted_amount')

        if user_information.role == 'Instructor':
            return Response({'error': 'Only Students/Admin can make course payments.'}, status=status.HTTP_403_FORBIDDEN)
        
        try:
            course = get_object_or_404(Course, id=course_id)
            if not CoursePayment.objects.filter(user=user, id=course_id).exists():
                CoursePayment.objects.create(
                    course=course,
                    user=user, 
                    pay_amount=pay_amount,
                    no_of_subscriptions=no_of_subscriptions,
                    payment_type=payment_type,
                    tnx_id=tnx_id,
                    total_amount=total_amount,
                    discounted_amount=discounted_amount
                )
                course.student.add(user)
                return Response({'success': 'Payment recorded successfully.'}, status=status.HTTP_201_CREATED)
            else:
                return Response({'error': 'Already paid for this course.'}, status.HTTP_400_BAD_REQUEST)

        except Exception as e:
            return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST)


class CoursePaymentDetails(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = self.request.user
        payment_id = request.GET.get('payment_id', '')

        if payment_id == '':
            return Response({'error': 'Payment id not found.'}, status=status.HTTP_404_NOT_FOUND)

        user_information = get_object_or_404(UserInformation, user=user)

        if user_information.role == 'Student':
            payment =  get_object_or_404(CoursePayment, id = payment_id, user_id = user.id)

            serializer = PaymentSerializer(payment)

            return Response(serializer.data, status=status.HTTP_200_OK)
            
        elif user_information.role == 'Admin':
            payment =  get_object_or_404(CoursePayment, id = payment_id)

            serializer = PaymentSerializer(payment)

            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)

    def put(self, request):
        user = self.request.user
        payment_id = int(request.data.get('payment_id', ''))
        old_course_id = int(request.data.get('old_course_id', ''))
        new_course_id = int(request.data.get('new_course_id', ''))

        if payment_id == '':
            return Response({'error': 'Payment id not found.'}, status=status.HTTP_404_NOT_FOUND)
        if old_course_id == '' or new_course_id == '':
            return Response({'error': 'Course id not found.'}, status=status.HTTP_404_NOT_FOUND)

        user_information = get_object_or_404(UserInformation, user=user)
        
        
        if user_information.role == 'Admin':
            old_course = get_object_or_404(Course, id = old_course_id)
            new_course = get_object_or_404(Course, id = new_course_id)
            
            payment = get_object_or_404(CoursePayment, id = payment_id)

            user_course_exists = UserCourse.objects.filter(user__in=[payment.user], course=new_course).exists()

            if user_course_exists == True:
                return Response({'error': 'User already enrolled in this course.'}, status=status.HTTP_400_BAD_REQUEST)
            
            user_course = get_object_or_404(UserCourse, course=old_course, user__in=[payment.user])
            
            payment.course = new_course
            payment.save()

            user_course.course = new_course
            user_course.save()

            return Response({'success': 'Payment updated.'}, status=status.HTTP_200_OK)
        else:
            return Response({'error': 'Unauthorized Access'}, status=status.HTTP_401_UNAUTHORIZED)

