from django.db import models
from django.utils import timezone
from django.urls import reverse
from django.utils.text import slugify
from django.conf import settings
from decimal import Decimal, ROUND_HALF_UP  # ⚠️ ROUND_HALF_UP اضافه شد
from django.contrib.contenttypes.fields import GenericRelation
from django.db.models import Avg

# ================================
# Product Category
# ================================
class ProductCategory(models.Model):
    title = models.CharField(max_length=300, db_index=True, verbose_name="عنوان")
    url_title = models.SlugField(max_length=300, db_index=True, verbose_name="عنوان در URL")
    is_active = models.BooleanField(default=True, verbose_name='فعال/غیرفعال')
    is_delete = models.BooleanField(default=False, verbose_name='حذف شده/نشده')
    icon = models.ImageField(upload_to='category_icons/', blank=True, null=True)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'دسته بندی'
        verbose_name_plural = 'دسته بندی ها'


# ================================
# Sub Category
# ================================
class SubCategory(models.Model):
    category = models.ForeignKey(
        ProductCategory,
        on_delete=models.CASCADE,
        related_name="subcategories",
        verbose_name="دسته اصلی"
    )

    title = models.CharField(max_length=200, default="Unknown", verbose_name="عنوان زیر دسته")

    url_title = models.SlugField(
        max_length=120,
        unique=True,
        verbose_name="اسلاگ / URL"
    )

    is_active = models.BooleanField(default=True, verbose_name="فعال / غیرفعال")

    ordering = models.IntegerField(default=0, verbose_name="ترتیب نمایش")

    created_at = models.DateTimeField(default=timezone.now, verbose_name="تاریخ ایجاد")

    def __str__(self):
        return f"{self.category} → {self.title}"

    class Meta:
        verbose_name = "زیر دسته"
        verbose_name_plural = "زیردسته‌ها"
        ordering = ['ordering']


# ================================
# Brand
# ================================
class ProductBrand(models.Model):
    title = models.CharField(max_length=300, db_index=True, verbose_name='برند')

    url_title = models.SlugField(
        max_length=200,
        db_index=True,
        unique=True,
        verbose_name='نام در URL'
    )

    is_active = models.BooleanField(
        default=True,
        verbose_name='فعال/غیرفعال'
    )

    subcategory = models.ForeignKey(
        SubCategory,
        on_delete=models.CASCADE,
        related_name='brands',
        null=True,
        blank=True
    )

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'برند'
        verbose_name_plural = 'برندها'


# ================================
# Product
# ================================
class Product(models.Model):
    class ConditionType(models.TextChoices):
        NEW = 'new', 'نو'
        STOCK = 'stock', 'استوک'
        
    title = models.CharField(max_length=300, verbose_name='نام محصول')

    category = models.ManyToManyField(
        ProductCategory,
        related_name='products',
        verbose_name='دسته بندی ها'
    )

    subcategory = models.ForeignKey(
        SubCategory,
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        verbose_name='زیردسته'
    )

    image = models.ImageField(upload_to='images/products', null=True, blank=True, verbose_name='تصویر محصول')
    
    brand = models.ForeignKey(
        ProductBrand,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='products',
        verbose_name='برند'
    )

    slug = models.SlugField(max_length=200, unique=True, blank=True, verbose_name='عنوان در URL')

    # price قیمت نهایی و قابل پرداخت است
    price = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='قیمت')

    # price_before_discount قیمت بدون اعمال تخفیف است
    price_before_discount = models.DecimalField(
        max_digits=15,
        decimal_places=2,
        null=True,
        blank=True,
        verbose_name='قیمت قبل از تخفیف'
    )
    weight = models.PositiveIntegerField(help_text="Weight in grams", default=0)

    discount_percent = models.PositiveIntegerField(default=0, verbose_name='درصد تخفیف')

    is_flash_offer = models.BooleanField(default=False, verbose_name='پیشنهاد لحظه‌ای')

    is_amazing_offer = models.BooleanField(default=False, verbose_name='پیشنهاد شگفت انگیز')

    offer_end = models.DateTimeField(null=True, blank=True)

    sales_count = models.PositiveIntegerField(default=0, verbose_name='تعداد فروش')

    short_description = models.CharField(
        max_length=600,
        null=True,
        blank=True,
        db_index=True,
        verbose_name='توضیحات کوتاه'
    )

    stock = models.PositiveIntegerField(default=0)
    
    condition = models.CharField(
        max_length=10,
        choices=ConditionType.choices,
        default=ConditionType.NEW,
        verbose_name='وضعیت محصول'
    )
    
    description = models.TextField(db_index=True, verbose_name='توضیحات اصلی')

    is_active = models.BooleanField(default=True, verbose_name='فعال/غیرفعال')
    
    colors = models.ManyToManyField('Color', related_name='products', blank=True, verbose_name='رنگ‌ها')
    
    is_delete = models.BooleanField(default=False, verbose_name='حذف شده/نشده')

    created_at = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return f"{self.title} - {self.price}"

    class Meta:
        verbose_name = 'محصول'
        verbose_name_plural = 'محصولات'
        ordering = ['-created_at']

    def get_absolute_url(self):
        return reverse('product:product-detail', args=[self.slug])

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)

        # محاسبه خودکار درصد تخفیف بر اساس قیمت‌ها
        if self.price_before_discount and self.price_before_discount > self.price:
            diff = self.price_before_discount - self.price
            pct = (diff * Decimal("100")) / self.price_before_discount
            self.discount_percent = int(pct.quantize(Decimal("0"), rounding=ROUND_HALF_UP))
        else:
            self.discount_percent = 0

        super().save(*args, **kwargs)
        
    def average_rating(self):
        return self.comments.filter(
            is_active=True
        ).aggregate(avg=Avg('rating'))['avg'] or 0    

    # ✅ قیمت نهایی (سازگاری با بخش‌های قدیمی که به اشتباه از discounted_price استفاده می‌کردند)
    @property
    def discounted_price(self):
        return self.price

    # ✅ قیمت خط‌خورده/پایه (استفاده در قالب‌ها)
    @property
    def original_price(self):
        return self.price_before_discount if self.price_before_discount else self.price


