from uuid import UUID
import logging
from app.core.module_framework.event_bus import event_bus
from app.core.postgres.base_pkg.base_client import BasePostgresClient
from app.modules.financial.application.commands import InitializeBudgetCommand, InitializeBudgetCommandHandler

logger = logging.getLogger(__name__)

def setup_project_subscribers(postgres_client: BasePostgresClient):
    """
    Hàm đăng ký lắng nghe (Subscriber) các sự kiện Integration Event từ các Module khác.
    Sẽ được gọi 1 lần khi FastAPI khởi động.
    """
    
    async def on_project_created(payload: dict):
        """
        Event Handler: Xử lý khi nhận được event ProjectCreatedIntegrationEvent từ module Projects.
        """
        logger.info(f"[Financial Module] Nhận được Event Dự án mới tạo: {payload.get('project_code')}. Đang sinh ngân sách...")
        
        command = InitializeBudgetCommand(
            project_id=UUID(payload["project_id"]),
            project_code=payload["project_code"]
        )
        
        # Inject client
        handler = InitializeBudgetCommandHandler(postgres_client)
        
        # Thực thi luồng tạo ngân sách
        try:
            handler.handle(command)
        except Exception as e:
            logger.error(f"[Financial Module] Lỗi khi tạo ngân sách từ Event: {e}")

    # Đăng ký với Event Bus
    event_bus.subscribe("ProjectCreatedIntegrationEvent", on_project_created)
    logger.info("[Financial Module] Đã đăng ký lắng nghe ProjectCreatedIntegrationEvent")
