import logging
from decimal import Decimal
from app.core.module_framework.event_bus import event_bus
from app.core.postgres.base_pkg.base_client import BasePostgresClient
from app.modules.inventory.application.commands import ReserveStockCommand, ReserveStockCommandHandler

logger = logging.getLogger(__name__)

def setup_inventory_subscribers(postgres_client: BasePostgresClient):
    
    async def on_takeoff_approved(payload: dict):
        """
        Xử lý khi bóc tách khối lượng (Takeoff) được phê duyệt.
        Sẽ tự động gửi yêu cầu giữ chỗ (Reserve) vật tư trong kho.
        """
        material_code = payload.get("material_code")
        quantity = payload.get("quantity")
        
        if not material_code or not quantity:
            return
            
        logger.info(f"[Inventory Module] Nhận được TakeoffApproved event. Đang giữ chỗ {quantity} cho {material_code}...")
        
        command = ReserveStockCommand(
            material_code=material_code,
            warehouse_id="MAIN", # Giả định kho chính
            quantity=Decimal(str(quantity))
        )
        
        handler = ReserveStockCommandHandler(postgres_client)
        
        try:
            handler.handle(command)
        except Exception as e:
            logger.error(f"[Inventory Module] Lỗi khi giữ chỗ vật tư: {e}")

    event_bus.subscribe("TakeoffApprovedIntegrationEvent", on_takeoff_approved)
    logger.info("[Inventory Module] Đã đăng ký lắng nghe TakeoffApprovedIntegrationEvent")
