import os
import sys
import django
from django.conf import settings
import random
from datetime import datetime
import secrets
from collections import Counter, defaultdict
#import qrcode


def generate_qrcode_partenaire(username, password):

    qrcode.make(f"https://tombola.24hdujeu.fr/tombola/login?username={username}&password={password}").save(f"qrcode_{username}.png")

def get_from_db(**kwargs):

    # Ajouter le répertoire parent au chemin de recherche des modules
    sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
    # Configuration dynamique des paramètres Django
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'tomboladb',
            'HOST': 'tombola.24hdujeu.fr',
            'PORT': 3306,
            'USER': 'fmr',
            'PASSWORD': 'fmr',
            'OPTIONS': {
                'sql_mode': 'traditional',
            }
        },
    }
    # Autres configurations nécessaires
    ALLOWED_HOSTS = ['*']

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'tombola',
        'corsheaders',
    ]

    # Initialisation des paramètres Django
    settings.configure(
        DATABASES=DATABASES,
        INSTALLED_APPS=INSTALLED_APPS,
        TIME_ZONE='UTC',
        USE_TZ=True,
    )

    # Initialiser Django
    django.setup()

    from django.db.models import Count, Min, Q
    from tombola.models import RaffleDraw,Passeport,Ticket
    tombola = RaffleDraw.objects.get(id=2)

    #create_tickets(tombola)
    #g_list = tirage( tombola )
    #print(g_list)
    #create_partner(tombola)
    #create_qrcode(tombola)

    #create_qrcode_partner(tombola)
    change_hours(tombola)

    #Ticket.objects.all().delete()

    ''' 
    passeports_24h_gagnants = list(
        Passeport.objects.annotate(ticket_count=Count('ticket', filter=Q(ticket__hour_range__isnull=False))).filter(
            ticket_count=24))

    for p in passeports_24h_gagnants:
        print(p.id)

    passeports_partenaires_gagnants = Passeport.objects.annotate(
        ticket_count=Count('ticket', filter=Q(ticket__partner__isnull=False)),
        first_ticket_hour=Min('ticket__hour', filter=Q(ticket__partner__isnull=False))
    ).filter(
        ticket_count__gt=0  # Optionnel, pour ne garder que ceux qui ont au moins 1 ticket valide
    ).order_by('-ticket_count', 'first_ticket_hour')

    for e in passeports_partenaires_gagnants:
        print(f"{e.id} : {e.ticket_count}")

    '''



def change_hours(tombola):
    from tombola.models import  HourRange
    from datetime import timedelta

    start = datetime.fromisoformat("2025-06-07T13:00:00+00:00")


    hour_ranges = list(HourRange.objects.filter(raffle=tombola))



    h = 1

    for e in hour_ranges:
        td_s = timedelta( hours = h)
        td_e = timedelta(hours=h , minutes = tombola.timestamp_raffle)

        e.start = start + td_s
        e.end = start + td_e
        e.save()
        h = h+1





def create_partner(tombola):
    from tombola.models import  User,Partenaire
    year = datetime.now().year
    for i in range(int(tombola.partners_number)):
        raw_password = secrets.token_urlsafe(8)
        user = User(username='partner' + str(i + 1) + '_' + str(year), is_partner=True, comment=raw_password,
                    is_active=True)
        user.set_password(raw_password)
        user.save()
        Partenaire(raffle=tombola, user=user).save()


    ########################################################
def create_qrcode(tombola):
    from tombola.models import Passeport
    import qrcode

    for passeport in Passeport.objects.filter(raffle=tombola):
        qrcode.make(passeport.unique_id).save(f"qrcode_{passeport.number}.png")

########################################################
def create_qrcode_partner(tombola):
    from tombola.models import Partenaire
    for p in Partenaire.objects.filter(raffle=tombola):
        generate_qrcode_partenaire( p.user.username , p.user.comment)



def create_tickets(tombola):
    ##################################################
    ##################################################
    ##################################################
    # CREATION TICKET ALEATOIRE
    from tombola.models import Passeport, HourRange, Ticket,Partenaire


    # Récupérer les objets nécessaires
    passeports = list(Passeport.objects.filter(raffle=tombola))
    hour_ranges = list(HourRange.objects.filter(raffle=tombola))
    partenaires = list(Partenaire.objects.filter(raffle=tombola))

    # Supprimer les tickets existants
    Ticket.objects.all().delete()

    tickets_a_creer = []

    # 1. Sélectionner des passeports "actifs" qui participeront à tous les créneaux horaires
    nombre_passeports_actifs = 100  # Ajustez ce nombre selon vos besoins
    passeports_actifs = random.sample(passeports, min(nombre_passeports_actifs, len(passeports)))

    # 2. Créer des tickets pour chaque créneau horaire pour ces passeports
    for hour_range in hour_ranges:
        for passeport in passeports_actifs:
            tickets_a_creer.append(Ticket(passeport=passeport, hour_range=hour_range))

    # 3. Générer des tickets aléatoires pour les autres passeports
    passeports_restants = [p for p in passeports if p not in passeports_actifs]
    for hour_range in hour_ranges:
        nombre_tirages = random.randint(500, 600)
        passeports_choisis = random.sample(passeports_restants, min(nombre_tirages, len(passeports_restants)))
        for passeport in passeports_choisis:
            tickets_a_creer.append(Ticket(passeport=passeport, hour_range=hour_range))

    # 4. Générer des tickets pour les partenaires
    for partenaire in partenaires:
        nombre_tirages = random.randint(500, 600)
        passeports_choisis = random.sample(passeports, min(nombre_tirages, len(passeports)))
        for passeport in passeports_choisis:
            tickets_a_creer.append(Ticket(passeport=passeport, partner=partenaire))

    # Insérer tous les tickets en une seule requête
    Ticket.objects.bulk_create(tickets_a_creer)

    ##################################################
    ##################################################
    ##################################################



















get_from_db()
