from django.shortcuts import render
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from core.models import UserApproval, UserInformation, UserCourse, Course, Instructor
from django.contrib.auth.models import User
from django.db.models import Q, Value
from django.db.models.functions import Concat


# Create your views here.
class AdminList(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        search = request.GET.get('search', '')
        user = self.request.user
        user_information = UserInformation.objects.get(id=user.id)
        data = []
        if not user.is_anonymous:
            if user_information.role == 'Admin':
                admins = User.objects.filter(Q(userinformation__role='Admin') &
                        Q(userapproval__approval_status='Approved') &                
                        Q(is_superuser=False)).annotate(full_name=Concat('first_name', Value(' '), 'last_name')).filter(
                        Q(full_name__trigram_word_similar=search) |
                        Q(full_name__icontains=search) |
                        Q(email__icontains=search))

                for admin in admins:
                    data.append({
                        'id': admin.id,
                        'username': admin.username,
                        'fullname': f'{admin.first_name} {admin.last_name}',
                        'email': admin.email 
                    })

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

    def delete(self, request):
        try:
            user = self.request.user
            user_information = UserInformation.objects.get(id=user.id)
            data = []
            admin_ids = request.data['selected_admins']
            
            if user_information.role == 'Admin':
                if admin_ids:
                    for id in admin_ids:
                        if id != user.id:
                            admin_user = User.objects.get(id=id)
                            admin_user.delete()

                    
                    admins = User.objects.filter(userinformation__role='Admin')
                    for admin in admins:
                        data.append({
                            'id': admin.id,
                            'fullname': f'{admin.first_name} {admin.last_name}',
                            'email': admin.email 
                        })

                    response_status = status.HTTP_200_OK
                else:
                    response_status = status.HTTP_400_BAD_REQUEST
            else:
                response_status = status.HTTP_401_UNAUTHORIZED

            return Response(data, status=response_status)
        except Exception as e:
            print(e)

            return Response({})


class EnrollmentList(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = self.request.user
        user_information = UserInformation.objects.get(user=user.id)
        offset = int(request.GET['offset'])
        limit = int(request.GET['limit'])
        search_email = request.GET.get('search_email', '')
        filtered_value = request.GET.get('filter', '')
        filter_list = ['Pending', 'Approved', 'Rejected']

        if filtered_value == 'Pending':
            filter_list = ['Pending']
        elif filtered_value == 'Approved':
            filter_list = ['Approved']
        elif filtered_value == 'Rejected':
            filter_list = ['Rejected']

        if user_information:
            if user_information.role == 'Admin':
                data = []
                enrollment_count = UserCourse.objects.filter(
                    approval_status__in=filter_list, user__email__icontains=search_email).count()

                enrollments = UserCourse.objects.filter(
                    approval_status__in=filter_list, user__email__icontains=search_email).order_by('-id')[offset:limit]

                for enrollment in enrollments:
                    primary_user = enrollment.user.all()[0]
                    data.append({
                        'id': enrollment.id,
                        'name': f'{primary_user.first_name} {primary_user.last_name}',
                        'academic_session_title': enrollment.course.academic_session.title,
                        'course_id': enrollment.course.id,
                        'course_title': enrollment.course.title,
                        'email': primary_user.email,
                        'is_paid': enrollment.is_paid,
                        # 'instructor': enrollment.instructor,
                        'approval_status': enrollment.approval_status,
                    })
                return Response({'enrollment_data': data, 'enrollment_count': enrollment_count}, status=status.HTTP_200_OK)
            else:
                return Response(status=status.HTTP_401_UNAUTHORIZED)
        else:
            return Response(status=status.HTTP_404_NOT_FOUND)


class EnrollmentDetails(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = self.request.user
        user_information = UserInformation.objects.get(user=user.id)
        enrollment_id = request.GET.get('enrollment_id', '')
        approval_status = request.GET.get('approval_status', '')
        
        if enrollment_id == '':
            return Response({'error': 'Enrollment id not found.'}, status=status.HTTP_404_NOT_FOUND)
        
        if user_information:
            if user_information.role == 'Admin':
                try:
                    enrollment = UserCourse.objects.get(id=enrollment_id)
                except UserCourse.DoesNotExist:
                    return Response({'error': 'Enrollment not found.'}, status=status.HTTP_404_NOT_FOUND)
                
                primary_user = enrollment.user.all()[0]
                instructor_id = None
                instructor_name = None
                if enrollment.instructor != None:
                    instructor_id = enrollment.instructor.id
                    instructor_name = enrollment.instructor.name

                enrollment_details = {
                    'id': enrollment.id,
                    'enrollment_name': enrollment.name,
                    'user_id': primary_user.id,
                    'name': f'{primary_user.first_name} {primary_user.last_name}',
                    'academic_session_title': enrollment.course.academic_session.title,
                    'course_id': enrollment.course.id,
                    'course_title': enrollment.course.title,
                    'email': primary_user.email,
                    'is_paid': enrollment.is_paid,
                    'instructor_id': instructor_id,
                    'instructor_name': instructor_name,
                    'approval_status': enrollment.approval_status,
                }
                
                return Response({'enrollment_details': enrollment_details}, status=status.HTTP_200_OK)
            else:
                return Response(status=status.HTTP_401_UNAUTHORIZED)
        else:
            return Response(status=status.HTTP_404_NOT_FOUND)


    def put(self, request):
        user = self.request.user
        user_information = UserInformation.objects.get(user=user)
        
        enrollment_id = request.data.get('enrollment_id', '')
        enrollment_name = request.data.get('enrollment_name', '')
        approval_status = request.data.get('approval_status', '')
        instructor_id = request.data.get('instructor_id', '')
        
        if approval_status=='' or enrollment_id=='':
            return Response(status=status.HTTP_404_NOT_FOUND)


        if user_information:
            if user_information.role == 'Admin':
                if enrollment_id:
                    try:
                        enrollment = UserCourse.objects.get(id=enrollment_id)
                    except UserCourse.DoesNotExist:
                        return Response({'error': 'Section not found'}, status=status.HTTP_404_NOT_FOUND)
                    
                    if instructor_id != '' and instructor_id != None:
                        try:
                            instructor = Instructor.objects.get(id=instructor_id)
                        except Instructor.DoesNotExist:
                            return Response({'error': 'Instructor not found'}, status=status.HTTP_404_NOT_FOUND)
                    else:
                        instructor = None

                    
                    if instructor != None and instructor.status != 'Active':
                        return Response({'error': 'Instructor is not Active'}, status=status.HTTP_400_BAD_REQUEST)


                    enrollment.name = enrollment_name
                    enrollment.approval_status = approval_status
                    enrollment.instructor = instructor
                    enrollment.save()

                    return Response(status=status.HTTP_200_OK)
                else:
                    return Response({'error': 'Enrollment not found'}, status=status.HTTP_400_BAD_REQUEST)
            else:
                return Response({'error': 'Unauthorized access!'}, status=status.HTTP_401_UNAUTHORIZED)
        else:
            return Response({'error': 'User not found'},status=status.HTTP_404_NOT_FOUND)