"""
Worktable CQRS Models.

Denormalized read models and archive models for worktable performance.
The write model remains the existing TableRecord.
"""
import uuid

from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _

from apps.core.tenant.models import TenantAwareModel


class TaskInboxView(TenantAwareModel):
    """
    Denormalized read model for fast task/record queries.
    
    This is a materialized view that combines data from:
    - TableRecord (write model)
    - TableDefinition
    - TableColumn (for display values)
    - User/Role assignments
    
    Kept in sync via event handlers (eventual consistency).
    """
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )
    # Source record reference
    record_id = models.UUIDField(
        verbose_name=_('شناسه رکورد'),
        db_index=True,
    )
    # Denormalized display fields
    title = models.CharField(
        max_length=500,
        verbose_name=_('عنوان'),
        db_index=True,
    )
    description = models.TextField(
        blank=True,
        null=True,
        verbose_name=_('توضیحات'),
    )
    # Table info
    table_id = models.UUIDField(
        verbose_name=_('شناسه جدول'),
        db_index=True,
    )
    table_name = models.CharField(
        max_length=255,
        verbose_name=_('نام جدول'),
    )
    table_slug = models.SlugField(
        max_length=100,
        verbose_name=_('شناسه جدول'),
    )
    # Assignment
    assigned_to_id = models.UUIDField(
        null=True,
        blank=True,
        verbose_name=_('شناسه مسئول'),
        db_index=True,
    )
    assigned_to_name = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name=_('نام مسئول'),
    )
    assigned_to_type = models.CharField(
        max_length=20,
        blank=True,
        null=True,
        choices=[
            ('user', _('کاربر')),
            ('role', _('نقش')),
            ('group', _('گروه')),
        ],
        verbose_name=_('نوع مسئول'),
    )
    owner_id = models.UUIDField(
        null=True,
        blank=True,
        verbose_name=_('شناسه ایجادکننده'),
    )
    owner_name = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name=_('نام ایجادکننده'),
    )
    # Module info (if linked to a specific module)
    module_name = models.CharField(
        max_length=100,
        blank=True,
        null=True,
        verbose_name=_('نام ماژول'),
        db_index=True,
    )
    # Workflow info
    workflow_name = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name=_('نام فرآیند'),
    )
    workflow_instance_id = models.UUIDField(
        null=True,
        blank=True,
        verbose_name=_('شناسه نمونه فرآیند'),
    )
    # Status and priority
    status = models.CharField(
        max_length=50,
        verbose_name=_('وضعیت'),
        db_index=True,
    )
    priority = models.PositiveIntegerField(
        default=50,
        verbose_name=_('اولویت'),
        db_index=True,
    )
    # Dates
    due_date = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name=_('مهلت'),
        db_index=True,
    )
    # Tags and metadata
    tags = models.JSONField(
        default=list,
        blank=True,
        verbose_name=_('برچسب‌ها'),
    )
    # Denormalized data snapshot (for display without joins)
    display_data = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_('داده‌های نمایشی'),
        help_text=_('Subset of record data used for list views'),
    )
    # Timestamps
    created_at = models.DateTimeField(
        verbose_name=_('تاریخ ایجاد'),
        db_index=True,
    )
    updated_at = models.DateTimeField(
        verbose_name=_('تاریخ بروزرسانی'),
    )

    class Meta:
        db_table = 'worktable_task_inbox_view'
        verbose_name = _('نمایش کارتابل')
        verbose_name_plural = _('نمایش‌های کارتابل')
        ordering = ['-priority', '-updated_at']
        indexes = [
            models.Index(fields=['tenant', 'status', '-priority']),
            models.Index(fields=['tenant', 'assigned_to_id', 'status']),
            models.Index(fields=['tenant', 'table_id', 'status']),
            models.Index(fields=['tenant', 'module_name']),
            models.Index(fields=['tenant', '-created_at']),
            models.Index(fields=['due_date']),
        ]

    def __str__(self):
        return f"{self.title} ({self.status})"


class TaskArchive(TenantAwareModel):
    """
    Archive for completed/old records.
    
    Moved from the main table to keep the active tables lean
    while preserving all historical data.
    """
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )
    # Original record data
    original_record_id = models.UUIDField(
        verbose_name=_('شناسه رکورد اصلی'),
        db_index=True,
    )
    table_id = models.UUIDField(
        verbose_name=_('شناسه جدول'),
        db_index=True,
    )
    table_name = models.CharField(
        max_length=255,
        verbose_name=_('نام جدول'),
    )
    owner_id = models.UUIDField(
        null=True,
        blank=True,
        verbose_name=_('شناسه ایجادکننده'),
    )
    data = models.JSONField(
        default=dict,
        verbose_name=_('داده‌ها'),
    )
    status = models.CharField(
        max_length=50,
        verbose_name=_('وضعیت نهایی'),
    )
    workflow_state = models.JSONField(
        null=True,
        blank=True,
        verbose_name=_('وضعیت workflow'),
    )
    version = models.PositiveIntegerField(
        default=1,
        verbose_name=_('نسخه'),
    )
    # Archive metadata
    archived_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name=_('تاریخ بایگانی'),
    )
    archived_reason = models.CharField(
        max_length=50,
        choices=[
            ('auto_completed', _('تکمیل خودکار')),
            ('auto_expired', _('منقضی شده')),
            ('manual', _('دستی')),
            ('bulk', _('دسته‌ای')),
        ],
        default='manual',
        verbose_name=_('دلیل بایگانی'),
    )
    archived_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_('بایگانی‌کننده'),
    )
    # Original timestamps
    original_created_at = models.DateTimeField(
        verbose_name=_('تاریخ ایجاد اصلی'),
    )
    original_updated_at = models.DateTimeField(
        verbose_name=_('تاریخ بروزرسانی اصلی'),
    )

    class Meta:
        db_table = 'worktable_task_archive'
        verbose_name = _('بایگانی رکورد')
        verbose_name_plural = _('بایگانی رکوردها')
        ordering = ['-archived_at']
        indexes = [
            models.Index(fields=['tenant', 'table_id']),
            models.Index(fields=['original_record_id']),
            models.Index(fields=['archived_at']),
        ]

    def __str__(self):
        return f"Archive: {self.original_record_id} ({self.archived_reason})"
