"""Outbox dispatcher — routes IntegrationOutbox rows to per-target handlers."""

from __future__ import annotations

from django.utils import timezone

from apps.repository.documents.models import IntegrationOutbox
from apps.repository.integration import mel_feed, rep_link, smehub_search


_HANDLERS = {
    IntegrationOutbox.Target.MEL: mel_feed.deliver,
    IntegrationOutbox.Target.REP: rep_link.deliver,
    IntegrationOutbox.Target.SMEHUB: smehub_search.deliver,
}


def handle(row: IntegrationOutbox) -> None:
    handler = _HANDLERS.get(row.target)
    if not handler:
        # RIMS is a pull target (they push to us); just mark sent so the row doesn't loop.
        row.status = IntegrationOutbox.Status.SENT
        row.sent_at = timezone.now()
        row.save(update_fields=["status", "sent_at"])
        return
    handler(row)
    row.status = IntegrationOutbox.Status.SENT
    row.sent_at = timezone.now()
    row.error = ""
    row.save(update_fields=["status", "sent_at", "error"])
