from shop_management.models.base import DataRoot, models
from django.core.validators import MinValueValidator
from decimal import Decimal
from shop_management.models.data.purchase import Purchase, PurchaseItem
from shop_management.models.data.shop import Shop
class PurchaseReturn(DataRoot):
    class DocumentStatus(models.TextChoices):
        DRAFT = "DRAFT", "Draft"
        POSTED = "POSTED", "Posted"
        VOID = "VOID", "Cancelled"

    purchase = models.ForeignKey(Purchase, on_delete=models.CASCADE, related_name='returns')
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
    return_date = models.DateTimeField(auto_now_add=True)
    reason = models.TextField(blank=True, null=True)
    return_number = models.CharField(max_length=50, unique=True, null=True, blank=True)
    document_status = models.CharField(max_length=10, choices=DocumentStatus.choices, default=DocumentStatus.DRAFT)
    uses_inventory_engine = models.BooleanField(default=False)
    posted_at = models.DateTimeField(null=True, blank=True)
    posted_by = models.ForeignKey("account.User", null=True, blank=True, on_delete=models.PROTECT, related_name="purchase_returns_posted")
    voided_at = models.DateTimeField(null=True, blank=True)
    voided_by = models.ForeignKey("account.User", null=True, blank=True, on_delete=models.PROTECT, related_name="purchase_returns_voided")
    void_reason = models.TextField(blank=True)

    class Meta:
        db_table = 'purchase_returns'
        ordering = ['-created_at']

    def __str__(self):
        return f"Purchase Return #{self.id} - Purchase #{self.purchase.id}"

    @property
    def total_refund_amount(self):
        return sum(item.refund_amount for item in self.return_items.all())


class PurchaseReturnItem(DataRoot):
    purchase_return = models.ForeignKey(PurchaseReturn, on_delete=models.CASCADE, related_name='return_items')
    purchase_item = models.ForeignKey(PurchaseItem, on_delete=models.CASCADE, null=True, blank=True)
    return_quantity = models.PositiveIntegerField(validators=[MinValueValidator(1)])
    refund_amount = models.DecimalField(max_digits=10, decimal_places=2, validators=[MinValueValidator(Decimal('0.00'))])
    batch = models.ForeignKey("shop_management.InventoryBatch", null=True, blank=True, on_delete=models.PROTECT, related_name="purchase_return_items")

    class Meta:
        db_table = 'purchase_return_items'
        unique_together = ['purchase_return', 'purchase_item']

    def __str__(self):
        return f"Return Item - {self.purchase_item.product.name} x {self.return_quantity}"

    def save(self, *args, **kwargs):
        if not self.purchase_item:
            raise ValueError("Purchase item is required")
        if self.return_quantity > self.purchase_item.quantity:
            raise ValueError("Return quantity cannot exceed purchased quantity")
        super().save(*args, **kwargs)
