from django.db import models
from django.utils import timezone
from django.conf import settings

from shop_management.models.base import DataRoot
from shop_management.models.data.product import Product
from shop_management.models.data.shop import Shop
from shop_management.models.data.stock import Stock
from shop_management.models.data.utils import Currency


class StockTransfer(DataRoot):
    class Status(models.TextChoices):
        PENDING = "pending", "Pending"
        ACCEPTED = "accepted", "Accepted"
        REJECTED = "rejected", "Rejected"

    transfer_id = models.CharField(max_length=32, unique=True, editable=False)
    transfer_group_id = models.CharField(max_length=64, db_index=True, blank=True, default="")
    status = models.CharField(max_length=16, choices=Status.choices, default=Status.PENDING)
    product = models.ForeignKey(
        Product, on_delete=models.PROTECT, related_name="stock_transfers"
    )
    source_stock = models.ForeignKey(
        Stock,
        on_delete=models.PROTECT,
        related_name="outgoing_stock_transfers",
        null=True,
        blank=True,
    )
    target_stock = models.ForeignKey(
        Stock,
        on_delete=models.PROTECT,
        related_name="incoming_stock_transfers",
        null=True,
        blank=True,
    )
    supplier_branch = models.ForeignKey(
        Shop, on_delete=models.PROTECT, related_name="stock_transfers_as_supplier"
    )
    customer_branch = models.ForeignKey(
        Shop, on_delete=models.PROTECT, related_name="stock_transfers_as_customer"
    )
    currency = models.ForeignKey(
        Currency,
        on_delete=models.PROTECT,
        related_name="stock_transfers",
        null=True,
        blank=True,
    )
    transfer_quantity = models.IntegerField()
    sale_price = models.DecimalField(max_digits=14, decimal_places=2, default=0)
    wholesale_price = models.DecimalField(max_digits=14, decimal_places=2, null=True, blank=True)
    retail_price = models.DecimalField(max_digits=14, decimal_places=2, null=True, blank=True)
    old_quantity = models.IntegerField()
    new_quantity = models.IntegerField()
    transfer_date = models.DateField(default=timezone.localdate)
    transfer_datetime = models.DateTimeField(auto_now_add=True)
    accepted_date = models.DateField(null=True, blank=True)
    accepted_datetime = models.DateTimeField(null=True, blank=True)
    accepted_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="stock_transfers_accepted",
    )
    show_payment_button = models.BooleanField(default=False)
    discount_amount = models.DecimalField(max_digits=14, decimal_places=2, default=0)
    notes = models.TextField(blank=True, null=True)
    source_valuation_applied = models.BooleanField(
        default=False,
        help_text="True when source branch average_buy_price was adjusted to transfer Total Amount.",
    )
    source_value_adjustment = models.DecimalField(
        max_digits=14,
        decimal_places=2,
        default=0,
        help_text="Actual source stock value removed beyond qty change (for idempotent undo).",
    )
    source_quantity_reserved = models.BooleanField(
        default=False,
        help_text="True while a pending transfer quantity is already deducted from source stock.",
    )

    class Meta:
        ordering = ["-transfer_datetime", "-id"]

    def __str__(self):
        return f"{self.transfer_id} - {self.product.name} ({self.transfer_quantity})"
