from django.db import models

from apps.core.models import TimeStampedModel


class Category(TimeStampedModel):
    """Store category (Fashion, Perfumes, etc.)."""

    name_en = models.CharField(max_length=100)
    name_ar = models.CharField(max_length=100)
    icon = models.ImageField(upload_to="categories/", null=True, blank=True)

    class Meta:
        db_table = "categories"
        verbose_name_plural = "categories"

    def __str__(self):
        return self.name_en


class PaymentMethod(models.Model):
    """Payment method (Visa, Mastercard, Apple Pay, tabby, tamara)."""

    name = models.CharField(max_length=50, unique=True)
    icon = models.ImageField(upload_to="payment_methods/", null=True, blank=True)

    class Meta:
        db_table = "payment_methods"

    def __str__(self):
        return self.name


class Store(TimeStampedModel):
    """Main store model."""

    name_en = models.CharField(max_length=200)
    name_ar = models.CharField(max_length=200, blank=True)
    logo = models.ImageField(upload_to="stores/logos/", null=True, blank=True)
    cover = models.ImageField(upload_to="stores/covers/", null=True, blank=True)
    description_en = models.TextField(blank=True)
    description_ar = models.TextField(blank=True)

    # Ratings
    rating = models.DecimalField(max_digits=3, decimal_places=2, default=0)
    rating_count = models.PositiveIntegerField(default=0)
    views = models.PositiveIntegerField(default=0)

    # Delivery
    local_delivery_days = models.PositiveSmallIntegerField(null=True, blank=True)
    intl_delivery_days = models.PositiveSmallIntegerField(null=True, blank=True)

    # Store type
    is_online = models.BooleanField(default=True)
    is_in_store = models.BooleanField(default=False)

    # Flags
    is_top = models.BooleanField(default=False, db_index=True)
    is_recommended = models.BooleanField(default=False, db_index=True)
    is_recently_added = models.BooleanField(default=False, db_index=True)
    is_trending = models.BooleanField(default=False)
    has_deals = models.BooleanField(default=False)
    supports_installments = models.BooleanField(default=False)

    # Relations
    categories = models.ManyToManyField(Category, related_name="stores", blank=True)
    payment_methods = models.ManyToManyField(PaymentMethod, related_name="stores", blank=True)

    class Meta:
        db_table = "stores"

    def __str__(self):
        return self.name_en


class StoreBranch(TimeStampedModel):
    """Physical branch of a store."""

    store = models.ForeignKey(Store, on_delete=models.CASCADE, related_name="branches")
    address = models.TextField()
    latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
    longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
    is_open = models.BooleanField(default=True)
    open_hours = models.CharField(max_length=100, blank=True)

    class Meta:
        db_table = "store_branches"
        verbose_name_plural = "store branches"

    def __str__(self):
        return f"{self.store.name_en} - {self.address[:50]}"


class StoreReview(TimeStampedModel):
    """User review for a store."""

    user = models.ForeignKey("users.User", on_delete=models.CASCADE, related_name="store_reviews")
    store = models.ForeignKey(Store, on_delete=models.CASCADE, related_name="reviews")
    rating = models.PositiveSmallIntegerField()
    title = models.CharField(max_length=200, blank=True)
    comment = models.TextField(blank=True)

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

    def __str__(self):
        return f"{self.user} → {self.store.name_en} ({self.rating}★)"
