from calendar import monthrange
from datetime import datetime
from dateutil.relativedelta import relativedelta
from django.db import models
from django.urls import reverse

from REUNION import settings
from tinymce.models import HTMLField


class ZoneReunion(models.Model):
    nom_zone = models.CharField(max_length=100, null=False, blank=False)

    def __str__(self):
        return self.nom_zone


class Reunion(models.Model):
    class TYPE_REUNION(models.TextChoices):
        ReunionCercle = 'ReunionCercle', 'Reunion Cercle',
        DialogueCommunautaire = 'DialogueCommunautaire', 'Dialogue Communautaire',
        ReunionCoordination = 'ReunionCoordination', 'Reunion de Coordination'

    class STATUT_CHOICES(models.TextChoices):
        ENCOURS = 'En cours', 'En cours',
        TERMINE = 'Termné', 'Termné',

    type_reunion = models.CharField(max_length=255, choices=TYPE_REUNION.choices, default=TYPE_REUNION.ReunionCercle)
    titre_reunion = models.CharField(max_length=255, null=True)
    date = models.DateField(auto_now_add=True)
    duree = models.PositiveIntegerField()
    lieu = models.ForeignKey(ZoneReunion, on_delete=models.CASCADE, null=True)
    theme = models.CharField(max_length=255)
    modérateur = models.CharField(max_length=255)
    regulateurs = models.TextField(blank=True)  # Liste des régulateurs
    resume_executif = HTMLField(null=True, blank=True)
    budget = models.DecimalField(max_digits=10, decimal_places=2)
    statut = models.CharField(max_length=20, choices=STATUT_CHOICES, default=STATUT_CHOICES.ENCOURS)
    temps_arrivee = models.DurationField(null=True)
    nombre_prises_parole = models.PositiveIntegerField(default=0)
    heurefin = models.DateTimeField(auto_now=True, null=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, null=True,
                                   verbose_name='Créé par')

    def __str__(self):
        return f"{self.type_reunion} - {self.theme}"

    def get_absolute_url(self):
        return reverse('reunion:detail_reunion', args=[self.id])

    class Meta:
        ordering = ['-date']
        indexes = [
            models.Index(fields=['-date','type_reunion']),
        ]


class Participant(models.Model):
    SEXE_CHOICES = [
        ('H', 'Homme'),
        ('F', 'Femme'),
    ]
    reunion = models.ForeignKey(Reunion, on_delete=models.CASCADE, related_name="participants")
    prenom = models.CharField(max_length=255, null=True)
    nom = models.CharField(max_length=255, null=True)
    sexe = models.CharField(max_length=1, choices=SEXE_CHOICES)
    age = models.PositiveIntegerField()
    provenance = models.CharField(max_length=255)
    activite = models.CharField(max_length=255)


class PlanificationMensuel(models.Model):
    mois = models.CharField(max_length=7)  # Stocke 'YYYY-MM' (ex: '2025-03')
    zone = models.ForeignKey(ZoneReunion, on_delete=models.CASCADE, related_name="planifications")
    objectif_reunions = models.PositiveIntegerField()  # Nombre de réunions planifiées

    def reunions_realisees(self):
        """ Retourne le nombre de réunions réalisées pour cette zone et ce mois. """
        annee, mois = map(int, self.mois.split('-'))  # Convertit "YYYY-MM" en (année, mois)
        debut_mois = datetime(annee, mois, 1).date()
        fin_mois = datetime(annee, mois, monthrange(annee, mois)[1]).date()
        return Reunion.objects.filter(lieu=self.zone, date__range=[debut_mois, fin_mois]).count()

    def objectif_atteint(self):
        """ Vérifie si l'objectif est atteint """
        return self.reunions_realisees() >= self.objectif_reunions

    def __str__(self):
        return f"Planification {self.mois} - {self.zone.nom_zone} : {self.objectif_reunions} réunions"
