"""
Audit Log Models — ثبت تمام تغییرات سیستم برای audit trail سازمانی.
"""
import uuid

from django.conf import settings
from django.db import models


class AuditAction(models.TextChoices):
    CREATE = 'create', 'Create'
    UPDATE = 'update', 'Update'
    DELETE = 'delete', 'Delete'
    LOGIN = 'login', 'Login'
    LOGOUT = 'logout', 'Logout'
    VIEW = 'view', 'View'
    EXPORT = 'export', 'Export'
    IMPORT = 'import', 'Import'
    ACCESS_DENIED = 'access_denied', 'Access Denied'
    PERMISSION_CHANGE = 'permission_change', 'Permission Change'
    ROLE_CHANGE = 'role_change', 'Role Change'
    CUSTOM = 'custom', 'Custom'


class AuditLog(models.Model):
    """
    Audit trail entry — ثبت هر تغییر قابل ردیابی.
    
    این مدل tenant-aware نیست (در public schema) چون باید از همه tenantها
    قابل دسترسی باشد.
    """

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    # Actor
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True, blank=True,
        related_name='audit_logs',
    )
    user_email = models.CharField(max_length=255, blank=True)
    user_display_name = models.CharField(max_length=255, blank=True)

    # Action
    action = models.CharField(max_length=20, choices=AuditAction.choices)

    # Target resource
    resource_type = models.CharField(max_length=100, db_index=True)
    resource_id = models.CharField(max_length=255, db_index=True)
    resource_repr = models.CharField(max_length=500, blank=True)

    # Module / context
    module = models.CharField(max_length=100, blank=True, db_index=True)

    # Changes (for update/create)
    changes = models.JSONField(
        default=dict, blank=True,
        help_text='{"field_name": {"old": "...", "new": "..."}}',
    )

    # Request metadata
    ip_address = models.GenericIPAddressField(null=True, blank=True)
    user_agent = models.TextField(blank=True)
    metadata = models.JSONField(default=dict, blank=True)

    # Tenant tracking
    tenant_schema = models.CharField(max_length=100, blank=True)

    created_at = models.DateTimeField(auto_now_add=True, db_index=True)

    class Meta:
        db_table = 'audit_logs'
        verbose_name = 'Audit Log'
        verbose_name_plural = 'Audit Logs'
        ordering = ['-created_at']
        indexes = [
            models.Index(fields=['resource_type', 'resource_id']),
            models.Index(fields=['user', 'created_at']),
            models.Index(fields=['module', 'action', 'created_at']),
        ]

    def __str__(self):
        return f"[{self.action}] {self.resource_type}:{self.resource_id} by {self.user_email}"
