from django.db import models
from colorfield.fields import ColorField
from traduction.helpers import TranslatableMixin
from config.models import Orderable


class SiteConfiguration(TranslatableMixin, models.Model):
    """Configuration globale du site - singleton"""
    site_name = models.CharField('Nom du site', max_length=100, default='EUROMA')
    tagline = models.CharField('Slogan', max_length=200, blank=True)
    phone = models.CharField('Telephone', max_length=20, default='+33 1 42 34 56 78')
    email = models.EmailField('Email', default='contact@greentechmobility.org')
    address = models.TextField('Adresse', blank=True)

    # Reseaux sociaux
    facebook_url = models.URLField('Facebook', blank=True)
    twitter_url = models.URLField('Twitter/X', blank=True)
    linkedin_url = models.URLField('LinkedIn', blank=True)
    youtube_url = models.URLField('YouTube', blank=True)

    # SEO
    meta_description = models.TextField('Meta description', blank=True)
    meta_keywords = models.CharField('Meta keywords', max_length=255, blank=True)

    class Meta:
        verbose_name = 'Configuration du site'
        verbose_name_plural = 'Configuration du site'

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

    def save(self, *args, **kwargs):
        # Assure qu'il n'y a qu'une seule configuration
        self.pk = 1
        super().save(*args, **kwargs)

    @classmethod
    def get_config(cls):
        config, _ = cls.objects.get_or_create(pk=1)
        return config


class Partner(TranslatableMixin, models.Model):
    """Partenaires principaux (Union Europeenne, etc.)"""
    name = models.CharField('Nom', max_length=100)
    logo = models.ImageField('Logo', upload_to='partners/', blank=True, null=True)
    website = models.URLField('Site web', blank=True)
    description = models.TextField('Description', blank=True)
    city = models.CharField('Ville', max_length=100, blank=True)
    country = models.ForeignKey(
        'config.Country',
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name='Pays'
    )
    latitude = models.DecimalField(
        'Latitude',
        max_digits=9,
        decimal_places=6,
        null=True,
        blank=True
    )
    longitude = models.DecimalField(
        'Longitude',
        max_digits=9,
        decimal_places=6,
        null=True,
        blank=True
    )
    is_main_partner = models.BooleanField('Partenaire principal', default=False)
    order = models.PositiveIntegerField('Ordre', default=0)
    is_active = models.BooleanField('Actif', default=True)

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

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


class CarouselSlide(TranslatableMixin, Orderable):
    """Slides du carousel de la page d'accueil"""
    title = models.CharField('Titre', max_length=200)
    subtitle = models.CharField('Sous-titre', max_length=300, blank=True)
    description = models.TextField('Description', blank=True)
    image = models.ImageField('Image de fond', upload_to='carousel/')
    is_active = models.BooleanField('Actif', default=True)

    class Meta:
        verbose_name = 'Slide carousel'
        verbose_name_plural = 'Slides carousel'
        ordering = ['order']

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

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

    def get_active_buttons(self):
        """Retourne les boutons actifs du slide"""
        from cms.models import ButtonAssignment
        return ButtonAssignment.get_buttons_for_object(self, active_only=True)


class ProgramStatistic(TranslatableMixin, models.Model):
    """Statistiques affichees sur le site (6 universites, 150+ etudiants...)"""
    label = models.CharField('Label', max_length=100)
    value = models.CharField('Valeur', max_length=50)
    icon = models.CharField('Icone (classe CSS ou SVG)', max_length=100, blank=True)
    description = models.CharField('Description courte', max_length=200, blank=True)
    order = models.PositiveIntegerField('Ordre', default=0)
    is_active = models.BooleanField('Actif', default=True)

    class Meta:
        verbose_name = 'Statistique'
        verbose_name_plural = 'Statistiques'
        ordering = ['order']

    def __str__(self):
        return f"{self.value} {self.get_translated('label') or self.label}"


class SocialMediaLink(models.Model):
    """Liens vers les reseaux sociaux"""
    PLATFORM_CHOICES = [
        ('facebook', 'Facebook'),
        ('twitter', 'Twitter/X'),
        ('linkedin', 'LinkedIn'),
        ('youtube', 'YouTube'),
        ('instagram', 'Instagram'),
        ('github', 'GitHub'),
    ]

    platform = models.CharField('Plateforme', max_length=20, choices=PLATFORM_CHOICES)
    url = models.URLField('URL')
    is_active = models.BooleanField('Actif', default=True)
    order = models.PositiveIntegerField('Ordre', default=0)

    class Meta:
        verbose_name = 'Lien reseau social'
        verbose_name_plural = 'Liens reseaux sociaux'
        ordering = ['order']

    def __str__(self):
        return self.get_platform_display()


class UniversityMapSettings(TranslatableMixin, models.Model):
    """Configuration de la carte interactive des universités - singleton"""
    MAP_STYLES = [
        ('default', 'OpenStreetMap (défaut)'),
        ('light', 'CartoDB Positron (clair)'),
        ('dark', 'CartoDB Dark Matter (sombre)'),
        ('satellite', 'Esri Satellite'),
    ]

    title = models.CharField('Titre de la section', max_length=200, default='Nos Universités Partenaires')
    subtitle = models.TextField('Sous-titre', blank=True, default='Découvrez notre réseau d\'universités à travers l\'Europe et le monde')

    # Configuration de la carte
    map_style = models.CharField('Style de carte', max_length=20, choices=MAP_STYLES, default='default')
    default_zoom = models.PositiveIntegerField('Zoom par défaut', default=4)
    center_latitude = models.DecimalField('Latitude du centre', max_digits=9, decimal_places=6, default=48.8566)
    center_longitude = models.DecimalField('Longitude du centre', max_digits=9, decimal_places=6, default=2.3522)
    map_height = models.PositiveIntegerField('Hauteur de la carte (px)', default=500)

    # Couleurs des marqueurs
    marker_color = ColorField('Couleur des marqueurs', default='#1e3a5f')
    coordinator_marker_color = ColorField('Couleur marqueur coordinateur', default='#f59e0b')

    # Affichage
    show_on_home = models.BooleanField('Afficher sur la page d\'accueil', default=True)
    show_on_universities_page = models.BooleanField('Afficher sur la page universités', default=True)
    is_active = models.BooleanField('Carte active', default=True)

    class Meta:
        verbose_name = 'Configuration carte universités'
        verbose_name_plural = 'Configuration carte universités'

    def __str__(self):
        return "Configuration de la carte des universités"

    def save(self, *args, **kwargs):
        # Singleton - assure qu'il n'y a qu'une seule configuration
        self.pk = 1
        super().save(*args, **kwargs)

    @classmethod
    def get_settings(cls):
        settings, _ = cls.objects.get_or_create(pk=1)
        return settings

    def get_tile_url(self):
        """Retourne l'URL des tuiles selon le style choisi"""
        tiles = {
            'default': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
            'light': 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png',
            'dark': 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',
            'satellite': 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
        }
        return tiles.get(self.map_style, tiles['default'])

    def get_attribution(self):
        """Retourne l'attribution selon le style"""
        attributions = {
            'default': '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',
            'light': '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> &copy; <a href="https://carto.com/attributions">CARTO</a>',
            'dark': '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> &copy; <a href="https://carto.com/attributions">CARTO</a>',
            'satellite': '&copy; Esri',
        }
        return attributions.get(self.map_style, attributions['default'])
