from django.db import models
from django.utils.text import slugify
from django.utils.html import strip_tags
from colorfield.fields import ColorField
from image_factory.models import Imageable
from config.models import Timestamped, Orderable
from django_ckeditor_5.fields import CKEditor5Field
from traduction.helpers import TranslatableMixin


class University(TranslatableMixin, Imageable, Timestamped, Orderable):
    """Universites partenaires du programme"""
    name = models.CharField('Nom', max_length=200)
    slug = models.SlugField('Slug', max_length=200, unique=True, blank=True)
    abbreviation = models.CharField('Abreviation', max_length=20, blank=True)
    country = models.ForeignKey(
        'config.country',
        on_delete=models.CASCADE,
        related_name='Pays',
        verbose_name='Pays de l\'Universite'
    )
    city = models.CharField('Ville', max_length=100)
    address = models.TextField('Adresse complete', blank=True)

    # Coordonnées géographiques pour la carte
    latitude = models.DecimalField('Latitude', max_digits=9, decimal_places=6, blank=True, null=True)
    longitude = models.DecimalField('Longitude', max_digits=9, decimal_places=6, blank=True, null=True)

    logo = models.ImageField('Logo', upload_to='universities/logos/', blank=True, null=True)
    #image = models.ImageField('Image', upload_to='universities/images/', blank=True, null=True)

    #description = models.TextField('Description')
    description = CKEditor5Field('Description', config_name='extends')
    short_description = models.CharField('Description courte', max_length=300, blank=True)

    website = models.URLField('Site web', blank=True)
    email = models.EmailField('Email', blank=True)
    phone = models.CharField('Telephone', max_length=30, blank=True)

    founded_year = models.PositiveIntegerField('Annee de fondation', blank=True, null=True)
    ranking_position = models.PositiveIntegerField('Classement mondial', blank=True, null=True)

    is_coordinator = models.BooleanField('Universite coordinatrice', default=False)
    is_active = models.BooleanField('Active', default=True)

    # Couleur pour le design
    color = ColorField('Couleur', default='#1e3a5f')

    class Meta:
        verbose_name = 'Universite'
        verbose_name_plural = 'Universites'
        ordering = ['order', 'name']

    def __str__(self):
        return self.get_translated('name') or self.name

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        # Auto-increment order pour les nouvelles universites
        self.save_order()

        # Generation automatique de la description courte
        if self.description:
            plain_text = strip_tags(self.description).strip()
            plain_text = ' '.join(plain_text.split())
            self.short_description = plain_text[:150]
        super().save(*args, **kwargs)


class UniversityDepartment(TranslatableMixin, models.Model):
    """Departements/Laboratoires par universite"""
    university = models.ForeignKey(
        University,
        on_delete=models.CASCADE,
        related_name='departments',
        verbose_name='Universite'
    )
    name = models.CharField('Nom du departement', max_length=200)
    description = models.TextField('Description', blank=True)
    specialization = models.CharField('Specialisation', max_length=200, blank=True)
    website = models.URLField('Site web', blank=True)

    class Meta:
        verbose_name = 'Departement'
        verbose_name_plural = 'Departements'
        ordering = ['university', 'name']

    def __str__(self):
        name = self.get_translated('name') or self.name
        return f"{name} - {self.university.abbreviation or self.university.name}"


class UniversityStatistic(models.Model):
    """Statistiques par universite"""
    university = models.ForeignKey(
        University,
        on_delete=models.CASCADE,
        related_name='statistics',
        verbose_name='Universite'
    )
    stat_type = models.ForeignKey(
        'config.StatType',
        on_delete=models.PROTECT,
        related_name='university_statistics',
        verbose_name='Type de statistique'
    )
    value = models.PositiveIntegerField('Valeur')
    year = models.PositiveIntegerField('Annee', blank=True, null=True)

    class Meta:
        verbose_name = 'Statistique universite'
        verbose_name_plural = 'Statistiques universites'
        unique_together = ['university', 'stat_type', 'year']

    def __str__(self):
        uni_name = self.university.abbreviation or self.university.name
        stat_name = self.stat_type.name if self.stat_type else 'N/A'
        return f"{uni_name} - {stat_name}: {self.value}"


class IndustrialPartner(TranslatableMixin, Orderable):
    """Partenaires industriels des universites"""
    name = models.CharField('Nom', max_length=200)
    logo = models.ImageField('Logo', upload_to='partners/industrial/', blank=True, null=True)
    website = models.URLField('Site web', blank=True)
    description = models.TextField('Description', blank=True)
    universities = models.ManyToManyField(
        University,
        related_name='industrial_partners',
        verbose_name='Universites partenaires',
        blank=True
    )
    is_active = models.BooleanField('Actif', default=True)

    class Meta:
        verbose_name = 'Partenaire industriel'
        verbose_name_plural = 'Partenaires industriels'
        ordering = ['order', 'name']

    def save(self, *args, **kwargs):
        self.save_order()
        super().save(*args, **kwargs)

    def __str__(self):
        return self.get_translated('name') or self.name
