from django.shortcuts import redirect, render, get_object_or_404, HttpResponse
from django.contrib import messages
from app.models import Categories, Course, Level, video, UserCourse, Review
from django.template.loader import render_to_string
from django.http import JsonResponse
from django.db.models import Sum, Avg
from app.auth import subscription_required
from .forms import ReviewForm
from django_ratelimit.exceptions import Ratelimited
from django.http import HttpResponseForbidden

def BASE(request):
    return render(request, 'base.html')

def HOME(request):
    category = Categories.objects.all().order_by('id')[0:6]
    course = Course.objects.filter(status = 'PUBLISH').order_by('-id')
    

    context = {
        'category': category,
        'course': course,
    }
    
    return render(request, 'Main/home.html', context)


def SINGLE_COURSE(request):
    category = Categories.get_all_category(Categories)
    level = Level.objects.all()
    course = Course.objects.all()
    FreeCourse_count = Course.objects.filter(price = 0).count()
    PaidCourse_count = Course.objects.filter(price__gte = 1).count()


    context = {
        'category': category,
        'level' : level,
        'course': course,
        'FreeCourse_count': FreeCourse_count,
        'PaidCourse_count': PaidCourse_count,

    }
    return render(request, 'Main/single_course.html', context)


def filter_data(request):
    category = request.GET.getlist('category[]')
    level = request.GET.getlist('level[]')
    price = request.GET.getlist('price[]')

    if price == ['PriceFree']:
        course = Course.objects.filter(price=0)
    elif price == ['PricePaid']:
        course = Course.objects.filter(price__gte=1)
    elif price == ['PriceAll']:
        course = Course.objects.all()
    elif category:
        course = Course.objects.filter(category__id__in = category).order_by('-id')
    elif level:
        course = Course.objects.filter(level__id__in = level).order_by('-id')
    else:
        course = Course.objects.all().order_by('-id')
    
    context = {
        'course': course,
    }
    t = render_to_string('ajax/course.html', context)
    return JsonResponse({'data': t})


def CONTACT_US(request):
    category = Categories.get_all_category(Categories)

    context = {
        'category': category,
    }
    return render(request, 'Main/contact_us.html', context)

def ABOUT_US(request):
    category = Categories.get_all_category(Categories)

    context = {
        'category': category,
    }
    return render(request, 'Main/about_us.html', context)


def SEARCH_COURSE(request):
    category = Categories.get_all_category(Categories)

    query = request.GET['query']
    course = Course.objects.filter(title__icontains= query)

    context = {
        'course': course,
        'category': category,
    }
    return render(request, 'search/search.html', context)

@subscription_required
def COURSE_DETAILS(request, slug):
    category = Categories.get_all_category(Categories)
    time_duration = video.objects.filter(course__slug=slug).aggregate(sum=Sum('time_duration'))

    course = get_object_or_404(Course, slug=slug)
    
    try:
        check_enroll = UserCourse.objects.get(user=request.user, course=course)
    except UserCourse.DoesNotExist:
        check_enroll = None

    if request.method == 'POST':
        form = ReviewForm(request.POST)
        if form.is_valid():
            review = form.save(commit=False)
            review.user = request.user
            review.course = course
            review.save()
            return redirect('course_details', slug=course.slug)
    else:
        form = ReviewForm()

    reviews = Review.objects.filter(course=course)
    average_rating = reviews.aggregate(Avg('rating'))['rating__avg'] or 0
    ratings_count = reviews.count()
    ratings_breakdown = {
        '5': reviews.filter(rating=5).count(),
        '4': reviews.filter(rating=4).count(),
        '3': reviews.filter(rating=3).count(),
        '2': reviews.filter(rating=2).count(),
        '1': reviews.filter(rating=1).count(),
    }

    ratings_percentage = {k: (v / ratings_count) * 100 if ratings_count > 0 else 0 for k, v in ratings_breakdown.items()}
    average_rating_percentage = (average_rating / 5.0) * 100 if average_rating > 0 else 0

    context = {
        'course': course,
        'category': category,
        'time_duration': time_duration,
        'check_enroll': check_enroll,
        'form': form,
        'reviews': reviews,
        'average_rating': average_rating,
        'ratings_count': ratings_count,
        'ratings_percentage': ratings_percentage,
        'average_rating_percentage': average_rating_percentage,
    }
    return render(request, 'course/course_details.html', context)


def view_404(request, *args, **kwargs):
    return render(request, 'error/404.html', status=404)

def handler_403(request, exception=None):
    if isinstance(exception, Ratelimited):
        return HttpResponse('Sorry too many requests, please wait', status=429)
    return HttpResponseForbidden('Forbidden')

def PAGE_NOT_FOUND(request):
    category = Categories.get_all_category(Categories)

    context = {
        'category': category,
    }
    return render(request, 'error/404.html', context)


def CHECKOUT(request, slug):
    course = Course.objects.get(slug = slug)
    
    if course.price == 0:
        course = UserCourse(
            user = request.user,
            course = course,
        )
        course.save()
        messages.success(request, 'Congratulation!! You have successfully enrolled in this course')
        return redirect('my_course')
    return render(request, 'checkout/checkout.html')


def MY_COURSE(request):
    course = UserCourse.objects.filter(user = request.user)

    context = {
        'course': course,
    }
    return render(request, 'course/my-course.html', context)