from django.utils import timezone
from django.utils.timezone import now, timedelta
from django.db.models import Sum, Count
from django.db.models.functions import TruncDate
from django.http import JsonResponse
from django.views.generic import ListView
from .models import Home
from ..analyticData.management.commands.get_location_info import get_location_from_ip
from ..analyticData.models import *
from ..blog.models import Blog
from ..config.models import MailList
from ..contactUs.models import ContactUs
from ..course.models import Course
from ..testimonial.models import Testimonial


# Create your views here.
class HomeView(ListView):
    model = Home
    template_name = "backend/home/index.html"

    def get_last_5_minutes_data(self):
        five_minutes_ago = timezone.now() - timezone.timedelta(minutes=5)
        users_last_5_minutes = IPAnalytic.objects.filter(last_hit_at__gte=five_minutes_ago)
        minute_counts = []
        for i in range(5):
            start_time = five_minutes_ago + timezone.timedelta(minutes=i)
            end_time = five_minutes_ago + timezone.timedelta(minutes=i + 1)
            count = users_last_5_minutes.filter(last_hit_at__gte=start_time, last_hit_at__lt=end_time).count()
            minute_counts.append(count)

        return minute_counts

    def get_context_data(self, **kwargs):
        # calling ip location
        # get_location_from_ip()

        context = super().get_context_data(**kwargs)
        context['object_list'] = {}
        context['totalCourses'] = Course.objects.count()
        context['totalBlogs'] = Blog.objects.count()
        context['totalContactUs'] = ContactUs.objects.count()
        context['totalMails'] = MailList.objects.count()
        context['totalTestimonials'] = Testimonial.objects.count()

        context['mails'] = MailList.objects.all().order_by('-id')[:21]
        context['contactUs'] = ContactUs.objects.all().order_by('-id')[:21]
        context['mostUsedDevices'] = DeviceAnalytic.objects.all().order_by('-hits')
        context['activeUsers'] = self.get_last_5_minutes_data()
        unique_cities = IPAnalytic.objects \
            .exclude(city__isnull=True) \
            .exclude(city__exact='') \
            .values('city') \
            .annotate(hits_count=Sum('hits')) \
            .order_by('-hits_count')
        context['uniqueCities'] = list(unique_cities)
        context['mostUsedApis'] = IPAnalytic.objects \
            .values('api') \
            .annotate(total_hits=Sum('hits')) \
            .order_by('-total_hits')

        ten_days_ago = now() - timedelta(days=15)
        records = IPAnalytic.objects.filter(created_at__gte=ten_days_ago).annotate(date=TruncDate('created_at')).values(
            'date').annotate(
            total_hits=Sum('hits'))

        context['apiHitsRecordsLabels'] = [record['date'].strftime('%Y-%m-%d') for record in records]
        context['apiHitsRecordsValues'] = [record['total_hits'] for record in records]
        context['totalTraffic'] = IPAnalytic.objects.aggregate(total_hits=Sum('hits'))['total_hits'] or 0

        return context


def get_active_user(request):
    five_minutes_ago = timezone.now() - timezone.timedelta(minutes=5)
    users_last_5_minutes = IPAnalytic.objects.filter(last_hit_at__gte=five_minutes_ago)
    minute_counts = []
    for i in range(5):
        start_time = five_minutes_ago + timezone.timedelta(minutes=i)
        end_time = five_minutes_ago + timezone.timedelta(minutes=i + 1)
        count = users_last_5_minutes.filter(last_hit_at__gte=start_time, last_hit_at__lt=end_time).count()
        minute_counts.append(count)

    return JsonResponse(minute_counts, safe=False)


def ratelimit_exceeded_view(request, exception=None):
    return JsonResponse({'status': False, 'message': 'Rate limit exceeded. Please try again later.'}, status=429)
