from django.db import models

from apps.core.models import TimeStampedModel


class Favorite(TimeStampedModel):
    """User's saved/favorite store."""

    user = models.ForeignKey("users.User", on_delete=models.CASCADE, related_name="favorites")
    store = models.ForeignKey("stores.Store", on_delete=models.CASCADE, related_name="favorited_by")

    class Meta:
        db_table = "favorites"
        unique_together = ["user", "store"]

    def __str__(self):
        return f"{self.user} ♥ {self.store}"


class RecentlyViewed(TimeStampedModel):
    """Tracks stores a user has recently viewed."""

    user = models.ForeignKey("users.User", on_delete=models.CASCADE, related_name="recently_viewed")
    store = models.ForeignKey("stores.Store", on_delete=models.CASCADE)
    viewed_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "recently_viewed"
        unique_together = ["user", "store"]
        ordering = ["-viewed_at"]


class Coupon(TimeStampedModel):
    """Discount coupon."""

    code = models.CharField(max_length=50, unique=True)
    discount_percent = models.PositiveSmallIntegerField(null=True, blank=True)
    discount_amount = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    valid_from = models.DateTimeField()
    valid_until = models.DateTimeField()
    store = models.ForeignKey(
        "stores.Store", on_delete=models.CASCADE, null=True, blank=True, related_name="coupons"
    )
    is_active = models.BooleanField(default=True)

    class Meta:
        db_table = "coupons"

    def __str__(self):
        return self.code


class UserCoupon(TimeStampedModel):
    """Tracks coupon usage by users."""

    user = models.ForeignKey("users.User", on_delete=models.CASCADE, related_name="user_coupons")
    coupon = models.ForeignKey(Coupon, on_delete=models.CASCADE, related_name="user_coupons")
    is_used = models.BooleanField(default=False)

    class Meta:
        db_table = "user_coupons"
        unique_together = ["user", "coupon"]


class Notification(TimeStampedModel):
    """User notification."""

    NOTIFICATION_TYPES = [
        ("general", "General"),
        ("offer", "Offer"),
        ("event", "Event"),
        ("referral", "Referral"),
    ]

    user = models.ForeignKey("users.User", on_delete=models.CASCADE, related_name="notifications")
    title = models.CharField(max_length=200)
    body = models.TextField()
    type = models.CharField(max_length=20, choices=NOTIFICATION_TYPES, default="general")
    is_read = models.BooleanField(default=False)

    class Meta:
        db_table = "notifications"
        ordering = ["-created_at"]

    def __str__(self):
        return f"{self.user} - {self.title}"
