"""
Inventory Domain Exceptions.
"""
from shared.exceptions.base import NexaError
from shared.exceptions.business import BusinessRuleViolation


class InventoryError(NexaError):
    """خطای عمومی انبار."""
    default_code = "INVENTORY_ERROR"


class NegativeStockError(BusinessRuleViolation):
    """موجودی منفی مجاز نیست."""
    default_code = "NEGATIVE_STOCK"

    def __init__(self, item_id=None, warehouse_id=None, **kwargs):
        message = "موجودی منفی مجاز نیست"
        if item_id:
            message = f"موجودی منفی برای کالا {item_id} مجاز نیست"
        super().__init__(message=message, **kwargs)


class InsufficientStockError(BusinessRuleViolation):
    """موجودی کافی نیست."""
    default_code = "INSUFFICIENT_STOCK"


class DuplicateBatchError(BusinessRuleViolation):
    """شماره بچ تکراری."""
    default_code = "DUPLICATE_BATCH"


class DuplicateSerialError(BusinessRuleViolation):
    """شماره سریال تکراری."""
    default_code = "DUPLICATE_SERIAL"


class InvalidTransactionError(BusinessRuleViolation):
    """تراکنش نامعتبر."""
    default_code = "INVALID_TRANSACTION"


class StockFrozenError(BusinessRuleViolation):
    """موجودی در حالت freeze (شمارش فیزیکی)."""
    default_code = "STOCK_FROZEN"


class ExpiredBatchError(BusinessRuleViolation):
    """بچ منقضی شده."""
    default_code = "EXPIRED_BATCH"


class ReservationExpiredError(BusinessRuleViolation):
    """رزرو منقضی شده."""
    default_code = "RESERVATION_EXPIRED"


class CapacityExceededError(BusinessRuleViolation):
    """ظرفیت مکان تجاوز شده."""
    default_code = "CAPACITY_EXCEEDED"
