"""
=============================================================================
SIDEBAR APP - MODÈLES DE DONNÉES
=============================================================================
Gestion de la sidebar cyberpunk : identité, compétences, réseaux sociaux,
langues et centres d'intérêt.

Structure :
    - Identity (Singleton) : Informations personnelles principales
    - SocialLink : Liens vers les réseaux sociaux
    - SkillCategory : Organisation des compétences par catégories
    - Skill : Compétences techniques avec niveaux et descriptions
    - Language : Langues parlées avec niveaux de maîtrise
    - Interest : Centres d'intérêt avec icônes
=============================================================================
"""

from django.db import models
from django.core.exceptions import ValidationError
from mediautils.utils import upload_to_identity, upload_to_skills


# =============================================================================
# IDENTITÉ PRINCIPALE (SINGLETON)
# =============================================================================

class Identity(models.Model):
    """
    Modèle Singleton représentant l'identité principale du portfolio.
    
    Utilisé pour :
        - En-tête de la sidebar (nom, titre, photo)
        - Bio express
        - Informations de contact
        - Disponibilité
    
    Note : Une seule instance peut exister dans la base de données.
    """
    
    # -------------------------------------------------------------------------
    # EN-TÊTE SIDEBAR
    # -------------------------------------------------------------------------
    name = models.CharField(
        "Nom complet",
        max_length=100,
        default="MAHUTIN KENNY EVRA",
        help_text="Nom affiché en haut de la sidebar"
    )
    
    title = models.CharField(
        "Titre professionnel",
        max_length=100,
        default="Développeur Backend Django",
        help_text="Titre principal sous le nom"
    )
    
    subtitle = models.CharField(
        "Sous-titre",
        max_length=100,
        blank=True,
        help_text="Sous-titre optionnel (ex: Architecte Logiciel)"
    )
    
    photo = models.ImageField(
        "Photo de profil",
        upload_to=upload_to_identity,
        blank=True,
        help_text="Photo affichée dans l'avatar cyberpunk"
    )
    
    # -------------------------------------------------------------------------
    # BIOGRAPHIE
    # -------------------------------------------------------------------------
    bio_short = models.TextField(
        "Résumé express",
        max_length=500,
        help_text="Texte court affiché dans la section SYSTEM INFO"
    )
    
    # -------------------------------------------------------------------------
    # INFORMATIONS DE CONTACT
    # -------------------------------------------------------------------------
    email = models.EmailField(
        "Email public",
        default="houessoukenny205@gmail.com",
        help_text="Email affiché publiquement"
    )
    
    phone = models.CharField(
        "Téléphone",
        max_length=20,
        default="+229 50 80 99 76",
        help_text="Numéro de téléphone avec indicatif"
    )
    
    location = models.CharField(
        "Localisation",
        max_length=100,
        default="Cotonou / Parakou (Bénin)",
        help_text="Ville ou région de résidence"
    )
    
    # -------------------------------------------------------------------------
    # FICHIERS ET STATUT
    # -------------------------------------------------------------------------
    cv_file = models.FileField(
        "Fichier CV (PDF)",
        upload_to=upload_to_identity,
        blank=True,
        help_text="CV téléchargeable depuis la sidebar"
    )
    
    availability = models.CharField(
        "Disponibilité",
        max_length=50,
        default="Disponible pour missions",
        help_text="Statut de disponibilité (style cyberpunk)"
    )

    class Meta:
        verbose_name = "Identité & Sidebar"
        verbose_name_plural = "Identité & Sidebar"

    def save(self, *args, **kwargs):
        """
        Empêche la création de plusieurs instances (pattern Singleton).
        """
        if not self.pk and Identity.objects.exists():
            raise ValidationError(
                "Une seule fiche d'identité est autorisée. "
                "Modifiez l'instance existante au lieu d'en créer une nouvelle."
            )
        super().save(*args, **kwargs)

    def __str__(self):
        return self.name


# =============================================================================
# RÉSEAUX SOCIAUX
# =============================================================================

class SocialLink(models.Model):
    """
    Liens vers les réseaux sociaux (GitHub, LinkedIn, Twitter, etc.).
    
    Affichage :
        - Icônes cliquables dans la section NETWORK
        - Tooltips au survol avec le nom du réseau
    """
    
    name = models.CharField(
        "Nom du réseau",
        max_length=50,
        help_text="Ex: GitHub, LinkedIn, Twitter"
    )
    
    url = models.URLField(
        "URL du profil",
        help_text="Lien complet vers le profil"
    )
    
    icon_class = models.CharField(
        "Classe FontAwesome",
        max_length=50,
        help_text="Ex: fab fa-github, fab fa-linkedin"
    )
    
    order = models.PositiveIntegerField(
        "Ordre d'affichage",
        default=0,
        help_text="Ordre d'apparition dans la sidebar (0 = premier)"
    )

    class Meta:
        ordering = ['order']
        verbose_name = "Réseau Social"
        verbose_name_plural = "Réseaux Sociaux"

    def __str__(self):
        return self.name


# =============================================================================
# COMPÉTENCES
# =============================================================================

