import json
from django.db.models.query_utils import Q
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 Notepad, User, UserCourse, UserInformation, Instructor
from .serializers import NotepadSerializer


class NotepadList(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        usercourse_id = request.GET.get('usercourse_id', None)
        user_information = UserInformation.objects.get(user=request.user)
        
        if UserCourse.objects.filter(id=usercourse_id).exists():
            # Check if user has access to the course
            if user_information.role == 'Instructor':
                instructor_id = Instructor.objects.get(user=request.user)
                course_access = UserCourse.objects.filter(
                                                        Q(id=usercourse_id) &
                                                        Q(instructor=instructor_id)).exists()
                
                if course_access is False:
                    return Response(status=status.HTTP_401_UNAUTHORIZED)
                    
            elif user_information.role == 'Student':
                course_access = UserCourse.objects.filter(
                                                        Q(id=usercourse_id) &
                                                        Q(user=user_information.user.id)).exists()

                if course_access is False:
                    return Response({'Has no Access'},status=status.HTTP_401_UNAUTHORIZED)
            
            notepad = Notepad.objects.filter(usercourse=usercourse_id, user=request.user)
            serializer = NotepadSerializer(notepad, many=True)
            return Response({'data': serializer.data}, status=status.HTTP_200_OK)

        else: 
            return Response({'Invalid Section'},status=status.HTTP_401_UNAUTHORIZED)

        # serializer = OnlineMeetingSerializer(online_meetings, many=True)

    def post(self, request):
        course_section = request.data.get('course_section', '')
        note = request.data.get('note', '')
        is_published = request.data.get('is_published', '')

        if UserCourse.objects.filter(id=course_section).exists():

            if course_section == '' or note == '':
                return Response({"Not elegible for this course"},status=status.HTTP_400_BAD_REQUEST)

            try:
                user_information = UserInformation.objects.get(user=request.user)
            except:
                return Response(status=status.HTTP_400_BAD_REQUEST)

            # Check if user has access to the course
            if user_information.role == 'Instructor':
                instructor_id = Instructor.objects.get(user=request.user)
                course_access = UserCourse.objects.filter(
                                                        Q(id=course_section) &
                                                        Q(instructor=instructor_id)).exists()
                
                if course_access is False:
                    return Response(status=status.HTTP_401_UNAUTHORIZED)
                    
            elif user_information.role == 'Student':
                course_access = UserCourse.objects.filter(
                                                        Q(id=course_section) &
                                                        Q(user=user_information.user.id)).exists()

                if course_access is False:
                    return Response({'Has no Access'},status=status.HTTP_401_UNAUTHORIZED)

            if is_published=='true':
                is_published = True
            else:
                is_published = False

            course_section = UserCourse.objects.get(id=course_section)

            Notepad.objects.create(
                                    usercourse=course_section, 
                                    user=request.user,
                                    note=note,
                                    is_published=is_published)
            

            return Response({"message": "Create Successfuly"},status=status.HTTP_201_CREATED)
        else: 
            return Response({'Invalid Section'},status=status.HTTP_401_UNAUTHORIZED)

        # if UserCourse.objects.filter(id=course_section).exists():

        

        # serializer = OnlineMeetingSerializer(online_meeting)

        # return Response(serializer.data, status=status.HTTP_201_CREATED)
    

    def delete(self, request):
        usercourse_id = request.GET.get('usercourse_id', None)
        notepad_id = request.GET.get('notepad_id', None)
        user_information = UserInformation.objects.get(user=request.user)

        if not usercourse_id or not notepad_id:
            return Response({'detail': 'Missing parameters.'}, status=status.HTTP_400_BAD_REQUEST)

        # Validate course access
        if not UserCourse.objects.filter(id=usercourse_id).exists():
            return Response({'detail': 'Invalid course.'}, status=status.HTTP_400_BAD_REQUEST)

        if user_information.role == 'Instructor':
            instructor_id = Instructor.objects.get(user=request.user)
            course_access = UserCourse.objects.filter(
                Q(id=usercourse_id) & Q(instructor=instructor_id)
            ).exists()
            if not course_access:
                return Response({'detail': 'Unauthorized access.'}, status=status.HTTP_401_UNAUTHORIZED)

        elif user_information.role == 'Student':
            course_access = UserCourse.objects.filter(
                Q(id=usercourse_id) & Q(user=user_information.user.id)
            ).exists()
            if not course_access:
                return Response({'detail': 'Unauthorized access.'}, status=status.HTTP_401_UNAUTHORIZED)

        # Validate and delete the notepad
        try:
            notepad = Notepad.objects.get(id=notepad_id, usercourse_id=usercourse_id, user=request.user)
            notepad.delete()
            return Response({'detail': 'Notepad deleted successfully.'}, status=status.HTTP_200_OK)
        except Notepad.DoesNotExist:
            return Response({'detail': 'Notepad not found.'}, status=status.HTTP_404_NOT_FOUND)


    def put(self, request):
        note_id = request.data.get('note_id', None)
        usercourse_id = request.data.get('course_section', None)
        updated_note = request.data.get('note', None)
        user_information = UserInformation.objects.get(user=request.user)
        
        # Validate that the note exists
        if not Notepad.objects.filter(id=note_id).exists():
            return Response({'error': 'Note not found'}, status=status.HTTP_404_NOT_FOUND)

        # Fetch the note and verify it belongs to the user
        note = Notepad.objects.get(id=note_id)

        if note.user != request.user:
            return Response({'error': 'Permission denied'}, status=status.HTTP_403_FORBIDDEN)

        # Validate course access
        if UserCourse.objects.filter(id=usercourse_id).exists():
            if user_information.role == 'Instructor':
                instructor_id = Instructor.objects.get(user=request.user)
                course_access = UserCourse.objects.filter(
                    Q(id=usercourse_id) & Q(instructor=instructor_id)
                ).exists()
                if not course_access:
                    return Response({'error': 'Access denied'}, status=status.HTTP_401_UNAUTHORIZED)
            elif user_information.role == 'Student':
                course_access = UserCourse.objects.filter(
                    Q(id=usercourse_id) & Q(user=user_information.user.id)
                ).exists()
                if not course_access:
                    return Response({'error': 'Access denied'}, status=status.HTTP_401_UNAUTHORIZED)

            # Update the note
            if updated_note:
                note.note = updated_note
                note.save()
                return Response({'message': 'Note updated successfully'}, status=status.HTTP_200_OK)
            else:
                return Response({'error': 'No content provided'}, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response({'error': 'Invalid course section'}, status=status.HTTP_400_BAD_REQUEST)
