from datetime import timedelta, datetime
from django.utils import timezone
from django.http import JsonResponse
from django.utils.timezone import localtime, make_aware
from django.views.decorators.http import require_GET
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required, user_passes_test

from tombola.models import HourRange, RaffleDraw
from tombola.serializers import HourRangeSerializer


@login_required
@user_passes_test(lambda u: u.is_badge)
@require_GET
def badge_space(request):
    raffle = RaffleDraw.objects.get(is_active=True)
    context = {'hour_ranges': HourRangeSerializer(HourRange.objects.filter(raffle=raffle).order_by('id'), many=True).data}

    return render(request, 'badge_space/badge_space.html', context=context)


@login_required
@user_passes_test(lambda u: u.is_badge)
@require_GET
def hour_range_info(request):
    now = timezone.now()

    # 1. Est-on dans un créneau actif ?
    active_qs = HourRange.objects.filter(
        raffle=RaffleDraw.objects.get(is_active=True),
        start__lte=now,
        end__gt=now
    )
    hour_range_active = active_qs.exists()

    # 2. Calcul du prochain début de créneau
    next_qs = HourRange.objects.filter(
        raffle=RaffleDraw.objects.get(is_active=True),
        start__gt=now,
    ).order_by('start')

    if next_qs.exists():
        next_start = next_qs.first().start
    else:
        # On a passé le dernier créneau
        next_start = None

    # Si créneau actif, on envoie le timer jusqu'à la fin du créneau
    if hour_range_active:
        current = active_qs.first()
        current_end = current.end
    else:
        current_end = None

    data = {
        "hour_range_active": hour_range_active,
        "now":         now.isoformat(),
        "next_start":  next_start.isoformat() if next_start else None,
        "current_end": current_end.isoformat() if current_end else None,
    }
    return JsonResponse(data)