from django.db import models
from django.core.validators import MinValueValidator
from django.db import models
from django.contrib.auth.hashers import make_password, check_password

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin

class Category(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name
class Event(models.Model):
    CATEGORY_CHOICES = [
        ('parapente', '🏞️ Parapente'),
        ('plongee', '🌊 Plongée'),
        ('randonnee', '🌄 Randonnée'),
        ('camping', '⛺ Camping'),
    ]

    title = models.CharField(max_length=255)
    description = models.TextField()
    date = models.DateField()  # 📅 Garde uniquement la date
    time = models.TimeField(null=True, blank=True)  # 🕒 Nouveau champ pour l'heure
    localisation = models.CharField(max_length=255)
    latitude = models.FloatField()  # Latitude de l'événement
    longitude = models.FloatField()  # Longitude de l'événement
    price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
    image = models.ImageField(upload_to='events/')
    category = models.CharField(max_length=50, choices=CATEGORY_CHOICES, default='parapente')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title  # Retourne le titre de l'événement


class VisitorUserManager(BaseUserManager):
    def create_user(self, email, username, password=None, **extra_fields):
        if not email:
            raise ValueError("Le champ email est obligatoire")
        email = self.normalize_email(email)
        user = self.model(email=email, username=username, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        return self.create_user(email, username, password, **extra_fields)

class VisitorUser(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(max_length=150, unique=True)
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=50, blank=True)  # Prénom
    last_name = models.CharField(max_length=50, blank=True)   # Nom
    phone_number = models.CharField(max_length=15, blank=True, null=True)  # Numéro de téléphone
    join_date = models.DateField(null=True, blank=True)  # Date 
    address = models.CharField(max_length=255, blank=True, null=True)  # Adresse
    bio = models.TextField(blank=True, null=True)  # Bio
    profile_picture = models.ImageField(upload_to='profile_pictures/', blank=True, null=True)  # Photo de profil
    city = models.CharField(max_length=100, blank=True, null=True)  # Ville
    created_at = models.DateTimeField(auto_now_add=True)

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    objects = VisitorUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    class Meta:
        app_label = 'gestion'

    def __str__(self):
        return self.username



class MessageContact(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()
    phone = models.CharField(max_length=15, blank=True)  # Le champ téléphone est optionnel
    message = models.TextField()

    def __str__(self):
        return f"Message de {self.name} ({self.email})"

class Page(models.Model):
    slug = models.SlugField(unique=True)
    title = models.CharField(max_length=255)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

class AboutSection(models.Model):
    title = models.CharField(max_length=100, default="À propos de nous")
    content = models.TextField()
    image = models.ImageField(upload_to='about/', blank=True, null=True)
    
    # Ajout des nouveaux champs
    why_description = models.TextField(blank=True, null=True, verbose_name="Description Pourquoi DeltaSkay")
    mission_description = models.TextField(blank=True, null=True, verbose_name="Description Notre Mission")
    services_description = models.TextField(blank=True, null=True, verbose_name="Description Nos Services")

    def __str__(self):
        return self.title
    
class Gallery(models.Model):
    file = models.ImageField(upload_to='gallery/')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


class Menu(models.Model):
    name = models.CharField(max_length=255)
    link = models.URLField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name


class Testimonial(models.Model):
    user = models.ForeignKey(VisitorUser, on_delete=models.CASCADE, related_name='testimonials')
    event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='testimonials')
    quote = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"Témoignage de {self.user.username} pour {self.event.title}"


class TestimonialImage(models.Model):
    testimonial = models.ForeignKey(Testimonial, related_name='images', on_delete=models.CASCADE)
    image = models.ImageField(upload_to='testimonials/')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Slider(models.Model):
    title = models.CharField(max_length=200, verbose_name="Titre du slide")
    description = models.TextField(blank=True, verbose_name="Description")
    image = models.ImageField(upload_to='slider/', verbose_name="Image du slide")
    video = models.FileField(upload_to='videos/', blank=True, null=True, verbose_name="Vidéo (optionnel)")
    order = models.PositiveIntegerField(default=0, verbose_name="Ordre d'affichage")

    class Meta:
        ordering = ['order']

    def __str__(self):
        return self.title
    
class Settings(models.Model):
    logo = models.ImageField(upload_to='logos/')
    facebook_url = models.URLField(max_length=200, blank=True)
    twitter_url = models.URLField(max_length=200, blank=True)
    instagram_url = models.URLField(max_length=200, blank=True)
    phone_number = models.CharField(max_length=20, blank=True)
    email = models.EmailField(max_length=100, blank=True)
    address = models.CharField(max_length=255, blank=True) 
    latitude = models.FloatField()  # Latitude de l'événement
    longitude = models.FloatField()  # Longitude de l'événement
    nav_home_text = models.CharField(max_length=100, default="Acceuil")
    nav_about_text = models.CharField(max_length=100, default="A propos de DELTA X")
    nav_events_text = models.CharField(max_length=100, default="Evenements")
    nav_contact_text = models.CharField(max_length=100, default="Contactez-nous")
    
    def __str__(self):
        return "Settings"
    
class Statistics(models.Model):
    clients_served = models.PositiveIntegerField(default=0, verbose_name="Clients servis")
    kilometers_traveled = models.PositiveIntegerField(default=0, verbose_name="Kilomètres parcourus")
    events_organized = models.PositiveIntegerField(default=0, verbose_name="Événements organisés")
    happy_clients = models.PositiveIntegerField(default=0, verbose_name="Clients satisfaits")

    def __str__(self):
        return "Statistiques générales"

class Partner(models.Model):
    name = models.CharField(max_length=255, verbose_name="Nom du partenaire")
    logo = models.ImageField(upload_to='partners/', verbose_name="Logo du partenaire")

    def __str__(self):
        return self.name

class Reservation(models.Model):
    event = models.ForeignKey('Event', on_delete=models.CASCADE)  # lien vers l'événement
    user = models.ForeignKey('VisitorUser', on_delete=models.CASCADE, related_name='reservations',default=1)  # Lien vers l'utilisateur
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    email = models.EmailField()
    phone_number = models.CharField(max_length=15)
    birth_date = models.DateField()
    passenger_count = models.PositiveIntegerField(validators=[MinValueValidator(1)])
    medical_info = models.TextField(blank=True, null=True)  # informations médicales
    reservation_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'Reservation de {self.first_name} {self.last_name} pour {self.event}'
 
class ProfileUser(models.Model):  # Renommé en ProfileUser pour être plus spécifique
    user = models.OneToOneField(VisitorUser, on_delete=models.CASCADE)  # Relie chaque profil à un utilisateur
    bio = models.TextField(blank=True, null=True)  # Bio de l'utilisateur
    profile_picture = models.ImageField(upload_to='profiles/', blank=True, null=True)  # Photo de profil
    address = models.CharField(max_length=255, blank=True, null=True)  # Adresse de l'utilisateur
    city = models.CharField(max_length=100, blank=True, null=True)  # Ville de l'utilisateur

    def __str__(self):
        return f"Profile de {self.user.username}"  # Affiche le profil en fonction du nom d'utilisateur

    