"""سرویس ثبت رویداد در Outbox.

طبق الگوی Outbox، رویدادها ابتدا در همان تراکنش دیتابیس ذخیره می‌شوند و
سپس توسط worker (Celery) منتشر می‌گردند. این کار atomicity را تضمین می‌کند.
"""
from __future__ import annotations

from uuid import UUID

from sqlalchemy.ext.asyncio import AsyncSession

from app.models.events import OutboxEvent


class EventService:
    def __init__(self, session: AsyncSession) -> None:
        self.session = session

    async def record(
        self,
        *,
        event_type: str,
        aggregate_type: str,
        aggregate_id: str | None = None,
        tenant_id: UUID | None = None,
        payload: dict | None = None,
    ) -> OutboxEvent:
        """ثبت یک رویداد جدید در Outbox (بدون commit؛ در تراکنش جاری)."""
        event = OutboxEvent(
            event_type=event_type,
            aggregate_type=aggregate_type,
            aggregate_id=aggregate_id,
            tenant_id=tenant_id,
            payload=payload or {},
        )
        self.session.add(event)
        await self.session.flush()
        return event
