import json
import os
import subprocess
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from django.db.models import Q
from django.conf import settings
from django.http import HttpResponse

from core.models import (Course, UserInformation, VideoRecord, get_random_str, UserCourse, Instructor)
from videorecords.serializers import VideoRecordSerializer
from utils import add_course_activity


# Create your views here.

class VideoRecordList(APIView):
    permission_classes = [IsAuthenticated]

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

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

        if course_section == '':
            return Response(status=status.HTTP_400_BAD_REQUEST)

        # Check if the course exists and if user have 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(status=status.HTTP_401_UNAUTHORIZED)

        elif user_information.role == 'Admin':
            course_access = UserCourse.objects.filter(Q(id=course_section))

            if course_access is False:
                return Response(status=status.HTTP_404_NOT_FOUND)

        if course_access:
            course_section_data = UserCourse.objects.get(id=course_section)
            videos = VideoRecord.objects.filter(Q(usercourse=course_section_data)).order_by('created_at')
            serializer = VideoRecordSerializer(videos, many=True)

            return Response({'serializer': serializer.data, 'current_user_id': request.user.id,
                            'current_user_role': user_information.role}, status=status.HTTP_200_OK)


    def post(self, request):
        video_title = request.data.get('video_title', '')
        video = request.FILES.getlist('video')[0]
        course_section = request.data.get('course_section', '')

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

        if course_section == '' or video_title ==  '':
            return Response(status=status.HTTP_400_BAD_REQUEST)

        # Check if the course exists and if user have 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(status=status.HTTP_401_UNAUTHORIZED)
        elif user_information.role == 'Admin':

            course_access = UserCourse.objects.filter(Q(id=course_section))
            
            if course_access is False:
                return Response(status=status.HTTP_404_NOT_FOUND)

        if course_access:
            course_section_data = UserCourse.objects.get(id=course_section)
            video_record = VideoRecord.objects.create(title=video_title, user=request.user, usercourse=course_section_data, video=video)

            video_record_path = str(video_record.video)
            video_thumbnail_path = f'{video_record.usercourse.course.academic_session.title}/{video_record.usercourse.course.title}/recorded-video-files/{video_record.user.id}/thumbnails/{get_random_str()}.jpg'
            os.makedirs('./media/' + f'{video_record.usercourse.course.academic_session.title}/{video_record.usercourse.course.title}/recorded-video-files/{video_record.user.id}/thumbnails/', exist_ok=True)
            #please install ffmpeg zip file on local mechine 
            subprocess.call(['ffmpeg', '-i', './media/'+video_record_path, '-ss', '00:00:01.000', '-vframes', '1', './media/'+video_thumbnail_path])
            video_record.thumbnail = video_thumbnail_path
            video_record.save()

            add_course_activity(course_section, request.user.id, 'participation')

            return Response({"message": "Video Upload Successfuly"},status=status.HTTP_201_CREATED)


class VideoRecordDetails(APIView):
    permission_classes = [IsAuthenticated]

    def delete(self, request):
        course_id = request.data.get('course_id', '')
        video_id = request.data.get('video_id', '')

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

        if course_id == '' or video_id == '':
            return Response(status=status.HTTP_400_BAD_REQUEST)

        # Check if the course exists and if user have 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_id) &
                                                    Q(instructor=instructor_id)).exists()

            if course_access is False:
                return Response(status=status.HTTP_401_UNAUTHORIZED)
        elif user_information.role == 'Student':
            course = Course.objects.filter(
                                            Q(id=course_id) &
                                            Q(student__id=user_information.user.id))

            if course.exists() is False:
                return Response(status=status.HTTP_401_UNAUTHORIZED)
        elif user_information.role == 'Admin':
            course = Course.objects.filter(Q(id=course_id))

            if course.exists() is False:
                return Response(status=status.HTTP_404_NOT_FOUND)

        try:
            video = VideoRecord.objects.get(id=video_id)
        except:
            return Response(status=status.HTTP_404_NOT_FOUND)

        if user_information.role=='Student' and video.user.id!=user_information.user.id:
            return Response(status=status.HTTP_401_UNAUTHORIZED)

        video.delete()

        add_course_activity(course_id, request.user.id, 'participation')

        return Response({'message': 'Deleted'},status=status.HTTP_200_OK)


class DownloadVideoRecord(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        course_id = request.GET.get('course_id', '')
        video_id = request.GET.get('video_id', '')

        try:
            course_id = int(course_id)
            video_id = int(video_id)
            user_information = UserInformation.objects.get(Q(user=request.user))
        except Exception as e:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        # Check if the course exists and if user have 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_id) &
                                                    Q(instructor=instructor_id)).exists()

            if course_access is False:
                return Response(status=status.HTTP_401_UNAUTHORIZED)
        elif user_information.role == 'Student':
            course = Course.objects.filter(
                                            Q(id=course_id) &
                                            Q(student__id=user_information.user.id))

            if course.exists() is False:
                return Response(status=status.HTTP_401_UNAUTHORIZED)
        elif user_information.role == 'Admin':
            course = Course.objects.filter(Q(id=course_id))

            if course.exists() is False:
                return Response(status=status.HTTP_404_NOT_FOUND)

        try:
            video_record = VideoRecord.objects.get(id=video_id, course=course[0])
        except Exception as e:
            return Response(status=status.HTTP_404_NOT_FOUND)

        full_path = os.path.join(settings.MEDIA_ROOT, str(video_record.video))

        with open(full_path, 'rb') as f:
            response = HttpResponse(
                f.read(),
                headers={
                    'Content-Type': 'application/octet-stream',
                    'Content-Disposition': 'attachment'
                }
            )

            return response
