from django.db import models
from shop_management.models.base import DataRoot
from shop_management.models.data.shop import Shop
from shop_management.models.data.sale import Sale, SaleItem

class SaleReturn(DataRoot):
    class DocumentStatus(models.TextChoices):
        DRAFT = "DRAFT", "Draft"
        POSTED = "POSTED", "Posted"
        VOID = "VOID", "Cancelled"

    shop = models.ForeignKey(Shop, on_delete=models.CASCADE, related_name='sale_returns')
    sale = models.ForeignKey(Sale, on_delete=models.CASCADE, related_name='sale_returns')
    return_date = models.DateTimeField(auto_now_add=True)
    reason = models.TextField(null=True, blank=True)
    total_refound_amount = models.DecimalField(max_digits=12, decimal_places=2, default=0)
    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)
    refund_account = models.ForeignKey("shop_management.Account", null=True, blank=True, on_delete=models.PROTECT, related_name="sale_return_refunds")
    cash_refund_amount = models.DecimalField(max_digits=18, decimal_places=2, default=0)
    posted_at = models.DateTimeField(null=True, blank=True)
    posted_by = models.ForeignKey("account.User", null=True, blank=True, on_delete=models.PROTECT, related_name="sale_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="sale_returns_voided")
    void_reason = models.TextField(blank=True)
    
    def __str__(self):
        return f"Return for Sale ID {self.sale.id}"

class SaleReturnItem(DataRoot):
    sale_return = models.ForeignKey(SaleReturn, on_delete=models.CASCADE, related_name='return_items')
    sale_item = models.ForeignKey(SaleItem, on_delete=models.SET_NULL, null=True, blank=True, related_name='return_items')
    return_quantity = models.PositiveIntegerField()
    refund_amount = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

    def __str__(self):
        product_name = self.sale_item.product.name if self.sale_item and self.sale_item.product else "Unknown Product"
        return f"{self.return_quantity} x {product_name}"
    
    @property
    def calculated_refund_amount(self):
        if self.refund_amount is not None:
            return self.refund_amount
        if self.sale_item and self.sale_item.sale_price:
            return self.sale_item.sale_price * self.return_quantity
        return 0


class SaleReturnItemBatchRestoration(DataRoot):
    return_item = models.ForeignKey(SaleReturnItem, on_delete=models.PROTECT, related_name="batch_restorations")
    batch = models.ForeignKey("shop_management.InventoryBatch", on_delete=models.PROTECT, related_name="sale_return_restorations")
    quantity = models.DecimalField(max_digits=18, decimal_places=4)
    unit_cost = models.DecimalField(max_digits=18, decimal_places=6)

    class Meta:
        constraints = [models.UniqueConstraint(fields=["return_item", "batch"], name="unique_return_item_batch")]
