"""
HRM Event Publisher.

انتشار رویدادهای ماژول HRM به event bus پلتفرم.
"""
import logging
from datetime import datetime
from uuid import UUID, uuid4

from apps.core.event_bus.events import DomainEvent, EventBus

logger = logging.getLogger(__name__)


class HRMEventPublisher:
    """ناشر رویدادهای ماژول HRM."""

    def __init__(self):
        self._bus = EventBus()

    def publish(self, event_type: str, aggregate_id: UUID, data: dict) -> None:
        """انتشار یک رویداد."""
        event = DomainEvent(
            event_id=uuid4(),
            event_type=event_type,
            aggregate_id=aggregate_id,
            aggregate_type="hrm",
            data=data,
            occurred_at=datetime.utcnow(),
        )
        self._bus.publish(event)
        logger.info(
            "HRM published event: %s (aggregate: %s)",
            event_type,
            aggregate_id,
        )

    # ── Convenience Methods ──

    def employee_hired(self, employee_id: UUID, **data):
        self.publish("hrm.employee.hired", employee_id, data)

    def employee_terminated(self, employee_id: UUID, **data):
        self.publish("hrm.employee.terminated", employee_id, data)

    def employee_transferred(self, employee_id: UUID, **data):
        self.publish("hrm.employee.transferred", employee_id, data)

    def employee_updated(self, employee_id: UUID, **data):
        self.publish("hrm.employee.updated", employee_id, data)

    def position_created(self, position_id: UUID, **data):
        self.publish("hrm.position.created", position_id, data)

    def position_filled(self, position_id: UUID, **data):
        self.publish("hrm.position.filled", position_id, data)

    def position_vacated(self, position_id: UUID, **data):
        self.publish("hrm.position.vacated", position_id, data)

    def leave_requested(self, request_id: UUID, **data):
        self.publish("hrm.leave.requested", request_id, data)

    def leave_approved(self, request_id: UUID, **data):
        self.publish("hrm.leave.approved", request_id, data)

    def leave_rejected(self, request_id: UUID, **data):
        self.publish("hrm.leave.rejected", request_id, data)

    def leave_cancelled(self, request_id: UUID, **data):
        self.publish("hrm.leave.cancelled", request_id, data)

    def timesheet_submitted(self, timesheet_id: UUID, **data):
        self.publish("hrm.timesheet.submitted", timesheet_id, data)

    def timesheet_approved(self, timesheet_id: UUID, **data):
        self.publish("hrm.timesheet.approved", timesheet_id, data)

    def salary_changed(self, employee_id: UUID, **data):
        self.publish("hrm.salary.changed", employee_id, data)

    def attendance_recorded(self, employee_id: UUID, **data):
        self.publish("hrm.attendance.recorded", employee_id, data)

    def legal_entity_created(self, entity_id: UUID, **data):
        self.publish("hrm.legal_entity.created", entity_id, data)

    def location_created(self, location_id: UUID, **data):
        self.publish("hrm.location.created", location_id, data)
