"""
Event Schema Registry Models.

Stores and manages event schemas with versioning support.
"""
import uuid

from django.db import models
from django.utils.translation import gettext_lazy as _


class EventSchemaRegistry(models.Model):
    """
    Registry of event schemas with versioning.
    
    Each event type can have multiple schema versions.
    Supports backward compatibility checking and migration paths.
    """
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )
    event_type = models.CharField(
        max_length=255,
        verbose_name=_('نوع رویداد'),
        help_text=_('نام dot-notated (مثلاً plm.part.created)'),
    )
    version = models.CharField(
        max_length=50,
        verbose_name=_('نسخه'),
        help_text=_('نسخه semver (مثلاً 1.0.0)'),
    )
    schema = models.JSONField(
        verbose_name=_('اسکیما'),
        help_text=_('JSON Schema برای payload رویداد'),
    )
    description = models.TextField(
        blank=True,
        null=True,
        verbose_name=_('توضیحات'),
    )
    is_deprecated = models.BooleanField(
        default=False,
        verbose_name=_('منسوخ شده'),
    )
    deprecated_at = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name=_('تاریخ منسوخ شدن'),
    )
    sunset_date = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name=_('تاریخ حذف'),
        help_text=_('تاریخ پایان پشتیبانی از این نسخه'),
    )
    migration_notes = models.TextField(
        blank=True,
        null=True,
        verbose_name=_('راهنمای مهاجرت'),
        help_text=_('توضیحات تغییرات نسبت به نسخه قبلی'),
    )
    migration_script = models.TextField(
        blank=True,
        null=True,
        verbose_name=_('اسکریپت مهاجرت'),
        help_text=_('Python code for transforming from previous version'),
    )
    # Track who publishes and subscribes
    publisher_module = models.CharField(
        max_length=100,
        blank=True,
        null=True,
        verbose_name=_('ماژول منتشرکننده'),
    )
    subscriber_modules = models.JSONField(
        default=list,
        blank=True,
        verbose_name=_('ماژول‌های مشترک'),
    )
    # Example payload for documentation
    example_payload = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_('نمونه payload'),
    )
    created_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name=_('تاریخ ایجاد'),
    )
    updated_at = models.DateTimeField(
        auto_now=True,
        verbose_name=_('تاریخ بروزرسانی'),
    )

    class Meta:
        db_table = 'event_schema_registry'
        verbose_name = _('اسکیمای رویداد')
        verbose_name_plural = _('اسکیماهای رویداد')
        unique_together = ['event_type', 'version']
        ordering = ['event_type', '-version']
        indexes = [
            models.Index(fields=['event_type']),
            models.Index(fields=['is_deprecated']),
        ]

    def __str__(self):
        deprecated = ' (deprecated)' if self.is_deprecated else ''
        return f"{self.event_type} v{self.version}{deprecated}"
