"""
Search Service Models.

Search index queue with retry mechanism and dead letter queue.
"""
import uuid

from django.db import models
from django.utils.translation import gettext_lazy as _

from apps.core.tenant.models import TenantAwareModel


class IndexOperation(models.TextChoices):
    """Search index operations."""
    INDEX = 'index', _('ایندکس')
    UPDATE = 'update', _('بروزرسانی')
    DELETE = 'delete', _('حذف')
    BULK_INDEX = 'bulk_index', _('ایندکس دسته‌ای')
    REINDEX = 'reindex', _('بازسازی ایندکس')


class QueueStatus(models.TextChoices):
    """Queue item status."""
    PENDING = 'pending', _('در انتظار')
    PROCESSING = 'processing', _('در حال پردازش')
    COMPLETED = 'completed', _('تکمیل شده')
    FAILED = 'failed', _('با خطا')
    DEAD_LETTER = 'dead_letter', _('نامه مرده')


class SearchIndexQueue(TenantAwareModel):
    """
    Async search indexing queue.
    
    Records entities that need to be indexed/updated/deleted in the
    search engine. Processed by a Celery worker with retry support.
    """
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )
    entity_type = models.CharField(
        max_length=100,
        verbose_name=_('نوع موجودیت'),
        help_text=_('نوع entity (مثلاً task, workflow, part)'),
        db_index=True,
    )
    entity_id = models.UUIDField(
        verbose_name=_('شناسه موجودیت'),
        db_index=True,
    )
    operation = models.CharField(
        max_length=20,
        choices=IndexOperation.choices,
        default=IndexOperation.INDEX,
        verbose_name=_('عملیات'),
    )
    payload = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_('داده'),
        help_text=_('داده‌های لازم برای ایندکس'),
    )
    retry_count = models.PositiveIntegerField(
        default=0,
        verbose_name=_('تعداد تلاش'),
    )
    max_retries = models.PositiveIntegerField(
        default=5,
        verbose_name=_('حداکثر تلاش'),
    )
    status = models.CharField(
        max_length=20,
        choices=QueueStatus.choices,
        default=QueueStatus.PENDING,
        verbose_name=_('وضعیت'),
        db_index=True,
    )
    priority = models.PositiveIntegerField(
        default=50,
        verbose_name=_('اولویت'),
        help_text=_('عدد بالاتر = اولویت بیشتر'),
    )
    error_message = models.TextField(
        blank=True,
        null=True,
        verbose_name=_('پیام خطا'),
    )
    created_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name=_('تاریخ ایجاد'),
        db_index=True,
    )
    processed_at = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name=_('تاریخ پردازش'),
    )
    next_retry_at = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name=_('زمان تلاش بعدی'),
    )

    class Meta:
        db_table = 'search_index_queue'
        verbose_name = _('صف ایندکس جستجو')
        verbose_name_plural = _('صف ایندکس جستجو')
        ordering = ['-priority', 'created_at']
        indexes = [
            models.Index(fields=['status', '-priority', 'created_at']),
            models.Index(fields=['entity_type', 'entity_id']),
            models.Index(fields=['next_retry_at']),
        ]

    def __str__(self):
        return f"{self.operation} {self.entity_type}:{self.entity_id}"


class SearchIndexDeadLetter(TenantAwareModel):
    """
    Dead Letter Queue for failed search index operations.
    
    After max retries, failed items are moved here for
    manual review and re-processing.
    """
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )
    entity_type = models.CharField(
        max_length=100,
        verbose_name=_('نوع موجودیت'),
        db_index=True,
    )
    entity_id = models.UUIDField(
        verbose_name=_('شناسه موجودیت'),
    )
    operation = models.CharField(
        max_length=20,
        choices=IndexOperation.choices,
        verbose_name=_('عملیات'),
    )
    payload = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_('داده'),
    )
    retry_count = models.PositiveIntegerField(
        default=0,
        verbose_name=_('تعداد تلاش‌های انجام شده'),
    )
    error_message = models.TextField(
        blank=True,
        null=True,
        verbose_name=_('پیام خطا'),
    )
    stack_trace = models.TextField(
        blank=True,
        null=True,
        verbose_name=_('Stack Trace'),
    )
    original_created_at = models.DateTimeField(
        verbose_name=_('تاریخ ایجاد اصلی'),
    )
    failed_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name=_('تاریخ شکست'),
    )
    resolved = models.BooleanField(
        default=False,
        verbose_name=_('حل شده'),
    )
    resolved_at = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name=_('تاریخ حل'),
    )

    class Meta:
        db_table = 'search_index_dead_letter'
        verbose_name = _('نامه مرده ایندکس')
        verbose_name_plural = _('نامه‌های مرده ایندکس')
        ordering = ['-failed_at']
        indexes = [
            models.Index(fields=['entity_type']),
            models.Index(fields=['resolved']),
            models.Index(fields=['failed_at']),
        ]

    def __str__(self):
        return f"DLQ: {self.operation} {self.entity_type}:{self.entity_id}"
