from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.conf import settings
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from .notification_kind import NotificationKind

# ---------------------------------------------------------------------------
# Notification
# ---------------------------------------------------------------------------
class Notification(models.Model):

    class Meta:
        verbose_name = _("Notification")
        verbose_name_plural = _("Notifications")

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True, blank=True,
        related_name="notifications"
    )
    message = models.TextField()
    kind = models.CharField(max_length=40, choices=NotificationKind.choices, default="")
    created_at = models.DateTimeField(auto_now_add=True)
    read = models.BooleanField(default=False)  # Read in WebApp
    sent = models.BooleanField(default=False)  # Sent via Mail (optional)

    # Optional relation to any object
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True, blank=True)
    object_id = models.PositiveIntegerField(null=True, blank=True)
    related_object = GenericForeignKey("content_type", "object_id")
    target_url = models.CharField(max_length=500, blank=True, null=True)

    def __str__(self):
        user_display = self.user.username if self.user else "System"
        return f"{user_display}: {self.message[:50]}..."

    def get_link(self):
        """Return URL to the related object if available."""
        if not self.related_object:
            return None
        model_name = self.content_type.model
        if model_name == "risk":
            return reverse("risks:show_risk", args=[self.object_id])
        if model_name == "control":
            return reverse("risks:show_control", args=[self.object_id])
        if model_name == "incident":
            return reverse("risks:show_incident", args=[self.object_id])
        return None