# orders/models.py - سیستم کامل سفارش و پرداخت
import random
import string
from django.db import models
from django.conf import settings  # ✅ تغییر مهم
from django.utils import timezone
from shop.models import Product

def generate_order_number():
    """تولید شماره سفارش منحصر بفرد"""
    date_part = timezone.now().strftime('%Y%m%d')
    random_part = ''.join(random.choices(string.digits, k=6))
    return f'ORD-{date_part}-{random_part}'

class Order(models.Model):
    STATUS_CHOICES = [
        ('pending', '🔄 در انتظار پرداخت'),
        ('paid', '✅ پرداخت شده'),
        ('processing', '⚙️ در حال پردازش'),
        ('shipped', '🚚 ارسال شده'),
        ('delivered', '🎉 تحویل داده شده'),
        ('cancelled', '❌ لغو شده'),
    ]
    
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="کاربر", related_name='orders')  # ✅ تغییر
    order_number = models.CharField(max_length=50, unique=True, verbose_name="شماره سفارش", default=generate_order_number)
    total_price = models.IntegerField(verbose_name="مبلغ کل (تومان)", default=0)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name="وضعیت")
    
    # اطلاعات مشتری
    full_name = models.CharField(max_length=200, verbose_name="نام و نام خانوادگی")
    phone = models.CharField(max_length=15, verbose_name="تلفن همراه")
    email = models.EmailField(verbose_name="ایمیل", blank=True)
    shipping_address = models.TextField(verbose_name="آدرس کامل ارسال")
    postal_code = models.CharField(max_length=10, verbose_name="کد پستی")
    city = models.CharField(max_length=100, verbose_name="شهر")
    province = models.CharField(max_length=100, verbose_name="استان")
    
    # اطلاعات سفارش
    notes = models.TextField(verbose_name="یادداشت‌های سفارش", blank=True)
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="تاریخ سفارش")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="آخرین بروزرسانی")
    payment_date = models.DateTimeField(null=True, blank=True, verbose_name="تاریخ پرداخت")
    delivery_date = models.DateTimeField(null=True, blank=True, verbose_name="تاریخ تحویل")
    
    class Meta:
        verbose_name = "سفارش"
        verbose_name_plural = "سفارش‌ها"
        ordering = ['-created_at']
    
    def __str__(self):
        return f"{self.order_number} - {self.full_name}"
    
    def save(self, *args, **kwargs):
        if not self.order_number:
            self.order_number = generate_order_number()
        super().save(*args, **kwargs)
    
    def get_status_display_with_icon(self):
        """نمایش وضعیت با آیکون"""
        status_dict = dict(self.STATUS_CHOICES)
        return status_dict.get(self.status, self.status)