# ================================
# Product Tag
# ================================
class ProductTag(models.Model):
    caption = models.CharField(max_length=300, db_index=True, verbose_name="عنوان")
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='tags')

    def __str__(self):
        return self.caption

    class Meta:
        verbose_name = 'تگ محصول'
        verbose_name_plural = 'تگ های محصولات'


# ================================
# Product Visit
# ================================
class ProductVisit(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='visits')
    ip = models.CharField(max_length=300, verbose_name='آی پی کاربر')
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True)

    def __str__(self):
        return f'{self.product.title}/{self.ip}'

    class Meta:
        verbose_name = 'بازدید محصول'
        verbose_name_plural = 'بازدیدهای محصول'


# ================================
# Product Gallery
# ================================
class ProductGallery(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='gallery')
    image = models.ImageField(upload_to='images/product_gallery')

    def __str__(self):
        return self.product.title

    class Meta:
        verbose_name = 'تصویر گالری'
        verbose_name_plural = 'گالری تصاویر'


# ================================
# Product Specification Group
# ================================
class ProductSpecGroup(models.Model):
    title = models.CharField(max_length=200, verbose_name="نام گروه مشخصات")
    product = models.ForeignKey(
        Product, 
        on_delete=models.CASCADE, 
        related_name='spec_groups', 
        verbose_name="محصول",
        null=True,
        blank=True
    )

    def __str__(self):
        return f"{self.product.title} - {self.title}"

    class Meta:
        verbose_name = "گروه مشخصات فنی"
        verbose_name_plural = "گروه‌های مشخصات فنی"


# ================================
# Product Specification Item
# ================================
class ProductSpecItem(models.Model):
    group = models.ForeignKey(
        ProductSpecGroup, 
        on_delete=models.CASCADE, 
        related_name='items', 
        verbose_name="گروه"
    )
    key = models.CharField(max_length=255, verbose_name="عنوان ویژگی")
    value = models.CharField(max_length=500, verbose_name="مقدار ویژگی")

    def __str__(self):
        return f"{self.key}: {self.value}"

    class Meta:
        verbose_name = "آیتم مشخصات فنی"
        verbose_name_plural = "آیتم‌های مشخصات فنی"
        
        
# ================================
# Product Comment
# ================================
class ProductComment(models.Model):
    product = models.ForeignKey(
        "product_module.Product",
        on_delete=models.CASCADE,
        related_name="comments",
        verbose_name="محصول"
    )
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        verbose_name="کاربر"
    )
    text = models.TextField(verbose_name="متن نظر")
    rating = models.PositiveSmallIntegerField(default=5, verbose_name="امتیاز")
    parent = models.ForeignKey(
        "self",
        null=True,
        blank=True,
        on_delete=models.CASCADE,
        related_name="replies",
        verbose_name="پاسخ"
    )
    is_active = models.BooleanField(default=False, verbose_name="تایید شده")
    create_date = models.DateTimeField(auto_now_add=True, verbose_name="تاریخ ثبت")

    class Meta:
        verbose_name = "نظر محصول"
        verbose_name_plural = "نظرات محصولات"
        ordering = ["-create_date"]

    def __str__(self):
        return f"{self.user} - {self.product}"


# ================================
# Color
# ================================
class Color(models.Model):
    name = models.CharField(max_length=50, verbose_name="نام رنگ")
    slug = models.SlugField(unique=True, verbose_name="اسلاگ")
    hex_code = models.CharField(max_length=7, verbose_name="کد رنگ", help_text="#ffffff")
    is_active = models.BooleanField(default=True, verbose_name="فعال")

    def __str__(self):
        return self.name
