"""
Signals pour la traduction

1. Suppression automatique des traductions quand un objet traduisible est supprime
2. Regeneration automatique du dictionnaire.json quand les traductions changent
"""

from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.contrib.contenttypes.models import ContentType
from django.core.cache import cache

from .models import Dictionnaire, Language
from .registry import get_translatable_models


# ============================================================================
# Suppression en cascade des traductions
# ============================================================================

@receiver(post_delete)
def delete_translations_on_object_delete(sender, instance, **kwargs):
    """
    Supprime automatiquement les traductions quand un objet traduisible est supprime
    """
    # Verifier si le modele est traduisible
    translatable_models = get_translatable_models()
    model_key = f"{sender._meta.app_label}.{sender._meta.model_name}"

    if model_key in translatable_models:
        Dictionnaire.delete_translations_for_object(instance)


# ============================================================================
# Regeneration du dictionnaire JSON
# ============================================================================

REGENERATION_LOCK_KEY = 'traduction_regeneration_pending'


def schedule_regeneration():
    """
    Planifie une regeneration du dictionnaire.
    Utilise un cache lock pour eviter les regenerations multiples rapprochees.
    """
    # Verifier si une regeneration est deja en cours
    if cache.get(REGENERATION_LOCK_KEY):
        return

    # Marquer qu'une regeneration est en cours (expire apres 2 secondes)
    cache.set(REGENERATION_LOCK_KEY, True, 2)

    # Importer ici pour eviter les imports circulaires
    from .generators import regenerate_all

    try:
        regenerate_all()
    except Exception as e:
        # Log l'erreur mais ne pas bloquer l'operation
        import logging
        logger = logging.getLogger(__name__)
        logger.error(f"Erreur lors de la regeneration du dictionnaire: {e}")
    finally:
        cache.delete(REGENERATION_LOCK_KEY)


@receiver(post_save, sender=Dictionnaire)
def on_dictionnaire_save(sender, instance, created, **kwargs):
    """
    Regenere le dictionnaire quand une traduction est ajoutee ou modifiee.
    Auto-genere la traduction de excerpt pour NewsArticle depuis la traduction de content.
    """
    # Auto-generation de excerpt pour NewsArticle
    if instance.field == 'content' and instance.content_type.model == 'newsarticle':
        auto_generate_excerpt_translation(instance)

    schedule_regeneration()


def auto_generate_excerpt_translation(content_translation):
    """
    Genere automatiquement la traduction de excerpt depuis la traduction de content.
    Supprime les balises HTML et prend les 150 premiers caracteres.
    """
    from django.utils.html import strip_tags

    if not content_translation.translation:
        return

    # Supprime les balises HTML et prend les 150 premiers caracteres
    plain_text = strip_tags(content_translation.translation).strip()
    # Remplace les espaces multiples par un seul espace
    plain_text = ' '.join(plain_text.split())
    excerpt_text = plain_text[:150]

    if not excerpt_text:
        return

    # Eviter les boucles infinies en utilisant update_or_create directement
    # sans passer par set_translation qui declenche le signal
    existing = Dictionnaire.objects.filter(
        content_type=content_translation.content_type,
        object_id=content_translation.object_id,
        field='excerpt',
        language=content_translation.language
    ).first()

    if existing:
        if existing.translation != excerpt_text:
            # Mise a jour sans declencher le signal
            Dictionnaire.objects.filter(pk=existing.pk).update(translation=excerpt_text)
    else:
        # Creation directe sans signal
        Dictionnaire.objects.create(
            content_type=content_translation.content_type,
            object_id=content_translation.object_id,
            field='excerpt',
            language=content_translation.language,
            translation=excerpt_text
        )


@receiver(post_delete, sender=Dictionnaire)
def on_dictionnaire_delete(sender, instance, **kwargs):
    """Regenere le dictionnaire quand une traduction est supprimee"""
    schedule_regeneration()


@receiver(post_save, sender=Language)
def on_language_save(sender, instance, created, **kwargs):
    """Regenere le dictionnaire quand une langue est ajoutee ou modifiee"""
    schedule_regeneration()


@receiver(post_delete, sender=Language)
def on_language_delete(sender, instance, **kwargs):
    """Regenere le dictionnaire quand une langue est supprimee"""
    schedule_regeneration()
