"""
Workflow State Persistence Models.

Models for workflow execution logging, snapshots, and replay support.
"""
import uuid

from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _


# =============================================================================
# Enums
# =============================================================================

class ExecutionLogEventType(models.TextChoices):
    """Workflow execution log event types."""
    STARTED = 'started', _('شروع شد')
    STEP_STARTED = 'step_started', _('گام شروع شد')
    STEP_COMPLETED = 'step_completed', _('گام تکمیل شد')
    STEP_FAILED = 'step_failed', _('گام با خطا مواجه شد')
    STEP_SKIPPED = 'step_skipped', _('گام رد شد')
    VARIABLE_SET = 'variable_set', _('متغیر تنظیم شد')
    VARIABLE_CHANGED = 'variable_changed', _('متغیر تغییر کرد')
    TASK_CREATED = 'task_created', _('وظیفه ایجاد شد')
    TASK_COMPLETED = 'task_completed', _('وظیفه تکمیل شد')
    TASK_FAILED = 'task_failed', _('وظیفه با خطا مواجه شد')
    GATEWAY_EVALUATED = 'gateway_evaluated', _('Gateway ارزیابی شد')
    TIMER_FIRED = 'timer_fired', _('تایمر فعال شد')
    EVENT_RECEIVED = 'event_received', _('رویداد دریافت شد')
    EVENT_SENT = 'event_sent', _('رویداد ارسال شد')
    STATE_CHANGED = 'state_changed', _('وضعیت تغییر کرد')
    PAUSED = 'paused', _('متوقف شد')
    RESUMED = 'resumed', _('ادامه یافت')
    COMPLETED = 'completed', _('تکمیل شد')
    FAILED = 'failed', _('با خطا مواجه شد')
    CANCELLED = 'cancelled', _('لغو شد')
    SNAPSHOT_CREATED = 'snapshot_created', _('اسنپ‌شات ایجاد شد')
    SNAPSHOT_RESTORED = 'snapshot_restored', _('اسنپ‌شات بازیابی شد')


class SnapshotReason(models.TextChoices):
    """Reason for creating a snapshot."""
    MANUAL = 'manual', _('دستی')
    AUTO = 'auto', _('خودکار')
    BEFORE_CRITICAL_STEP = 'before_critical_step', _('قبل از گام بحرانی')
    PERIODIC = 'periodic', _('دوره‌ای')
    BEFORE_COMPENSATION = 'before_compensation', _('قبل از جبران')
    PRE_MIGRATION = 'pre_migration', _('قبل از مهاجرت')


# =============================================================================
# Models
# =============================================================================

class WorkflowExecutionLog(models.Model):
    """
    Detailed event log for workflow execution.
    
    Records every significant event during workflow execution for
    full replay capability and detailed auditing. This extends
    the existing ProcessHistory model with richer event data.
    """
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )
    execution = models.ForeignKey(
        'workflow.ProcessInstance',
        on_delete=models.CASCADE,
        related_name='execution_logs',
        verbose_name=_('اجرای فرآیند'),
    )
    event_type = models.CharField(
        max_length=50,
        choices=ExecutionLogEventType.choices,
        verbose_name=_('نوع رویداد'),
    )
    step_id = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name=_('شناسه گام'),
        help_text=_('شناسه element در BPMN'),
    )
    sequence_number = models.PositiveIntegerField(
        verbose_name=_('شماره ترتیب'),
        help_text=_('شماره ترتیب رویداد در اجرا'),
    )
    payload = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_('داده رویداد'),
        help_text=_('اطلاعات دقیق رویداد'),
    )
    state_before = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_('وضعیت قبل'),
        help_text=_('وضعیت workflow قبل از رویداد'),
    )
    state_after = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_('وضعیت بعد'),
        help_text=_('وضعیت workflow بعد از رویداد'),
    )
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_('کاربر'),
    )
    duration_ms = models.PositiveIntegerField(
        null=True,
        blank=True,
        verbose_name=_('مدت (میلی‌ثانیه)'),
    )
    error_message = models.TextField(
        blank=True,
        null=True,
        verbose_name=_('پیام خطا'),
    )
    metadata = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_('متادیتا'),
    )
    timestamp = models.DateTimeField(
        auto_now_add=True,
        verbose_name=_('زمان'),
    )

    class Meta:
        db_table = 'workflow_execution_log'
        verbose_name = _('لاگ اجرای فرآیند')
        verbose_name_plural = _('لاگ‌های اجرای فرآیند')
        ordering = ['sequence_number']
        indexes = [
            models.Index(fields=['execution', 'sequence_number']),
            models.Index(fields=['execution', 'event_type']),
            models.Index(fields=['timestamp']),
        ]
        unique_together = ['execution', 'sequence_number']

    def __str__(self):
        return f"#{self.sequence_number} {self.get_event_type_display()}"


class WorkflowSnapshot(models.Model):
    """
    Complete state snapshot of a workflow execution.
    
    Used for:
    - Restoring workflow to a previous state
    - Debugging and audit
    - Migration and export
    - Replay from a known point
    """
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )
    execution = models.ForeignKey(
        'workflow.ProcessInstance',
        on_delete=models.CASCADE,
        related_name='snapshots',
        verbose_name=_('اجرای فرآیند'),
    )
    state_data = models.JSONField(
        verbose_name=_('داده وضعیت'),
        help_text=_('اسنپ‌شات کامل از وضعیت workflow'),
    )
    variables_data = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_('متغیرها'),
        help_text=_('تمام متغیرهای workflow در لحظه اسنپ‌شات'),
    )
    tasks_data = models.JSONField(
        default=list,
        blank=True,
        verbose_name=_('وظایف'),
        help_text=_('وضعیت تمام وظایف در لحظه اسنپ‌شات'),
    )
    snapshot_reason = models.CharField(
        max_length=30,
        choices=SnapshotReason.choices,
        default=SnapshotReason.MANUAL,
        verbose_name=_('دلیل اسنپ‌شات'),
    )
    description = models.TextField(
        blank=True,
        null=True,
        verbose_name=_('توضیحات'),
    )
    last_event_sequence = models.PositiveIntegerField(
        default=0,
        verbose_name=_('آخرین شماره رویداد'),
        help_text=_('شماره ترتیب آخرین رویداد در لحظه اسنپ‌شات'),
    )
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_('ایجادکننده'),
    )
    created_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name=_('تاریخ ایجاد'),
    )

    class Meta:
        db_table = 'workflow_snapshot'
        verbose_name = _('اسنپ‌شات فرآیند')
        verbose_name_plural = _('اسنپ‌شات‌های فرآیند')
        ordering = ['-created_at']
        indexes = [
            models.Index(fields=['execution', 'created_at']),
            models.Index(fields=['snapshot_reason']),
        ]

    def __str__(self):
        return f"Snapshot {self.id} ({self.get_snapshot_reason_display()}) - {self.created_at}"
