from django.db import models

from shop_management.models.base import DataRoot


class WarehouseTransfer(DataRoot):
    class Status(models.TextChoices):
        DRAFT = "DRAFT", "Draft"
        DISPATCHED = "DISPATCHED", "Dispatched"
        RECEIVED = "RECEIVED", "Received"
        VOID = "VOID", "Cancelled"

    transfer_number = models.CharField(max_length=50, unique=True, null=True, blank=True)
    shop = models.ForeignKey("shop_management.Shop", on_delete=models.PROTECT, related_name="warehouse_transfer_documents")
    source_warehouse = models.ForeignKey("shop_management.Warehouse", on_delete=models.PROTECT, related_name="outgoing_transfer_documents")
    destination_warehouse = models.ForeignKey("shop_management.Warehouse", on_delete=models.PROTECT, related_name="incoming_transfer_documents")
    transfer_date = models.DateField()
    status = models.CharField(max_length=12, choices=Status.choices, default=Status.DRAFT)
    notes = models.TextField(blank=True)
    dispatched_at = models.DateTimeField(null=True, blank=True)
    dispatched_by = models.ForeignKey("account.User", null=True, blank=True, on_delete=models.PROTECT, related_name="warehouse_transfers_dispatched")
    received_at = models.DateTimeField(null=True, blank=True)
    received_by = models.ForeignKey("account.User", null=True, blank=True, on_delete=models.PROTECT, related_name="warehouse_transfers_received")
    voided_at = models.DateTimeField(null=True, blank=True)
    voided_by = models.ForeignKey("account.User", null=True, blank=True, on_delete=models.PROTECT, related_name="warehouse_transfers_voided")
    void_reason = models.TextField(blank=True)

    class Meta:
        ordering = ["-transfer_date", "-id"]


class WarehouseTransferItem(DataRoot):
    transfer = models.ForeignKey(WarehouseTransfer, on_delete=models.CASCADE, related_name="items")
    product = models.ForeignKey("shop_management.Product", on_delete=models.PROTECT)
    batch = models.ForeignKey("shop_management.InventoryBatch", on_delete=models.PROTECT)
    quantity = models.DecimalField(max_digits=18, decimal_places=4)
    unit_cost_snapshot = models.DecimalField(max_digits=18, decimal_places=6, default=0)
    cost_currency = models.ForeignKey("shop_management.Currency", null=True, blank=True, on_delete=models.PROTECT)

    class Meta:
        constraints = [models.UniqueConstraint(fields=["transfer", "product", "batch"], name="unique_warehouse_transfer_batch")]