class SkillCategory(models.Model):
    """
    Catégories pour organiser les compétences.
    
    Exemples :
        - Backend
        - Frontend
        - Outils & DevOps
        - Base de données
    """
    
    name = models.CharField(
        "Nom de la catégorie",
        max_length=50,
        help_text="Ex: Backend, Frontend, DevOps"
    )
    
    order = models.PositiveIntegerField(
        "Ordre d'affichage",
        default=0,
        help_text="Ordre d'apparition dans la section TECH ARSENAL"
    )

    class Meta:
        ordering = ['order']
        verbose_name = "Catégorie de Compétence"
        verbose_name_plural = "Catégories de Compétences"

    def __str__(self):
        return self.name


class Skill(models.Model):
    """
    Compétence technique détaillée.
    
    Utilisée pour :
        - Icônes interactives dans la grille TECH ARSENAL
        - Tooltips au survol
        - Modales avec description et niveau au clic
    
    Affichage :
        - Icône FontAwesome OU image personnalisée
        - Tooltip cyberpunk avec le nom
        - Modale avec description complète et barre de niveau
    """
    
    # -------------------------------------------------------------------------
    # ORGANISATION
    # -------------------------------------------------------------------------
    category = models.ForeignKey(
        SkillCategory,
        on_delete=models.CASCADE,
        related_name='skills',
        verbose_name="Catégorie"
    )
    
    name = models.CharField(
        "Nom de la compétence",
        max_length=50,
        help_text="Ex: Python, Django, Docker"
    )
    
    # -------------------------------------------------------------------------
    # VISUEL
    # -------------------------------------------------------------------------
    icon_class = models.CharField(
        "Classe FontAwesome",
        max_length=50,
        blank=True,
        help_text="Ex: fab fa-python, fas fa-database"
    )
    
    icon_image = models.ImageField(
        "Image personnalisée",
        upload_to=upload_to_skills,
        blank=True,
        null=True,
        help_text="Utilisée à la place de l'icône FontAwesome si fournie"
    )
    
    # -------------------------------------------------------------------------
    # CONTENU
    # -------------------------------------------------------------------------
    level = models.PositiveIntegerField(
        "Niveau de maîtrise (%)",
        default=80,
        help_text="Pourcentage affiché dans la barre de progression (0-100)"
    )
    
    description = models.TextField(
        "Description détaillée",
        blank=True,
        help_text="Texte affiché dans la modale au clic sur l'icône"
    )
    
    # -------------------------------------------------------------------------
    # OPTIONS
    # -------------------------------------------------------------------------
    is_featured = models.BooleanField(
        "Mettre en avant ?",
        default=False,
        help_text="Afficher sur la page d'accueil en plus de la sidebar"
    )
    
    order = models.PositiveIntegerField(
        "Ordre dans la catégorie",
        default=0,
        help_text="Position dans la grille de la catégorie"
    )

    class Meta:
        ordering = ['category__order', 'order']
        verbose_name = "Compétence"
        verbose_name_plural = "Compétences"

    def __str__(self):
        return f"{self.name} ({self.category})"


# =============================================================================
# LANGUES
# =============================================================================

class Language(models.Model):
    """
    Langues parlées avec niveau de maîtrise.
    
    Affichage :
        - Badges dans la section LANGUAGES
        - Effet hover cyberpunk avec animation jitter
    """
    
    name = models.CharField(
        "Nom de la langue",
        max_length=50,
        help_text="Ex: Français, Anglais, Fon"
    )
    
    level = models.CharField(
        "Niveau de maîtrise",
        max_length=50,
        help_text="Ex: Natif, Courant, Technique, B2, C1"
    )
    
    icon_code = models.CharField(
        "Code drapeau",
        max_length=10,
        blank=True,
        help_text="Code ISO pour afficher un drapeau (ex: fr, gb, us)"
    )
    
    order = models.PositiveIntegerField(
        "Ordre d'affichage",
        default=0,
        help_text="Position dans la liste des langues"
    )

    class Meta:
        ordering = ['order']
        verbose_name = "Langue"
        verbose_name_plural = "Langues"

    def __str__(self):
        return f"{self.name} ({self.level})"


# =============================================================================
# CENTRES D'INTÉRÊT
# =============================================================================

class Interest(models.Model):
    """
    Centres d'intérêt personnels.
    
    Affichage :
        - Icônes avec tooltips dans une section dédiée (si activée)
        - Style similaire aux compétences mais thématique différente
    """
    
    name = models.CharField(
        "Nom de l'intérêt",
        max_length=50,
        help_text="Ex: Photographie, Gaming, Lecture"
    )
    
    icon_class = models.CharField(
        "Classe FontAwesome",
        max_length=50,
        help_text="Ex: fas fa-camera, fas fa-gamepad"
    )
    
    tooltip_text = models.CharField(
        "Texte du tooltip",
        max_length=150,
        blank=True,
        help_text="Description courte affichée au survol"
    )
    
    order = models.PositiveIntegerField(
        "Ordre d'affichage",
        default=0,
        help_text="Position dans la grille des centres d'intérêt"
    )

    class Meta:
        ordering = ['order']
        verbose_name = "Centre d'intérêt"
        verbose_name_plural = "Centres d'intérêt"

    def __str__(self):
        return self.name


# =============================================================================
# FIN DES MODÈLES
# =============================================================================