class OrderItem(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items', verbose_name="سفارش")
    product = models.ForeignKey(Product, on_delete=models.PROTECT, verbose_name="محصول")
    quantity = models.PositiveIntegerField(default=1, verbose_name="تعداد")
    price = models.IntegerField(verbose_name="قیمت واحد (تومان)")
    
    class Meta:
        verbose_name = "آیتم سفارش"
        verbose_name_plural = "آیتم‌های سفارش"
    
    def __str__(self):
        return f"{self.quantity} × {self.product.name}"
    
    def get_total_price(self):
        return self.price * self.quantity

class Payment(models.Model):
    STATUS_CHOICES = [
        ('pending', 'در انتظار'),
        ('success', 'موفق'),
        ('failed', 'ناموفق'),
        ('cancelled', 'لغو شده'),
    ]
    
    GATEWAY_CHOICES = [
        ('zarinpal', 'زرین‌پال'),
        ('idpay', 'آیدی پی'),
        ('manual', 'دستی'),
        ('other', 'سایر'),
    ]
    
    order = models.OneToOneField(Order, on_delete=models.CASCADE, related_name='payment', verbose_name="سفارش")
    amount = models.IntegerField(verbose_name="مبلغ (تومان)")
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name="وضعیت")
    gateway = models.CharField(max_length=20, choices=GATEWAY_CHOICES, default='zarinpal', verbose_name="درگاه پرداخت")
    
    # اطلاعات تراکنش
    authority = models.CharField(max_length=255, blank=True, verbose_name="Authority کد")
    ref_id = models.CharField(max_length=255, blank=True, verbose_name="Ref ID")
    transaction_id = models.CharField(max_length=255, blank=True, verbose_name="شناسه تراکنش")
    
    # اطلاعات اضافی
    description = models.TextField(blank=True, verbose_name="توضیحات تراکنش")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="تاریخ ایجاد")
    paid_at = models.DateTimeField(null=True, blank=True, verbose_name="تاریخ پرداخت")
    
    # برای ذخیره پاسخ درگاه
    gateway_response = models.JSONField(null=True, blank=True, verbose_name="پاسخ درگاه")
    
    class Meta:
        verbose_name = "پرداخت"
        verbose_name_plural = "پرداخت‌ها"
    
    def __str__(self):
        return f"پرداخت {self.order.order_number} - {self.get_status_display()}"
    
    def is_successful(self):
        return self.status == 'success'
    
    def mark_as_paid(self, ref_id=None, transaction_id=None):
        """علامت‌گذاری پرداخت به عنوان موفق"""
        self.status = 'success'
        self.ref_id = ref_id or self.ref_id
        self.transaction_id = transaction_id or self.transaction_id
        self.paid_at = timezone.now()
        self.save()
        
        # آپدیت وضعیت سفارش
        self.order.status = 'paid'
        self.order.payment_date = self.paid_at
        self.order.save()

class Shipping(models.Model):
    """مدل اطلاعات حمل و نقل"""
    METHOD_CHOICES = [
        ('post', 'پست پیشتاز'),
        ('tipax', 'تیپاکس'),
        ('snap', 'اسنپ‌باکس'),
        ('alopeyk', 'آلوپیک'),
        ('custom', 'پیک اختصاصی'),
    ]
    
    order = models.OneToOneField(Order, on_delete=models.CASCADE, related_name='shipping', verbose_name="سفارش")
    method = models.CharField(max_length=20, choices=METHOD_CHOICES, default='post', verbose_name="روش ارسال")
    tracking_code = models.CharField(max_length=100, blank=True, verbose_name="کد رهگیری")
    shipping_cost = models.IntegerField(default=0, verbose_name="هزینه ارسال (تومان)")
    estimated_delivery = models.DateField(verbose_name="تاریخ تخمینی تحویل")
    shipped_at = models.DateTimeField(null=True, blank=True, verbose_name="تاریخ ارسال")
    delivered_at = models.DateTimeField(null=True, blank=True, verbose_name="تاریخ تحویل واقعی")
    
    # اطلاعات پیک
    courier_name = models.CharField(max_length=100, blank=True, verbose_name="نام پیک")
    courier_phone = models.CharField(max_length=15, blank=True, verbose_name="تلفن پیک")
    
    class Meta:
        verbose_name = "حمل و نقل"
        verbose_name_plural = "حمل و نقل‌ها"
    
    def __str__(self):
        return f"حمل و نقل {self.order.order_number}"
    
    def mark_as_shipped(self, tracking_code=None):
        """علامت‌گذاری به عنوان ارسال شده"""
        self.shipped_at = timezone.now()
        self.tracking_code = tracking_code or self.tracking_code
        self.save()
        
        # آپدیت وضعیت سفارش
        self.order.status = 'shipped'
        self.order.save()
    
    def mark_as_delivered(self):
        """علامت‌گذاری به عنوان تحویل داده شده"""
        self.delivered_at = timezone.now()
        self.save()
        
        # آپدیت وضعیت سفارش
        self.order.status = 'delivered'
        self.order.delivery_date = self.delivered_at
        self.order.save()