from django.db import models
from django.utils.text import slugify
from django.urls import reverse
from sidebar.models import Skill
from mediautils.utils import upload_to_projects, upload_to_project_gallery

class ProjectCategory(models.Model):
    """Catégorie de projet (ex: SaaS, E-commerce, Mobile)"""
    name = models.CharField("Nom", max_length=50)
    slug = models.SlugField(unique=True, blank=True)
    order = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['order', 'name']
        verbose_name = "Catégorie Projet"
        verbose_name_plural = "Catégories Projets"

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.name


class Project(models.Model):
    """
    Fiche Projet complète.
    Intègre la vidéo de survol, la stack technique et les liens.
    """
    title = models.CharField("Titre du projet", max_length=100)
    slug = models.SlugField(unique=True, blank=True)
    category = models.ForeignKey(ProjectCategory, on_delete=models.SET_NULL, null=True, related_name='projects')
    
    # Contenu textuel
    summary = models.CharField("Résumé court (Carte)", max_length=250, help_text="Affiché sur la grille")
    description = models.TextField("Description complète", help_text="Supporte le HTML simple ou texte brut")
    results = models.TextField("Résultats / Points clés", blank=True, help_text="Gains client, perfs, etc.")
    
    # Médias Principaux
    cover_image = models.ImageField("Image de couverture", upload_to=upload_to_projects)
    video_preview = models.FileField("Vidéo Preview (Hover)", upload_to=upload_to_projects, blank=True, null=True, help_text="Vidéo courte jouée au survol de la carte")
    
    # Liens
    external_url = models.URLField("Lien Démo / Site", blank=True)
    repo_url = models.URLField("Lien GitHub / GitLab", blank=True)
    
    # Stack Technique (Lien avec l'app Sidebar)
    skills = models.ManyToManyField(Skill, related_name='projects', blank=True, verbose_name="Technologies utilisées")
    
    # Meta
    date = models.DateField("Date de réalisation")
    is_featured = models.BooleanField("Mettre à la Une (Accueil)", default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    order = models.PositiveIntegerField("Ordre d'affichage", default=0)

    class Meta:
        ordering = ['order', '-date']
        verbose_name = "Projet"

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('projects:detail', kwargs={'slug': self.slug})

    def __str__(self):
        return self.title


class ProjectImage(models.Model):
    """Galerie d'images secondaires pour la page détail"""
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='gallery')
    image = models.ImageField(upload_to=upload_to_project_gallery)
    caption = models.CharField("Légende", max_length=100, blank=True)
    order = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['order']
        verbose_name = "Image Galerie"
        verbose_name_plural = "Images Galerie"