from django.conf import settings
from django.db import models
from django.utils import timezone

from shop_management.models.data.shop import Shop


class OperationalAlert(models.Model):
    class Type(models.TextChoices):
        LOW_STOCK = "LOW_STOCK", "Low stock"
        NEAR_EXPIRY = "NEAR_EXPIRY", "Near expiry"
        EXPIRED_STOCK = "EXPIRED_STOCK", "Expired stock"
        CUSTOMER_DUE = "CUSTOMER_DUE", "Customer due"
        SUPPLIER_DUE = "SUPPLIER_DUE", "Supplier due"

    class Severity(models.TextChoices):
        INFO = "INFO", "Information"
        WARNING = "WARNING", "Warning"
        CRITICAL = "CRITICAL", "Critical"

    recipient = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="operational_alerts")
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE, related_name="operational_alerts")
    alert_type = models.CharField(max_length=30, choices=Type.choices, db_index=True)
    severity = models.CharField(max_length=10, choices=Severity.choices, default=Severity.WARNING)
    title = models.CharField(max_length=255)
    message = models.TextField()
    target_model = models.CharField(max_length=100)
    target_object_id = models.CharField(max_length=100)
    target_path = models.CharField(max_length=255, blank=True)
    fingerprint = models.CharField(max_length=255, unique=True)
    extra = models.JSONField(default=dict, blank=True)
    is_read = models.BooleanField(default=False, db_index=True)
    is_active = models.BooleanField(default=True, db_index=True)
    first_detected_at = models.DateTimeField(auto_now_add=True)
    last_detected_at = models.DateTimeField(default=timezone.now)
    resolved_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        ordering = ["is_read", "-last_detected_at", "-id"]
        indexes = [models.Index(fields=["recipient", "shop", "is_active"])]

    def __str__(self):
        return f"{self.get_alert_type_display()}: {self.title}"
