# pharmacies_app/models.py

from django.db import models


class Ville(models.Model):
    nomVille = models.CharField(max_length=100, unique=True)
    # Les champs suivants seront calculés et mis à jour automatiquement
    nombreTotalDePharmacies = models.IntegerField(default=0)
    nombreTotalDePharmaciesOuvertes = models.IntegerField(default=0)
    nombreTotalDePharmaciesDeGarde = models.IntegerField(default=0)

    class Meta:
        verbose_name = "Ville"
        verbose_name_plural = "Villes"
        ordering = ['nomVille']  # Trie les villes par défaut par nom

    def __str__(self):
        return self.nomVille

    def update_pharmacy_counts(self):
        # Cette méthode met à jour les compteurs de la ville
        self.nombreTotalDePharmacies = self.pharmacies.count()
        self.nombreTotalDePharmaciesOuvertes = self.pharmacies.filter(estOuvert=True).count()
        self.nombreTotalDePharmaciesDeGarde = self.pharmacies.filter(estDeGarde=True).count()
        self.save()


class Pharmacie(models.Model):
    nomPharmacie = models.CharField(max_length=200)
    adressePharmacie = models.CharField(max_length=255)
    villePharmacie = models.ForeignKey(Ville, related_name='pharmacies', on_delete=models.CASCADE)
    quartierPharmacie = models.CharField(max_length=100)
    codePostalPharmacie = models.CharField(max_length=10, blank=True, null=True)
    telephonePharmacie = models.CharField(max_length=20, blank=True, null=True)
    emailPharmacie = models.EmailField(max_length=100, blank=True, null=True)
    siteWebPharmacie = models.URLField(max_length=200, blank=True, null=True)
    estDeGarde = models.BooleanField(default=False)
    estOuvert = models.BooleanField(default=True)
    latitudePharmacie = models.DecimalField(max_digits=12, decimal_places=9)
    longitudePharmacie = models.DecimalField(max_digits=12, decimal_places=9)
    photoUrlPharmacie = models.URLField(max_length=500, blank=True, null=True)

    class Meta:
        verbose_name = "Pharmacie"
        verbose_name_plural = "Pharmacies"
        # Ajoutez un index sur la ville pour optimiser les requêtes
        indexes = [
            models.Index(fields=['villePharmacie']),
        ]
        ordering = ['nomPharmacie']  # Trie les pharmacies par défaut par nom

    def __str__(self):
        return f"{self.nomPharmacie} ({self.villePharmacie.nomVille})"

    # Surcharge de la méthode save pour mettre à jour les compteurs de la ville
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        # S'assure que la ville existe avant de tenter de la mettre à jour
        if self.villePharmacie:
            self.villePharmacie.update_pharmacy_counts()

    # Surcharge de la méthode delete pour mettre à jour les compteurs de la ville
    def delete(self, *args, **kwargs):
        ville = self.villePharmacie  # Récupère la ville avant la suppression
        super().delete(*args, **kwargs)
        if ville:
            ville.update_pharmacy_counts()
